@ledgerhq/revault-api 1.33.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/fakes.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/zod-utils.ts","../src/types/operation.ts","../src/types/common.ts","../src/errors.ts","../src/sync-utils.ts","../src/utils.ts","../src/hsm/types.ts","../src/transactions/types.ts","../src/transactions/request-data.ts","../src/accounts/clients/types.ts","../src/accounts/account-asset-fields.ts","../src/governance/review-config.ts","../src/prisma-utils/policy.ts","../src/prisma-utils/review-config.ts","../src/governance/request-data.ts","../src/workspaces/utils.ts","../src/tradelink/types.ts","../src/tradelink/request-data.ts","../src/accounts/account-governance-fields.ts","../src/accounts/account-staking-fields.ts","../src/accounts/types.ts","../src/accounts/app-types.ts","../src/whitelists/db-types.ts","../src/whitelists/whitelist-requests.ts","../src/policies/db-utils.ts","../src/policies/request-data.ts","../src/accounts/request-data.ts","../src/accounts/app-utils.ts","../src/accounts/sci/request-data.ts","../src/workflows/types.ts","../src/users/types.ts","../src/users/request-data.ts","../src/groups/request-data.ts","../src/api-keys/api-key-requests.ts","../src/entities/entity-requests.ts","../src/governance/workspace-rule-requests.ts","../src/requests/request-data.ts","../src/requests/app-types.ts","../src/requests/utils.ts","../src/requests/app-utils/index.ts","../src/__fakes__/faker-utils.ts","../src/__fakes__/models/sync-id-utils.ts","../src/__fakes__/models/accounts.ts","../src/__fakes__/models/requests/requests-and-reviews.ts","../src/__fakes__/responses.ts"],"names":["z","AccountType","ActivationStatus","zCurrency","AccountGovernanceType","PsdModel","omit","RequestType","RequestState","faker","times","RequestReviewStatus","ChallengeType"],"mappings":"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","file":"fakes.mjs","sourcesContent":["import { z } from \"zod\";\n\nexport const zHexString = z.string().regex(/^[0-9a-fA-F]+$/);\n\nexport const zIntString = z\n .string()\n .nonempty()\n .regex(/^(-?[1-9]\\d*|0)$/);\n\nexport const zUnsignedIntString = z\n .string()\n .nonempty()\n .regex(/^([1-9]\\d*|0)$/);\n\nexport const zCurrency = z.string().nonempty().max(40).regex(/^\\w+$/).describe(\"Currency\");\n\nexport const zHsmObjectId = z\n .string()\n .regex(/^[\\w-]+$/) // TODO: what is the exact format of an HSM ID?\n .min(1);\n\nexport type HsmObjectId = z.infer<typeof zHsmObjectId>;\n","import { z } from \"zod\";\n\nimport type { TypeEquals } from \"@/type-utils\";\nimport { zCurrency, zUnsignedIntString } from \"@/zod-utils\";\n\n// #region ---------- Operation by type -----------------------------------------------------------\n\nconst zValueTransactionOperationType = z.enum([\n \"SEND\",\n \"STAKE\",\n \"DEPLOY_CONTRACT\",\n \"EXECUTE_CONTRACT\",\n \"ACTIVATE_TOKEN\",\n]);\n\nexport const zValueTransactionOperation = z.object({\n type: zValueTransactionOperationType,\n currency: zCurrency,\n recipient: z.string().nonempty(),\n destinationTag: z.string().nonempty().optional(),\n value: zUnsignedIntString,\n});\n\nexport type ValueTransactionOperation = z.infer<typeof zValueTransactionOperation>;\n\nconst zSigningOperationType = z.enum([\"SIGN_MESSAGE\", \"SIGN_DIGESTS\"]);\n\nexport const zSigningOperation = z.object({\n type: zSigningOperationType,\n});\n\nexport type SigningOperation = z.infer<typeof zSigningOperation>;\n\n// #endregion\n\n// #region ---------- Operation by governance -----------------------------------------------------\n\n/** Operation type that is allowed on an account */\nexport const zClassicOperationType = z.enum([\n \"SEND\",\n \"STAKE\",\n \"DEPLOY_CONTRACT\",\n \"EXECUTE_CONTRACT\",\n \"SIGN_MESSAGE\",\n \"ACTIVATE_TOKEN\",\n]);\n\nexport type ClassicOperationType = z.infer<typeof zClassicOperationType>;\n\nexport const zRawSigningOperationType = z.enum([\"SIGN_DIGESTS\"]);\n\nexport type RawSigningOperationType = z.infer<typeof zRawSigningOperationType>;\n\n// #endregion\n\n// #region ---------- Aggregated ------------------------------------------------------------------\n\nexport const zOperationType = z.enum([\n ...zValueTransactionOperationType.options,\n ...zSigningOperationType.options,\n]);\n\nexport type OperationType = z.infer<typeof zOperationType>;\n\nexport const zOperation = z.discriminatedUnion(\"type\", [\n zValueTransactionOperation,\n zSigningOperation,\n]);\n\nexport type Operation = z.infer<typeof zOperation>;\n\n// #endregion\n\n// #region ---------- Utilities -------------------------------------------------------------------\n\nexport const isValueTransaction = (\n operation: Operation,\n): operation is ValueTransactionOperation => {\n const validTypes: OperationType[] = zValueTransactionOperationType.options;\n return validTypes.includes(operation.type);\n};\n\n// #endregion\n\n/* v8 ignore start */\n// This function is only used for type-checking.\nconst _ensureOperationType = (\n shouldBeTrue: TypeEquals<OperationType, ClassicOperationType | RawSigningOperationType>,\n): true => shouldBeTrue;\n/* v8 ignore stop */\n","import z from \"zod\";\n\nexport const zNote = z.object({\n title: z.string().describe(\"Note title\"),\n content: z.string().describe(\"Note content\"),\n});\n\nexport type Note = z.infer<typeof zNote>;\n","/** Error thrown when a model object does not pass the validation. */\nexport class ValidationError extends Error {}\n\n/** Error thrown when data is in an unexpected state - e.g. missing objects or duplicate entries */\nexport class DataInconsistencyError extends Error {}\n","import type {\n GateAccountType,\n GateEntityType,\n GateGroupType,\n GatePolicyType,\n GateRequestType,\n GateReviewConfigType,\n GateSciConfigType,\n GateUserType,\n GateWhitelistType,\n GateWorkspaceRuleType,\n} from \"@prisma/client\";\n\nimport { ValidationError } from \"./errors\";\n\nexport type GateType =\n | GateAccountType\n | GateEntityType\n | GateGroupType\n | GateReviewConfigType\n | GatePolicyType\n | GateRequestType\n | GateUserType\n | GateWhitelistType\n | GateWorkspaceRuleType\n | GateSciConfigType;\n\nconst GATE_SYNC_ID_PREFIX = \"gate://\";\n\n/** Build `syncId` for object synchronized from Gate. */\nexport const buildGateSyncId = (\n workspaceName: string,\n gateType: GateType,\n gateId: number,\n): string => {\n if (gateId <= 0) {\n throw new ValidationError(`Invalid gate ID: ${gateId}`);\n }\n return `${GATE_SYNC_ID_PREFIX}${workspaceName}/${gateType}/${gateId}`;\n};\n\n/**\n * Object that might have been synchronized from Gate.\n *\n * - To create a new object, `gateType` can be omitted (like `gateId` and `syncId`).\n * - For an object already saved in DB, `gateType` can be null.\n */\nexport type Syncable<T> = Omit<T, \"gateType\" | \"gateId\" | \"syncId\"> & {\n workspaceName: string;\n gateType?: GateType | null;\n gateId?: number;\n syncId?: string;\n};\n\n/**\n * Validate object sync fields.\n *\n * Following are some possible combinations:\n *\n * - All the fields are missing (`undefined`): This happens when we create a new object which\n * does not come from Gate. In such case, we will use default values defined in Prisma schema.\n * - All the fields are present:\n * - When `gateType` is not null: This happens for objects that come from Gate.\n * - When `gateType` is null: This happens for objects that do not come from Gate.\n *\n * All other combinations should be considered as invalid.\n */\nexport const validateSyncFields = <T>(syncable: Syncable<T>): void => {\n const { workspaceName, gateType, gateId, syncId } = syncable;\n\n // Case 1: All fields are missing.\n if (gateType === undefined && gateId === undefined && syncId === undefined) {\n return;\n }\n\n // Case 2: All fields are present...\n if (gateType !== undefined && gateId !== undefined && syncId !== undefined) {\n if (gateType !== null) {\n // Case 2.1: `gateType` is not null: Object is coming from Gate.\n if (gateId <= 0) {\n throw new ValidationError(`Invalid gateId for ${gateType}: ${gateId}`);\n }\n const expectedSyncId = buildGateSyncId(workspaceName, gateType, gateId);\n if (expectedSyncId !== syncId) {\n throw new ValidationError(`Invalid syncId: expected ${expectedSyncId} but got ${syncId}`);\n }\n } else {\n // Case 2.2: `gateType` is null: Object is not coming from Gate.\n if (gateId !== 0) {\n throw new ValidationError(`Expected gateId to be 0 but got: ${gateId}`);\n }\n if (syncId.startsWith(GATE_SYNC_ID_PREFIX)) {\n throw new ValidationError(\n `Invalid syncId: ${syncId} should not start with ${GATE_SYNC_ID_PREFIX}`,\n );\n }\n }\n return;\n }\n\n // All other cases are considered invalid.\n throw new ValidationError(`Inconsistent sync fields: ${gateType}, ${gateId}, ${syncId}`);\n};\n","import { Prisma } from \"@prisma/client\";\nimport { AxiosError } from \"axios\";\nimport invariant from \"invariant\";\nimport { isPlainObject, omit, uniq, uniqBy } from \"lodash\";\nimport crypto from \"node:crypto\";\nimport z from \"zod\";\n\nimport { DataInconsistencyError } from \"./errors\";\nimport type { GateType } from \"./sync-utils\";\nimport { buildGateSyncId } from \"./sync-utils\";\n\nexport const formatError = (err: unknown): string => {\n if (err instanceof AxiosError) {\n // See: https://axios-http.com/docs/handling_errors\n return `AxiosError: ${err.message ?? \"no detail provided\"}`;\n }\n if (err instanceof z.ZodError) {\n return `ZodError: ${JSON.stringify(err.flatten())}`;\n }\n return err instanceof Error ? err.message : /* v8 ignore next */ `${err} (${typeof err})`;\n};\n\n/** A type guard to assert that a value is a record. */\nexport const isRecord = (value: unknown): value is Record<string, unknown> => isPlainObject(value);\n\n/**\n * Convert an arbitrary value to a `Prisma.JsonValue` suitable to be assigned to a `Json` field.\n * @param value - the value to convert\n * @returns a `Prisma.JsonValue`\n */\nexport const toJsonValue = (value: unknown): Prisma.JsonValue => {\n const jsonPrimitives = [\"string\", \"number\", \"boolean\"];\n if (value === undefined) {\n throw new Error(\"Tried to convert undefined to JSON\");\n }\n if (value === null) {\n return null;\n }\n if (jsonPrimitives.includes(typeof value)) {\n return value;\n }\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n if (value instanceof Date) {\n return `${value.toISOString().slice(0, -5)}Z`; // Strip off milliseconds.\n }\n if (Array.isArray(value)) {\n return toJsonArray(value);\n }\n if (isRecord(value)) {\n return toJsonObject(value);\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string -- intended\n return String(value); // We can't do any better...\n};\n\n/**\n * Convert an arbitrary object to a `Prisma.JsonObject` suitable to be assigned to a `Json` field.\n * @param value - the object to convert\n * @returns a `Prisma.JsonObject`\n */\nexport const toJsonObject = (obj: Record<string, unknown>): Prisma.JsonObject => {\n return Object.fromEntries(\n Object.entries(obj)\n // strip off `undefined` values\n .filter(([_k, v]) => v !== undefined)\n .map(([k, v]): [string, Prisma.JsonValue] => {\n return [k, toJsonValue(v)];\n }),\n );\n};\n\nexport const toJsonArray = (obj: unknown[]): Prisma.JsonArray => obj.map(toJsonValue);\n\nexport type InputJsonValueOrNull = Prisma.InputJsonValue | Prisma.NullTypes.JsonNull;\n\nexport const convertToInputJsonValueOrJsonNull = (value: Prisma.JsonValue): InputJsonValueOrNull =>\n /* v8 ignore next */\n value === null || value === undefined ? Prisma.JsonNull : (value as Prisma.InputJsonValue);\n\n/**\n * Transform the object by iterating through the specified Json fields and converting all `null`\n * values to `Prisma.JsonNull`.\n *\n * Prisma does not accept `null` when writing to a Json field. This is because of the ambiguity\n * that there exist two possible null values: `Prisma.DbNull` and `Prisma.JsonNull`. Given a list\n * of keys for the Json fields, this function converts all `null` values to `Prisma.JsonNull`.\n *\n * See: See: https://github.com/prisma/prisma/issues/13969\n */\nexport const convertNullToJsonNull = <\n K extends string,\n T extends Record<K, Prisma.JsonValue | null>,\n>(\n obj: T,\n jsonKeys: K[],\n): Omit<T, K> & Record<K, InputJsonValueOrNull> => {\n const inputJsonEntries = jsonKeys.map((k): [K, InputJsonValueOrNull] => {\n const value = obj[k];\n return [k, value ?? Prisma.JsonNull];\n });\n const inputJsonFields = Object.fromEntries(inputJsonEntries) as Record<K, InputJsonValueOrNull>;\n return { ...omit(obj, jsonKeys), ...inputJsonFields };\n};\n\nexport const validateJsonField = (fieldName: string, value: unknown, schema: z.ZodType): void => {\n try {\n schema.parse(value);\n } catch (err) {\n throw new Error(`Invalid ${fieldName} field: ${formatError(err)}`);\n }\n};\n\n/**\n * Sleep for given ms\n *\n * @param ms - number of milliseconds to sleep\n * @returns Promise<void>\n */\nexport async function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * Generate random hex string\n * @param length - length in bytes\n * @returns 'length' bytes long hex string\n */\nexport const randomHex = (length: number): string =>\n Array.from(crypto.getRandomValues(new Uint8Array(length)))\n .map((v) => (v % 16).toString(16))\n .join(\"\")\n .toUpperCase();\n\nexport const genAuthUserId = (): string => randomHex(40);\n\n/**\n * Return the unique item in an array, or null if the array is empty.\n * @throws an error if the array contains multiple items.\n */\nexport const getUniqueOrNull = <T>(items: T[], msg: () => string): T | null => {\n if (items.length > 1) {\n throw new DataInconsistencyError(`Expected 0 or 1 but got ${items.length}: ${msg()}`);\n }\n return items.length === 0 ? null : items[0]!;\n};\n\n/**\n * Return the unique item in an array.\n * @throws an error if the array is empty or contains multiple items.\n */\nexport const getUniqueOrThrow = <T>(items: T[], msg: () => string): T => {\n if (items.length !== 1) {\n throw new DataInconsistencyError(`Expected 1 but got ${items.length}: ${msg()}`);\n }\n return items[0]!;\n};\n\n/** Extract object ids and join them to string. */\nexport const joinObjectIds = <T extends { id: string }>(objects: T[]): string =>\n objects.map((_) => _.id).join(\", \");\n\nexport const uniqById = <T extends { id: string }>(objects: T[]): T[] =>\n uniqBy(objects, (_) => _.id);\n\n/**\n * Given an array of string ids, return an array of objects containing only the `id` field.\n * The result is suitable for connecting or setting model foreign keys.\n */\nexport const wrapToObjectsWithId = (ids: string[]): { id: string }[] =>\n uniq(ids).map((id) => ({ id }));\n\n/**\n * Used in tRPC procedures to give ability to bypass automatic inference of query & mutations input/output\n * Handy when some performance problems starts to occur (e.g: request data inference).\n *\n * At static or build time, the given parametric type is used, removing tRPC need to compute the return\n * type.\n */\nexport const skipStaticInference = <T>(validator: z.ZodType): z.ZodType<T> => validator;\n\n/**\n * Return a `where` object for `findUnique` function for a given\n * ID, where it could be either revault uuid or gate ID (integer).\n */\nexport const compatWhereById = (\n workspaceName: string,\n type: GateType,\n id: string,\n): { workspaceName: string; id: string } | { workspaceName: string; syncId: string } => {\n // If `id` looks like an integer, assume it is the Gate ID.\n if (/^\\d+$/.test(id)) {\n const syncId = buildGateSyncId(workspaceName, type, parseInt(id, 10));\n return { workspaceName, syncId };\n }\n // Otherwise - it must be UUID\n return { workspaceName, id };\n};\n\n/**\n * Capitalize first letter of given string.\n */\nexport const capitalize = (text: string): string => text && text[0]!.toUpperCase() + text.slice(1);\n\n// #region ---------- Base64 ----------------------------------------------------------------------\n\nexport const base64urlEncode = (payload: Record<string, unknown>): string => {\n const jsonString = JSON.stringify(payload);\n return Buffer.from(jsonString, \"utf-8\").toString(\"base64url\").replace(/=+$/, \"\");\n};\n\nexport const base64urlDecode = (encodedPayload: string): Record<string, unknown> => {\n // Add missing padding chars to payload if necessary.\n const paddedBase64 = encodedPayload.padEnd(\n encodedPayload.length + ((4 - (encodedPayload.length % 4)) % 4),\n \"=\",\n );\n const decoded = JSON.parse(Buffer.from(paddedBase64, \"base64url\").toString(\"utf-8\"));\n invariant(isRecord(decoded), \"Decoded payload should be a JSON object\");\n return decoded;\n};\n\n// #endregion\n\n// #region ---------- Assertions ------------------------------------------------------------------\n\nexport const ensureNotNil = <T>(value: T | null | undefined, message?: string): T => {\n invariant(\n value !== null && value !== undefined,\n message ?? `Expected non-nil value but got ${value}`,\n );\n return value;\n};\n\n/**\n * Check the string is not nil and not empty, then return the trimmed string.\n */\nexport const ensureNonEmptyString = (\n value: string | null | undefined,\n message?: string,\n): string => {\n const trimmed = (value ?? \"\").trim();\n invariant(trimmed.length > 0, message ?? `Expected non-empty string but got: ${value}`);\n return trimmed;\n};\n\n/**\n * Ensure an array to be non-empty, and return the same array with a conforming type.\n * This is useful when used in combination of zod's `union` or `discriminatedUnion`.\n */\nexport const ensureNonEmptyArray = <T>(values: T[], message?: string): [T, ...T[]] => {\n invariant(\n values.length > 0,\n message ?? `Expected non-empty array but got one with length ${values.length}`,\n );\n return values as [T, ...T[]];\n};\n\n/* v8 ignore start */\n/**\n * Utility to enforce all branches are covered at compile time\n */\nexport function unreachable(value: never): never {\n throw new Error(`Un-covered: ${value}`);\n}\n/* v8 ignore stop */\n\n// #endregion\n","import { ChallengeType, PsdModel } from \"@prisma/client\";\nimport { z } from \"zod\";\n\nimport { type HsmObjectId, zHexString } from \"@/zod-utils\";\n\nexport type HsmObject = {\n hsmId: HsmObjectId;\n};\n\n// #region ---------- Common schemas & types ------------------------------------------------------\n\nexport const zPubKey = zHexString.describe(\"Public key\");\n\nexport type PubKey = z.infer<typeof zPubKey>;\n\nexport const zHsmCertificate = z.object({\n codeHash: z.string().base64().describe(\"Hash of the executable that generated this certificate\"),\n attestationPub: z.string().base64().describe(\"Attestation public key\"),\n certificate: z.string().base64().describe(\"Certificate bytes\"),\n signature: z.string().base64().describe(\"Certificate signature\"),\n});\n\nexport type HsmCertificate = z.infer<typeof zHsmCertificate>;\n\nexport const zBlob = z.string(); // TODO: .min(1).max(???).regex(???)\n\nexport type Blob = z.infer<typeof zBlob>;\n\nexport type HsmReviewStep = {\n quorum: number;\n users: PubKey[];\n};\n\nexport type HsmCurrency = {\n family: string;\n ticker: string; // hack: replaced by ledger id\n parameters: string; // the atp payload\n signature: string; // the atp signature\n};\n\n// #endregion\n\n// #region ---------- Challenge -------------------------------------------------------------------\n\nexport const zPsdChallenge = z.object({\n challengeType: z.literal(ChallengeType.PSD),\n wActions: z.array(z.string()).describe(\"Wrapped blobs that describe the screens to display\"),\n handshake: z.string().describe(\"Handshake for the HSM <-> PSD communication\"),\n handshakeAttestation: zHsmCertificate.describe(\n \"Handshake attestation to verify secure channel between HSM & PSD\",\n ),\n partitionId: z.string().describe(\"HSM partition id (maybe not useful)\"),\n});\n\nexport type PsdChallenge = z.infer<typeof zPsdChallenge>;\n\nexport const zApiChallenge = z.object({\n challengeType: z.literal(ChallengeType.API),\n payload: z\n .object({\n approve: z.string().describe(\"JSON payload to sign (as JWS) to approve\"),\n reject: z.string().describe(\"JSON payload to sign (as JWS) to reject\"),\n })\n .describe(\"JSON payload to approve and to reject\"),\n});\n\nexport type ApiChallenge = z.infer<typeof zApiChallenge>;\n\nexport const zUserChallenge = z.discriminatedUnion(\"challengeType\", [\n zPsdChallenge.describe(\"Necessary data to approve on a PSD\"),\n zApiChallenge.describe(\"Necessary data for approval by an API user\"),\n]);\n\nexport type UserChallenge = z.infer<typeof zUserChallenge>;\n\n/** A group of challenges indexed by pub key. */\nexport const zHsmChallengeGroup = z.record(zPubKey, zUserChallenge);\n\nexport type HsmChallengeGroup = z.infer<typeof zHsmChallengeGroup>;\n\n/**\n * One or more steps of challenges, each step contains a challenge group.\n * It is a 2D structure where the 1st dimension is \"step\", and the 2nd dimension is \"pubKey\".\n */\nexport const zHsmChallengeSteps = z.array(zHsmChallengeGroup);\n\nexport type HsmChallengeSteps = z.infer<typeof zHsmChallengeSteps>;\n\n// #endregion\n\n// #region ---------- Signature -------------------------------------------------------------------\n\n// TODO: Make it more strict (but don't be too strict).\nexport const zPsdSignature = z.string().min(1).describe(\"Signature from PSD\");\n\nexport type PsdSignature = z.infer<typeof zPsdSignature>;\n\n// TODO: Make it more strict (but don't be too strict).\nexport const zApiSignature = z.string().min(1).describe(\"Signature from API (JWS)\");\n\nexport type ApiSignature = z.infer<typeof zApiSignature>;\n\nexport const zUserApproval = z.discriminatedUnion(\"challengeType\", [\n z.object({\n challengeType: z.literal(ChallengeType.PSD),\n signature: zPsdSignature,\n }),\n z.object({\n challengeType: z.literal(ChallengeType.API),\n signature: zApiSignature,\n }),\n]);\n\nexport type UserApproval = z.infer<typeof zUserApproval>;\n\n/** A group of approvals indexed by pub key. */\nconst zHsmApprovalGroup = z.record(zPubKey, zUserApproval);\n\nexport type HsmApprovalGroup = z.infer<typeof zHsmApprovalGroup>;\n\n/**\n * One or more steps of approvals, each step contains an approval group.\n * This is a 2D matrix while the 1st dimension is \"step\", and the 2nd dimension is \"pubKey\".\n */\nexport const zHsmApprovalSteps = z.array(zHsmApprovalGroup);\n\nexport type HsmApprovalSteps = z.infer<typeof zHsmApprovalSteps>;\n\n/**\n * HSM approvals for approved stages. Key is the approved stage name, and value is an array of\n * approval steps where each step is a record of approvals indexed by user pub key.\n */\nexport type HsmApprovalStages = Record<string, HsmApprovalSteps>;\n\n/**\n * A challenge stage has a name and contains an array of one or more challenge steps.\n * Each challenge step contains challenges for multiple users, indexed by user's pub key.\n */\nexport const zHsmChallengeStage = z.object({\n stageName: z.string(),\n steps: zHsmChallengeSteps,\n});\n\nexport type HsmChallengeStage = z.infer<typeof zHsmChallengeStage>;\n\n// #endregion\n\n// #region ---------- User registration -----------------------------------------------------------\n\n/**\n * Device data submitted by the invited user, to generate a registration challenge.\n */\nexport const zUserRegistrationDeviceData = z\n .object({\n name: z.string().describe(\"Name of the user to register\"),\n psdModel: z.nativeEnum(PsdModel).describe(\"Device model\"),\n pubKey: zPubKey.describe(\"Device public key\"),\n confidentialityKey: zPubKey,\n psdEphemeralKey: zPubKey,\n psdEphemeralKeyAttestation: zHsmCertificate,\n })\n .describe(\"Data generated by the PSD to register on HSM\");\n\nexport type UserRegistrationDeviceData = z.infer<typeof zUserRegistrationDeviceData>;\n\n/**\n * Registration challenge for the invited user, generated by HSM.\n */\nexport const zUserRegistrationChallenge = z\n .object({\n challenge: z.string(),\n ephemeralPublicKey: zPubKey,\n ephemeralPublicKeyAttestation: zHsmCertificate,\n handshake: zHexString,\n handshakeAttestation: zHsmCertificate,\n u2fRegisterData: z.string(),\n ciphertext: z.string(),\n requestId: z.string(),\n })\n .describe(\"Challenge generated by HSM using the PSD registration data\");\n\nexport type UserRegistrationChallenge = z.infer<typeof zUserRegistrationChallenge>;\n\n/**\n * Response to the user registration challenge, submitted by the invited user.\n */\nexport const zUserRegistrationChallengeResponse = z\n .object({\n certificate: zHsmCertificate,\n u2fRegister: zHexString,\n u2fKeyHandle: zHexString,\n registerData: z.string(),\n validationKey: zPubKey,\n pairingPayload: z.string(),\n })\n .describe(\"Final registration response from PSD to HSM\");\n\nexport type UserRegistrationChallengeResponse = z.infer<typeof zUserRegistrationChallengeResponse>;\n\n// #endregion\n\n// #region ---------- PSD Pairing -----------------------------------------------------------------\n\nexport const zPsdPairingInputData = z.object({\n confidentialityKeyCurve25519: z.string(),\n confidentialityKeySignature: z.string(),\n});\n\nexport type PsdPairingInputData = z.infer<typeof zPsdPairingInputData>;\n\nexport const zPsdPairingData = z.object({\n pairing: z.object({\n workspaceName: z.string(),\n partitionKey: z.string(), // TODO: Is this `zPubKey`?\n bootstrapEnabled: z.boolean(),\n }),\n // TODO: Is this `zHsmCertificate`?\n partitionKeyAttestation: z.object({\n codeHash: z.string(),\n attestationPub: z.string(),\n certificate: z.string(),\n signature: z.string(),\n }),\n blob: zBlob,\n});\n\nexport type PsdPairingData = z.infer<typeof zPsdPairingData>;\n\n// #endregion\n\n// #region ---------- Signatures ------------------------------------------------------------------\n\nexport const zHsmSignature = z.object({\n digest: z.string().nullable().describe(\"Signed digest\"),\n derivationPath: z.string().nullable().describe(\"Derivation path used to sign the digest\"),\n r: z.string().base64().describe(\"Base64 encoded signature r coordinate\"),\n s: z.string().base64().describe(\"Base64 encoded signature s coordinate\"),\n v: z\n .union([z.literal(0), z.literal(1)])\n .nullable()\n .describe(\"Ecdsa only, signature recovery value\"),\n der: zHexString.describe(\n \"Hex string encoded DER signature format (for eddsa, concatenation of r & s)\",\n ),\n pubkey: zHexString.nullable().describe(\"Public key for signature verification, 32 or 33 bytes\"),\n});\n\nexport type HsmSignature = z.infer<typeof zHsmSignature>;\n\n// #endregion\n","import z from \"zod\";\n\nimport { zHexString, zIntString } from \"@/zod-utils\";\n\nexport const zBitcoinLikeTransactionType = z\n .enum([\"BITCOIN_LIKE_SEND\", \"BITCOIN_LIKE_RECEIVE\"])\n .describe(\"Bitcoin-like transaction type\");\nexport type BitcoinLikeTransactionType = z.infer<typeof zBitcoinLikeTransactionType>;\n\nexport const zCardanoLikeTransactionType = z\n .enum([\n \"CARDANO_LIKE_SEND\",\n \"CARDANO_LIKE_RECEIVE\",\n \"CARDANO_LIKE_STAKING_REGISTER\",\n \"CARDANO_LIKE_STAKING_DEREGISTER\",\n \"CARDANO_LIKE_STAKING_DELEGATE\",\n \"CARDANO_LIKE_STAKING_WITHDRAW\",\n ])\n .describe(\"Cardano-like transaction type\");\nexport type CardanoLikeTransactionType = z.infer<typeof zCardanoLikeTransactionType>;\n\nexport const zEthereumLikeTransferTransactionType = z\n .enum([\"ETHEREUM_LIKE_SEND\", \"ETHEREUM_LIKE_RECEIVE\"])\n .describe(\"Ethereum-like transaction type\");\nexport type EthereumLikeTransferTransactionType = z.infer<\n typeof zEthereumLikeTransferTransactionType\n>;\n\nexport const zEthereumLikeContractTransactionType = z\n .enum([\"ETHEREUM_LIKE_EXECUTE_CONTRACT\", \"ETHEREUM_LIKE_DEPLOY_CONTRACT\"])\n .describe(\"Ethereum-like transaction type\");\nexport type EthereumLikeContractTransactionType = z.infer<\n typeof zEthereumLikeContractTransactionType\n>;\n\nexport const zPolkadotLikeTransactionType = z\n .enum([\n \"POLKADOT_LIKE_SEND\",\n \"POLKADOT_LIKE_RECEIVE\",\n \"POLKADOT_LIKE_ADDPROXY\",\n \"POLKADOT_LIKE_REMOVEPROXY\",\n \"POLKADOT_LIKE_BOND\",\n \"POLKADOT_LIKE_REBOND\",\n \"POLKADOT_LIKE_BONDEXTRA\",\n \"POLKADOT_LIKE_UNBOND\",\n \"POLKADOT_LIKE_WITHDRAWUNBONDED\",\n \"POLKADOT_LIKE_SETCONTROLLER\",\n \"POLKADOT_LIKE_SETPAYEE\",\n \"POLKADOT_LIKE_PROXY\",\n \"POLKADOT_LIKE_ANONYMOUSPROXY\",\n \"POLKADOT_LIKE_KILLANONYMOUS\",\n \"POLKADOT_LIKE_PUREPROXY\",\n \"POLKADOT_LIKE_KILLPURE\",\n \"POLKADOT_LIKE_NOMINATE\",\n \"POLKADOT_LIKE_REWARD\",\n \"POLKADOT_LIKE_CHILL\",\n \"POLKADOT_LIKE_TRANSFERALL\",\n ])\n .describe(\"Polkadot-like transaction type\");\nexport type PolkadotLikeTransactionType = z.infer<typeof zPolkadotLikeTransactionType>;\n\nexport const zRippleLikeTransactionType = z\n .enum([\"RIPPLE_LIKE_SEND\", \"RIPPLE_LIKE_RECEIVE\"])\n .describe(\"Ripple-like transaction type\");\nexport type RippleLikeTransactionType = z.infer<typeof zRippleLikeTransactionType>;\n\nexport const zSolanaLikeTransactionType = z\n .enum([\n \"SOLANA_LIKE_SEND\",\n \"SOLANA_LIKE_RECEIVE\",\n \"SOLANA_LIKE_CREATE_DELEGATE_STAKE\",\n \"SOLANA_LIKE_DELEGATE_STAKE\",\n \"SOLANA_LIKE_WITHDRAW_STAKE\",\n \"SOLANA_LIKE_DEACTIVATE_STAKE\",\n \"SOLANA_LIKE_SPLIT_STAKE\",\n \"SOLANA_LIKE_SPLIT_DEACTIVATE_STAKE\",\n \"SOLANA_LIKE_MERGE_STAKE\",\n \"SOLANA_LIKE_SEND_TOKEN\",\n \"SOLANA_LIKE_FUND_TOKEN\",\n ])\n .describe(\"Solana-like transaction type\");\nexport type SolanaLikeTransactionType = z.infer<typeof zSolanaLikeTransactionType>;\n\nexport const zStellarLikeTransactionType = z\n .enum([\"STELLAR_LIKE_SEND\", \"STELLAR_LIKE_RECEIVE\"])\n .describe(\"Stellar-like transaction type\");\nexport type StellarLikeTransactionType = z.infer<typeof zStellarLikeTransactionType>;\n\nexport const zTezosLikeTransactionType = z\n .enum([\n \"TEZOS_LIKE_SEND\",\n \"TEZOS_LIKE_RECEIVE\",\n \"TEZOS_LIKE_REVEAL\",\n \"TEZOS_LIKE_DELEGATE\",\n \"TEZOS_LIKE_UNDELEGATE\",\n ])\n .describe(\"Tezos-like transaction type\");\nexport type TezosLikeTransactionType = z.infer<typeof zTezosLikeTransactionType>;\n\nexport const zGenericTransactionType = z\n .enum([\"GENERIC_TRANSACTION\"])\n .describe(\"Generic transaction type\");\nexport type GenericTransactionType = z.infer<typeof zGenericTransactionType>;\n\nexport const zTransactionType = z.union([\n zBitcoinLikeTransactionType,\n zCardanoLikeTransactionType,\n zEthereumLikeTransferTransactionType,\n zEthereumLikeContractTransactionType,\n zGenericTransactionType,\n zPolkadotLikeTransactionType,\n zRippleLikeTransactionType,\n zSolanaLikeTransactionType,\n zStellarLikeTransactionType,\n zTezosLikeTransactionType,\n]);\nexport type TransactionType = z.infer<typeof zTransactionType>;\n\nexport const zEstimatedFees = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"ETHEREUM_LIKE\"),\n baseFees: zIntString,\n gasLimit: zIntString,\n nonce: z.string(),\n priorityFees: zIntString,\n }),\n]);\n\nexport type EstimatedFees = z.infer<typeof zEstimatedFees>;\n\n// #region ---------- Message Signing -------------------------------------------------------------\n\nexport const zMessageType = z.enum([\"EIP191\", \"EIP712\"]);\n\nexport type MessageType = z.infer<typeof zMessageType>;\n\n// TODO: Rename? \"message\" is a too generic word...\nexport const zMessage = z.object({\n type: zMessageType.describe(\"Type of the message to sign\"),\n data: zHexString\n .nonempty()\n .describe(\"Hex data to sign, either a json string for EIP712, or a raw string for EIP191\"),\n});\n\nexport type Message = z.infer<typeof zMessage>;\n\n// #endregion\n","import z from \"zod\";\n\nimport { zHsmSignature } from \"@/hsm\";\nimport type { Operation } from \"@/types\";\nimport { zCurrency, zHexString, zHsmObjectId, zIntString, zUnsignedIntString } from \"@/zod-utils\";\n\nimport {\n zBitcoinLikeTransactionType,\n zCardanoLikeTransactionType,\n zEthereumLikeContractTransactionType,\n zEthereumLikeTransferTransactionType,\n zGenericTransactionType,\n zMessage,\n zPolkadotLikeTransactionType,\n zRippleLikeTransactionType,\n zSolanaLikeTransactionType,\n zStellarLikeTransactionType,\n zTezosLikeTransactionType,\n} from \"./types\";\n\n/**\n * Ensure that this is a hex string and transform it to lowercase with 0x prefix.\n * Not to be used for EIP-55 addresses or other attributes where letter casing is important!\n */\nlet zHexDataString = z\n .string()\n .regex(/^(?:0x|0X)?[a-fA-F0-9]+$/)\n .transform((hex) => `0x${hex.toLowerCase().replace(\"0x\", \"\")}`);\n\n/**\n * As we are using `.transform()`, we have to add extra information to\n * make zod-to-openapi properly transform the data (when generating\n * the OpenAPI spec). However, this `.openapi()` method is only added\n * when we generate the OpenAPI spec, so we should dynamically add this\n * block so it doesn't break when generating Gate message (for example).\n */\n/* v8 ignore start */\nif (\"openapi\" in zHexDataString) {\n zHexDataString = zHexDataString.openapi?.({ effectType: \"same\" });\n}\n/* v8 ignore stop */\n\n/**\n * Schema of `Request.data.transaction`\n */\nconst zCommonTransactionData = z.object({\n amount: zUnsignedIntString.describe(\"Transaction amount\"),\n currency: zCurrency.describe(\"Transaction currency\"), // TODO: strict literal or enum?\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n recipient: z.string().describe(\"Transaction recipient\"),\n});\n\nconst zFeeStrategyCustom = z.object({\n type: z.enum([\"SLOW\", \"NORMAL\", \"FAST\", \"CUSTOM\"]),\n});\n\nconst zFeeStrategy = z.object({\n type: z.enum([\"SLOW\", \"NORMAL\", \"FAST\"]),\n});\n\n// #region ---------- BITCOIN ---------------------------------------------------------------------\n\nconst zBitcoinLikeFeeStrategy = zFeeStrategyCustom\n .extend({\n // nullish is optional + nullable, it is easier to seed rather than just optional\n feePerByte: zUnsignedIntString.nullish().describe(\"Fee per byte\"),\n })\n .describe(\"Bitcoin-like fee strategy\");\n\nconst zBitcoinLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zBitcoinLikeTransactionType.enum.BITCOIN_LIKE_SEND),\n feeStrategy: zBitcoinLikeFeeStrategy,\n })\n .describe(\"Bitcoin-like send data\");\n\nexport type BitcoinLikeSendData = z.infer<typeof zBitcoinLikeSendData>;\n\n// #endregion\n\n// #region ---------- ETHEREUM --------------------------------------------------------------------\n\nconst zEthereumLikeLegacyFeeStrategy = zFeeStrategyCustom\n .extend({\n gasPrice: zUnsignedIntString.describe(\"Gas price\"),\n gasLimit: zUnsignedIntString.describe(\"Gas limit\"),\n })\n .describe(\"Ethereum-like legacy fee strategy\");\n\nconst zEthereumLikeEip1559FeeStrategy = zFeeStrategyCustom\n .extend({\n maxPriorityFeePerGas: zUnsignedIntString.describe(\"Maximum priority fee per gas\"),\n maxFeePerGas: zUnsignedIntString.describe(\"Maximum fee per gas (base + priority)\"),\n gasLimit: zUnsignedIntString.describe(\"Gas limit\"),\n })\n .describe(\"Ethereum-like EIP-1559 fee strategy\");\n\nconst zEthereumLikeFeeStrategy = z\n .union([zEthereumLikeLegacyFeeStrategy, zEthereumLikeEip1559FeeStrategy])\n .describe(\"Ethereum-like fee strategy\");\n\nexport type EthereumLikeFeeStrategy = z.infer<typeof zEthereumLikeFeeStrategy>;\n\nconst zEthereumLikeDeployContractData = zCommonTransactionData\n .extend({\n type: z.literal(zEthereumLikeContractTransactionType.enum.ETHEREUM_LIKE_DEPLOY_CONTRACT),\n // force the recipient to be the zero address\n recipient: z.literal(\"0x0000000000000000000000000000000000000000\"),\n contractData: zHexDataString.describe(\"Contract data in hexadecimal format\"),\n feeStrategy: zEthereumLikeFeeStrategy,\n })\n .describe(\"Ethereum-like deploy contract data\");\n\nconst zEthereumLikeExecuteContractData = zCommonTransactionData\n .extend({\n type: z.literal(zEthereumLikeContractTransactionType.enum.ETHEREUM_LIKE_EXECUTE_CONTRACT),\n contractData: zHexDataString.describe(\"Contract call data in hexadecimal format\"),\n feeStrategy: zEthereumLikeFeeStrategy,\n })\n .describe(\"Ethereum-like execute contract data\");\n\nconst zEthereumLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zEthereumLikeTransferTransactionType.enum.ETHEREUM_LIKE_SEND),\n feeStrategy: zEthereumLikeFeeStrategy,\n })\n .describe(\"Ethereum-like send data\");\n\nexport type EthereumLikeSendData = z.infer<typeof zEthereumLikeSendData>;\n\n// #endregion\n\n// #region ---------- TEZOS -----------------------------------------------------------------------\n\nconst zTezosLikeFeeStrategy = zFeeStrategyCustom\n .extend({\n gasLimit: zUnsignedIntString.describe(\"Gas limit\"),\n storageLimit: zUnsignedIntString.nullable().describe(\"Storage limit\"),\n })\n .describe(\"Tezos-like fee strategy\");\n\nconst zTezosLikeDelegateData = zCommonTransactionData\n .extend({\n type: z.literal(zTezosLikeTransactionType.enum.TEZOS_LIKE_DELEGATE),\n feeStrategy: zTezosLikeFeeStrategy,\n })\n .describe(\"Tezos-like delegate data\");\n\nconst zTezosLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zTezosLikeTransactionType.enum.TEZOS_LIKE_SEND),\n feeStrategy: zTezosLikeFeeStrategy,\n })\n .describe(\"Tezos-like send data\");\n\nexport type TezosLikeSendData = z.infer<typeof zTezosLikeSendData>;\n\nconst zTezosLikeUndelegateData = zCommonTransactionData\n .extend({\n type: z.literal(zTezosLikeTransactionType.enum.TEZOS_LIKE_UNDELEGATE),\n feeStrategy: zTezosLikeFeeStrategy,\n })\n .describe(\"Tezos-like undelegate data\");\n\n// #endregion\n\n// #region ---------- POLKADOT --------------------------------------------------------------------\n\nconst zPolkadotRewardDestination = z.enum([\"Staked\", \"Stash\"]);\n\nconst zPolkadotLikeAddProxyData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_ADDPROXY),\n currency: zCurrency.describe(\"Transaction currency\"),\n kind: z.literal(\"Staking\").describe(\"Proxy kind\"),\n proxy: z.string().describe(\"Proxy address\"),\n })\n .describe(\"Polkadot-like add proxy data\");\n\nconst zPolkadotLikeAnonymousProxyData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_ANONYMOUSPROXY),\n currency: zCurrency.describe(\"Transaction currency\"),\n })\n .describe(\"Polkadot-like anonymous proxy data\");\n\nconst zPolkadotLikeBondData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_BOND),\n currency: zCurrency.describe(\"Transaction currency\"),\n payee: zPolkadotRewardDestination,\n amount: zUnsignedIntString.describe(\"Amount\"),\n })\n .describe(\"Polkadot-like bond data\");\n\nconst zPolkadotLikeBondExtraData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_BONDEXTRA),\n currency: zCurrency.describe(\"Transaction currency\"),\n amount: zUnsignedIntString.describe(\"Amount\"),\n })\n .describe(\"Polkadot-like bond extra data\");\n\nconst zPolkadotLikeChillData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_CHILL),\n currency: zCurrency.describe(\"Transaction currency\"),\n })\n .describe(\"Polkadot-like chill data\");\n\nconst zPolkadotLikeKillAnonymousData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_KILLANONYMOUS),\n currency: zCurrency.describe(\"Transaction currency\"),\n })\n .describe(\"Polkadot-like kill anonymous data\");\n\nconst zPolkadotLikeRebondData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_REBOND),\n currency: zCurrency.describe(\"Transaction currency\"),\n amount: zUnsignedIntString.describe(\"Amount\"),\n })\n .describe(\"Polkadot-like rebond data\");\n\nconst zPolkadotLikeRemoveProxyData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_REMOVEPROXY),\n currency: zCurrency.describe(\"Transaction currency\"),\n kind: z.literal(\"Staking\"),\n proxy: z.string().describe(\"Proxy address\"),\n })\n .describe(\"Polkadot-like remove proxy data\");\n\nconst zPolkadotLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_SEND),\n })\n .describe(\"Polkadot-like send data\");\n\nconst zPolkadotLikeSetPayeeData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_SETPAYEE),\n currency: zCurrency.describe(\"Transaction currency\"),\n payee: zPolkadotRewardDestination,\n })\n .describe(\"Polkadot-like set payee data\");\n\nconst zPolkadotLikeUnbondData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_UNBOND),\n currency: zCurrency.describe(\"Transaction currency\"),\n amount: zUnsignedIntString.describe(\"Amount\"),\n })\n .describe(\"Polkadot-like unbond data\");\n\nconst zPolkadotLikeWithdrawUnbondedData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_WITHDRAWUNBONDED),\n currency: zCurrency.describe(\"Transaction currency\"),\n })\n .describe(\"Polkadot-like withdraw unbonded data\");\n\n// #endregion\n\n// #region ---------- RIPPLE ----------------------------------------------------------------------\n\nconst zRippleLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zRippleLikeTransactionType.enum.RIPPLE_LIKE_SEND),\n destinationTag: zIntString.nullable().describe(\"Destination tag\"),\n feeStrategy: zFeeStrategyCustom.describe(\"Ripple-like fee strategy\"),\n })\n .describe(\"Ripple-like send data\");\n\n// #endregion\n\n// #region ---------- STELLAR ---------------------------------------------------------------------\n\n// https://developers.stellar.org/docs/learn/encyclopedia/memos\nconst zStellarMemo = z.union([\n z\n .object({ MEMO_TEXT: z.string().max(28).describe(\"Text memo (at most a 28 bytes string)\") })\n .describe(\"Text memo\"),\n z\n .object({ MEMO_ID: zIntString.describe(\"Id memo (unsigned 64 bits integer)\") })\n .describe(\"Id memo\"),\n z\n .object({\n MEMO_HASH: z\n .string()\n .max(128)\n .regex(/^[a-fA-F0-9]+$/)\n .describe(\"Transaction hash memo (64 bytes hexadecimal string)\"),\n })\n .describe(\"Hash memo\"),\n z\n .object({\n MEMO_RETURN: z\n .string()\n .max(128)\n .regex(/^[a-fA-F0-9]+$/)\n .describe(\n \"A 64 bytes hexadecimal string intended to be interpreted as the hash of the transaction the sender is refunding.\",\n ),\n })\n .describe(\"Return memo\"),\n]);\n\nconst zStellarLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zStellarLikeTransactionType.enum.STELLAR_LIKE_SEND),\n memo: zStellarMemo.nullable().describe(\"Stellar memo\"),\n feeStrategy: zFeeStrategy.describe(\"Stellar-like fee strategy\"),\n })\n .describe(\"Stellar-like send data\");\n\n// #endregion\n\n// #region ---------- SOLANA ----------------------------------------------------------------------\n\nconst zSolanaLikeCreateDelegateStakeData = zCommonTransactionData\n .extend({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_CREATE_DELEGATE_STAKE),\n recipient: z.string().describe(\"Delegated vote address\"), // Re-described\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n })\n .describe(\"Solana-like create delegate stake data\");\n\nconst zSolanaLikeDeactivateStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_DEACTIVATE_STAKE),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n stakeAccount: z.string().describe(\"Stake account address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No recipient, no amount\n })\n .describe(\"Solana-like deactivate stake data\");\n\nconst zSolanaLikeDelegateStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_DELEGATE_STAKE),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n recipient: z.string().describe(\"Delegated vote address\"),\n stakeAccount: z.string().describe(\"Stake account address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No amount\n })\n .describe(\"Solana-like delegate stake data\");\n\nconst zSolanaLikeMergeStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_MERGE_STAKE),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n mergeSrcAccount: z.string().describe(\"Source stake address\"),\n mergeDstAccount: z.string().describe(\"Destination stake address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No recipient, no amount\n })\n .describe(\"Solana-like merge stake data\");\n\nconst zSolanaLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_SEND),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n })\n .describe(\"Solana-like send data\");\n\nconst zSolanaLikeSplitDeactivateStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_SPLIT_DEACTIVATE_STAKE),\n amount: zUnsignedIntString.describe(\"Transaction amount\"),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n stakeAccount: z.string().describe(\"Stake account address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No recipient\n })\n .describe(\"Solana-like split deactivate stake data\");\n\nconst zSolanaLikeSplitStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_SPLIT_STAKE),\n amount: zUnsignedIntString.describe(\"Transaction amount\"),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n stakeAccount: z.string().describe(\"Stake account address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No recipient\n })\n .describe(\"Solana-like split stake data\");\n\nconst zSolanaLikeWithdrawStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_WITHDRAW_STAKE),\n amount: zUnsignedIntString.describe(\"Transaction amount\"),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n stakeAccount: z.string().describe(\"Stake account address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No recipient\n })\n .describe(\"Solana-like delegate stake data\");\n\nconst zSolanaLikeSendTokenData = zCommonTransactionData\n .extend({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_SEND_TOKEN),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n })\n .describe(\"Solana-like send token data\");\n\nconst zSolanaLikeFundTokenData = zCommonTransactionData\n .extend({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_FUND_TOKEN),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n })\n .describe(\"Solana-like fund token data\");\n\n// #endregion\n\n// #region ---------- CARDANO ---------------------------------------------------------------------\n\nconst zCardanoSendData = zCommonTransactionData\n .extend({\n type: z.literal(zCardanoLikeTransactionType.enum.CARDANO_LIKE_SEND),\n feeStrategy: zFeeStrategy.describe(\"Cardano-like fee strategy\"),\n })\n .describe(\"Cardano-like send data\");\n\nconst zCardanoStakingDelegateData = z\n .object({\n type: z.literal(zCardanoLikeTransactionType.enum.CARDANO_LIKE_STAKING_DELEGATE),\n currency: zCurrency.describe(\"Transaction currency\"), // TODO: strict literal or enum?\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n feeStrategy: zFeeStrategy.describe(\"Cardano-like fee strategy\"),\n // DELEGATE doesn't have neither amount nor recipient\n stakePoolId: z.string().min(1).max(100).describe(\"\"),\n })\n .describe(\"Cardano-like staking delegate\");\n\nconst zCardanoStakingDeregisterData = z\n .object({\n type: z.literal(zCardanoLikeTransactionType.enum.CARDANO_LIKE_STAKING_DEREGISTER),\n currency: zCurrency.describe(\"Transaction currency\"), // TODO: strict literal or enum?\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n feeStrategy: zFeeStrategy.describe(\"Cardano-like fee strategy\"),\n // DEREGISTER doesn't have a recipient\n amount: zUnsignedIntString.describe(\"Amount to deregister\"),\n })\n .describe(\"Cardano-like staking deregister data\");\n\nconst zCardanoStakingRegisterData = z\n .object({\n type: z.literal(zCardanoLikeTransactionType.enum.CARDANO_LIKE_STAKING_REGISTER),\n currency: zCurrency.describe(\"Transaction currency\"), // TODO: strict literal or enum?\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n feeStrategy: zFeeStrategy.describe(\"Cardano-like fee strategy\"),\n // REGISTER doesn't have a recipient\n amount: zUnsignedIntString.describe(\"Amount to register\"),\n })\n .describe(\"Cardano-like staking register data\");\n\nconst zCardanoStakingWithdrawData = z\n .object({\n type: z.literal(zCardanoLikeTransactionType.enum.CARDANO_LIKE_STAKING_WITHDRAW),\n currency: zCurrency.describe(\"Transaction currency\"), // TODO: strict literal or enum?\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n feeStrategy: zFeeStrategy.describe(\"Cardano-like fee strategy\"),\n // WITHDRAW doesn't have a recipient\n amount: zUnsignedIntString.describe(\"Amount to withdraw\"),\n })\n .describe(\"Cardano-like staking withdraw data\");\n\n// #endregion\n\n// #region ---------- GENERIC ---------------------------------------------------------------------\n\nconst zGenericTransactionData = z\n .object({\n type: z.literal(zGenericTransactionType.enum.GENERIC_TRANSACTION),\n currency: zCurrency.describe(\"Transaction currency\"),\n rawTx: z.string().describe(\"Raw tx\"),\n })\n .describe(\"Generic transaction data\");\n\nexport type GenericTransactionData = z.infer<typeof zGenericTransactionData>;\n\n// #endregion\n\nexport const zTransactionData = z.discriminatedUnion(\"type\", [\n // Bitcoin\n zBitcoinLikeSendData,\n // Cardano\n zCardanoSendData,\n zCardanoStakingDelegateData,\n zCardanoStakingDeregisterData,\n zCardanoStakingRegisterData,\n zCardanoStakingWithdrawData,\n // Ethereum\n zEthereumLikeDeployContractData,\n zEthereumLikeExecuteContractData,\n zEthereumLikeSendData,\n // Generic\n zGenericTransactionData,\n // Polkadot\n zPolkadotLikeAddProxyData,\n zPolkadotLikeAnonymousProxyData,\n zPolkadotLikeBondData,\n zPolkadotLikeBondExtraData,\n zPolkadotLikeChillData,\n zPolkadotLikeKillAnonymousData,\n zPolkadotLikeRebondData,\n zPolkadotLikeRemoveProxyData,\n zPolkadotLikeSendData,\n zPolkadotLikeSetPayeeData,\n zPolkadotLikeUnbondData,\n zPolkadotLikeWithdrawUnbondedData,\n // Ripple\n zRippleLikeSendData,\n // Solana\n zSolanaLikeCreateDelegateStakeData,\n zSolanaLikeDeactivateStakeData,\n zSolanaLikeDelegateStakeData,\n zSolanaLikeMergeStakeData,\n zSolanaLikeSendData,\n zSolanaLikeSplitDeactivateStakeData,\n zSolanaLikeSplitStakeData,\n zSolanaLikeWithdrawStakeData,\n zSolanaLikeSendTokenData,\n zSolanaLikeFundTokenData,\n // Stellar\n zStellarLikeSendData,\n // Tezos\n zTezosLikeDelegateData,\n zTezosLikeSendData,\n zTezosLikeUndelegateData,\n]);\n\nexport type TransactionData = z.infer<typeof zTransactionData>;\n\nexport const zSendOnlyTransactionData = z.discriminatedUnion(\"type\", [\n zBitcoinLikeSendData,\n zCardanoSendData,\n zEthereumLikeSendData,\n zPolkadotLikeSendData,\n zRippleLikeSendData,\n zSolanaLikeSendData,\n zStellarLikeSendData,\n zTezosLikeSendData,\n]);\n\nexport type SendOnlyTransactionData = z.infer<typeof zSendOnlyTransactionData>;\n\n/**\n * Schema of `Request.data` for `CREATE_TRANSACTION` request.\n */\nexport const zCreateTransactionRequestData = z.object({\n accountId: z.string().min(1).describe(\"Target account id\"),\n transaction: zTransactionData,\n});\n\nexport type CreateTransactionRequestData = z.infer<typeof zCreateTransactionRequestData>;\n\n// #region ---------- Convert TransactionData to Operation ----------------------------------------\n\nexport const convertTransactionDataToOperation = (transaction: TransactionData): Operation => {\n switch (transaction.type) {\n case \"ETHEREUM_LIKE_SEND\": {\n return {\n type: \"SEND\",\n currency: transaction.currency,\n recipient: transaction.recipient,\n value: transaction.amount,\n };\n }\n /* v8 ignore start */\n // TODO : we need a more systematic way to cover the whole thing e2e\n // Probably as a transaction workflow parametrized test\n case \"BITCOIN_LIKE_SEND\": {\n return {\n type: \"SEND\",\n currency: transaction.currency,\n recipient: transaction.recipient,\n value: transaction.amount,\n };\n }\n case \"CARDANO_LIKE_SEND\":\n case \"CARDANO_LIKE_STAKING_DELEGATE\":\n case \"CARDANO_LIKE_STAKING_DEREGISTER\":\n case \"CARDANO_LIKE_STAKING_REGISTER\":\n case \"CARDANO_LIKE_STAKING_WITHDRAW\":\n case \"ETHEREUM_LIKE_DEPLOY_CONTRACT\":\n case \"ETHEREUM_LIKE_EXECUTE_CONTRACT\":\n case \"GENERIC_TRANSACTION\":\n case \"POLKADOT_LIKE_ADDPROXY\":\n case \"POLKADOT_LIKE_ANONYMOUSPROXY\":\n case \"POLKADOT_LIKE_BOND\":\n case \"POLKADOT_LIKE_BONDEXTRA\":\n case \"POLKADOT_LIKE_CHILL\":\n case \"POLKADOT_LIKE_KILLANONYMOUS\":\n case \"POLKADOT_LIKE_REBOND\":\n case \"POLKADOT_LIKE_REMOVEPROXY\":\n case \"POLKADOT_LIKE_SEND\":\n case \"POLKADOT_LIKE_SETPAYEE\":\n case \"POLKADOT_LIKE_UNBOND\":\n case \"POLKADOT_LIKE_WITHDRAWUNBONDED\":\n case \"RIPPLE_LIKE_SEND\":\n case \"SOLANA_LIKE_CREATE_DELEGATE_STAKE\":\n case \"SOLANA_LIKE_DEACTIVATE_STAKE\":\n case \"SOLANA_LIKE_DELEGATE_STAKE\":\n case \"SOLANA_LIKE_MERGE_STAKE\":\n case \"SOLANA_LIKE_SEND\":\n case \"SOLANA_LIKE_SPLIT_DEACTIVATE_STAKE\":\n case \"SOLANA_LIKE_SPLIT_STAKE\":\n case \"SOLANA_LIKE_WITHDRAW_STAKE\":\n case \"SOLANA_LIKE_SEND_TOKEN\":\n case \"SOLANA_LIKE_FUND_TOKEN\":\n case \"STELLAR_LIKE_SEND\":\n case \"TEZOS_LIKE_DELEGATE\":\n case \"TEZOS_LIKE_SEND\":\n case \"TEZOS_LIKE_UNDELEGATE\":\n // TODO: Support creating transaction of more types in Gate!\n throw new Error(`Transaction type ${transaction.type} not yet supported`);\n } /* v8 ignore stop */\n};\n\n// #endregion\n\n// #region ---------- SIGN_MESSAGE ----------------------------------------------------------------\n\nexport const zSignMessageRequestData = z.object({\n message: zMessage.describe(\"Message to sign\"),\n accountId: z.string().min(1).describe(\"Target account id\"),\n address: z.string().nonempty().describe(\"Address with which to sign the message\"),\n derivationPath: z.string().nonempty().describe(\"Derivation path of the signing address\"),\n});\n\nexport type SignMessageRequestData = z.infer<typeof zSignMessageRequestData>;\n\nexport const zSignMessageUserInputData = zSignMessageRequestData.partial({\n address: true,\n derivationPath: true,\n});\n\nexport type SignMessageUserInputData = z.infer<typeof zSignMessageUserInputData>;\n\nexport const zSignMessageManagedData = z.object({\n // Populated after input data is validated.\n govRuleHsmId: zHsmObjectId.optional(),\n // Populated after request is executed -- it holds the message-signing result.\n signature: zHsmSignature.optional(),\n});\n\nexport type SignMessageManagedData = z.infer<typeof zSignMessageManagedData>;\n\n// #endregion\n\n// #region ---------- SIGN_DIGESTS ----------------------------------------------------------------\n\nexport const zDigestData = z.object({\n digest: zHexString.describe(\"The hex string digest to sign\"),\n derivationPath: z\n .string()\n .nonempty()\n .describe(\"The derivation path with which to sign the digest\"),\n});\n\nexport type DigestData = z.infer<typeof zDigestData>;\n\nexport const zSignDigestsRequestData = z.object({\n accountId: z.string().min(1).describe(\"Target account id\"),\n digests: z.array(zDigestData).describe(\"The digests to sign\"),\n});\n\nexport type SignDigestsRequestData = z.infer<typeof zSignDigestsRequestData>;\n\nexport const zSignDigestsManagedData = z.object({\n signatures: z.array(zHsmSignature),\n});\n\nexport type SignDigestsManagedData = z.infer<typeof zSignDigestsManagedData>;\n\n// #endregion\n","import z from \"zod\";\n\nimport {\n zBitcoinLikeTransactionType,\n zCardanoLikeTransactionType,\n zEthereumLikeContractTransactionType,\n zEthereumLikeTransferTransactionType,\n zGenericTransactionType,\n zPolkadotLikeTransactionType,\n zRippleLikeTransactionType,\n zSolanaLikeTransactionType,\n zStellarLikeTransactionType,\n zTezosLikeTransactionType,\n} from \"@/transactions\";\nimport { zNote } from \"@/types\";\nimport { ensureNonEmptyArray } from \"@/utils\";\n\nexport const zTransactionStatus = z.enum([\"SUCCESSFUL\", \"FAILED\"]);\n\nexport type TransactionStatus = z.infer<typeof zTransactionStatus>;\n\nconst zBitcoinLikeCoinFields = z.object({\n type: zBitcoinLikeTransactionType,\n});\n\nconst zCardanoLikeCoinFields = z.object({\n type: zCardanoLikeTransactionType,\n});\n\nconst zEthereumLikeTransferCoinFields = z.object({\n type: zEthereumLikeTransferTransactionType,\n gasPrice: z.string(),\n gasLimit: z.string(),\n nonce: z.string(),\n});\n\nconst zEthereumLikeContractCoinFields = zEthereumLikeTransferCoinFields.extend({\n type: zEthereumLikeContractTransactionType,\n contractData: z.string().describe(\"Contract deployment or contract execution data\"),\n});\n\nconst zGenericCoinFields = z.object({\n type: zGenericTransactionType,\n});\n\nconst zPolkadotLikeCoinFields = z.object({\n type: zPolkadotLikeTransactionType,\n});\n\nconst zRippleLikeCoinFields = z.object({\n type: zRippleLikeTransactionType,\n memos: z.array(z.string()),\n destinationTag: z.string(),\n});\n\nconst zSolanaLikeCoinFields = z.object({\n type: zSolanaLikeTransactionType,\n});\n\nconst zStellarLikeCoinFields = z.object({\n type: zStellarLikeTransactionType,\n});\n\nconst zTezosLikeCoinFields = z.object({\n type: zTezosLikeTransactionType,\n});\nexport const zCommonTransactionResponse = z.object({\n id: z.string().describe(\"Internal unique identifier\"),\n hash: z.string().describe(\"Transaction hash\"),\n block: z.object({\n height: z.string().nullable().describe(\"Transaction block height\"),\n time: z.string().nullable().describe(\"Transaction block time\"),\n }),\n status: zTransactionStatus.describe(\"Transaction status\"),\n confirmations: z.string().describe(\"Block confirmations\"),\n amount: z.string().describe(\"Transaction amount\"),\n fee: z.string().describe(\"Transaction fee\"),\n senders: z.array(z.string()).describe(\"Senders (can be multiple for UTXOs-based accounts)\"),\n recipients: z\n .array(z.string())\n .describe(\"Recipients (can be multiple for multi-output transactions)\"),\n});\n\nconst zBitcoinLikeTransactionResponse = zCommonTransactionResponse\n .merge(zBitcoinLikeCoinFields)\n .describe(\"Bitcoin-like transaction\");\n\nconst zCardanoLikeTransactionResponse = zCommonTransactionResponse\n .merge(zCardanoLikeCoinFields)\n .describe(\"Cardano-like transaction\");\n\nconst zEthereumLikeTransferTransactionResponse = zCommonTransactionResponse\n .merge(zEthereumLikeTransferCoinFields)\n .describe(\"Ethereum-like transfer transaction\");\n\nconst zEthereumLikeContractTransactionResponse = zCommonTransactionResponse\n .merge(zEthereumLikeContractCoinFields)\n .describe(\"Ethereum-like contract transaction\");\n\nconst zGenericTransactionResponse = zCommonTransactionResponse\n .merge(zGenericCoinFields)\n .describe(\"Generic transaction\");\n\nconst zPolkadotLikeTransactionResponse = zCommonTransactionResponse\n .merge(zPolkadotLikeCoinFields)\n .describe(\"Polkadot-like transaction\");\n\nconst zRippleLikeTransactionResponse = zCommonTransactionResponse\n .merge(zRippleLikeCoinFields)\n .describe(\"Ripple-like transaction\");\n\nconst zSolanaLikeTransactionResponse = zCommonTransactionResponse\n .merge(zSolanaLikeCoinFields)\n .describe(\"Solana-like transaction\");\n\nconst zStellarLikeTransactionResponse = zCommonTransactionResponse\n .merge(zStellarLikeCoinFields)\n .describe(\"Stellar-like transaction\");\n\nconst zTezosLikeTransactionResponse = zCommonTransactionResponse\n .merge(zTezosLikeCoinFields)\n .describe(\"Tezos-like transaction\");\n\nexport const zTransactionResponse = z.discriminatedUnion(\"type\", [\n zBitcoinLikeTransactionResponse,\n zCardanoLikeTransactionResponse,\n zEthereumLikeTransferTransactionResponse,\n zEthereumLikeContractTransactionResponse,\n zGenericTransactionResponse,\n zPolkadotLikeTransactionResponse,\n zRippleLikeTransactionResponse,\n zSolanaLikeTransactionResponse,\n zStellarLikeTransactionResponse,\n zTezosLikeTransactionResponse,\n]);\n\nexport type TransactionResponse = z.infer<typeof zTransactionResponse>;\n\nexport const zTransactionWithMetaResponse = z.discriminatedUnion(\n zTransactionResponse.discriminator,\n ensureNonEmptyArray(\n zTransactionResponse.options.map((_) => _.extend({ note: zNote.nullable() })),\n ),\n);\n\nexport type TransactionWithMetaResponse = z.infer<typeof zTransactionWithMetaResponse>;\n","import { AccountType } from \"@prisma/client\";\nimport { z } from \"zod\";\n\nexport const zBitcoinLikeAssetFields = z\n .object({\n type: z.literal(AccountType.BITCOIN_LIKE).describe(\"Account type\"),\n xpub: z.string().describe(\"xpub (extended public key)\"),\n })\n .describe(\"Bitcoin-like\");\n\nexport const zCardanoLikeAssetFields = z\n .object({\n type: z.literal(AccountType.CARDANO_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n .describe(\"Cardano-like\");\n\nexport const zEthereumLikeAssetFields = z\n .object({\n type: z.literal(AccountType.ETHEREUM_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n .describe(\"Ethereum-like\");\n\nexport const zEthereumTokenLikeAssetFields = z\n .object({\n type: z\n .enum([AccountType.ERC20_LIKE, AccountType.BEP20_LIKE, AccountType.TRC20_LIKE])\n .describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n contractAddress: z.string().describe(\"Token contract address\"),\n })\n .describe(\"Ethereum-like token\");\n\nexport const zGenericLikeAssetFields = z\n .object({ type: z.literal(AccountType.GENERIC_LIKE).describe(\"Account type\") })\n .describe(\"Generic-like\");\n\nexport const zRawSigningAssetFields = z\n .object({ type: z.literal(AccountType.RAW_SIGNING).describe(\"Account type\") })\n .describe(\"Raw signing account\");\n\nexport const zPolkadotLikeAssetFields = z\n .object({\n type: z.literal(AccountType.POLKADOT_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n\n .describe(\"Polkadot-like\");\n\nexport const zRippleLikeAssetFields = z\n .object({\n type: z.literal(AccountType.RIPPLE_LIKE).describe(\"Account type\"),\n xpub: z.string().describe(\"xpub (extended public key)\"),\n })\n .describe(\"Ripple-like\");\n\nexport const zSolanaLikeAssetFields = z\n .object({\n type: z.literal(AccountType.SOLANA_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n contractAddress: z.string().describe(\"Token contract address\").nullable(),\n })\n .describe(\"Solana-like\");\n\nexport const zStellarLikeAssetFields = z\n .object({\n type: z.literal(AccountType.STELLAR_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n .describe(\"Stellar-like\");\n\nexport const zTezosLikeAssetFields = z\n .object({\n type: z.literal(AccountType.TEZOS_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n .describe(\"Tezos-like\");\n\nexport type BitcoinLikeAssetFields = z.infer<typeof zBitcoinLikeAssetFields>;\nexport type CardanoLikeAssetFields = z.infer<typeof zCardanoLikeAssetFields>;\nexport type EthereumLikeAssetFields = z.infer<typeof zEthereumLikeAssetFields>;\nexport type EthereumTokenLikeAssetFields = z.infer<typeof zEthereumTokenLikeAssetFields>;\nexport type GenericLikeAssetFields = z.infer<typeof zGenericLikeAssetFields>;\nexport type RawSigningAssetFields = z.infer<typeof zRawSigningAssetFields>;\nexport type PolkadotLikeAssetFields = z.infer<typeof zPolkadotLikeAssetFields>;\nexport type RippleLikeAssetFields = z.infer<typeof zRippleLikeAssetFields>;\nexport type SolanaLikeAssetFields = z.infer<typeof zSolanaLikeAssetFields>;\nexport type StellarLikeAssetFields = z.infer<typeof zStellarLikeAssetFields>;\nexport type TezosLikeAssetFields = z.infer<typeof zTezosLikeAssetFields>;\n\n/**\n * Asset fields.\n */\nexport const zAccountAssetStaticFields = z\n .discriminatedUnion(\"type\", [\n zBitcoinLikeAssetFields,\n zCardanoLikeAssetFields,\n zEthereumLikeAssetFields,\n zEthereumTokenLikeAssetFields,\n zGenericLikeAssetFields,\n zPolkadotLikeAssetFields,\n zRawSigningAssetFields,\n zRippleLikeAssetFields,\n zSolanaLikeAssetFields,\n zStellarLikeAssetFields,\n zTezosLikeAssetFields,\n ])\n .describe(\"Account asset fields\");\n\nexport type AccountAssetStaticFields = z.infer<typeof zAccountAssetStaticFields>;\n","import type { ReviewConfig, User } from \"@prisma/client\";\nimport { isEqual, zip } from \"lodash\";\nimport { z } from \"zod\";\n\nimport type { GroupWithMembers } from \"@/groups\";\nimport { ensureNotNil, wrapToObjectsWithId } from \"@/utils\";\n\ntype UsersAndGroups = {\n users: User[];\n groups: GroupWithMembers[];\n};\n\nexport type ReviewConfigWithMembers = ReviewConfig & UsersAndGroups;\n\nexport const zReviewStepWithUsers = z\n .object({\n quorum: z.number().min(0).describe(\"Number of required approvals for the step\"),\n userIds: z.array(z.string().min(1)).describe(\"User ids in the step\"), // PKs to `User` model\n })\n .describe(\"Review step with users\");\n\nexport type ReviewStepWithUsers = z.infer<typeof zReviewStepWithUsers>;\n\nexport const zReviewStepWithUsersArray = z.array(zReviewStepWithUsers);\n\nexport const zReviewStepData = z.union([\n zReviewStepWithUsers,\n z\n .object({\n quorum: z.number().min(0).describe(\"Number of required approvals for the step\"),\n groupId: z.string().min(1).describe(\"Group id in the step\"), // PKs to `Group` model\n })\n .describe(\"Review step with group\"),\n]);\n\nexport type ReviewStepData = z.infer<typeof zReviewStepData>;\n\nexport const zReviewStepsArray = z.array(zReviewStepData).min(1).describe(\"Review steps\");\n\n/**\n * Compares two review steps arrays and return whether they are equivalent. They are equivalent\n * if they contain the same number of review steps, and for each review step, the quorum and\n * members (regardless of the order) are the same.\n */\nexport const reviewStepsAreEquivalent = (\n steps: ReviewStepData[],\n otherSteps: ReviewStepData[],\n): boolean => {\n if (steps.length !== otherSteps.length) {\n return false;\n }\n\n const isEquivalent = ([step, otherStep]: [\n ReviewStepData | undefined,\n ReviewStepData | undefined,\n ]): boolean => {\n // We should not see undefined as we should have already compared the length of the steps.\n /* v8 ignore start */\n if (step === undefined || otherStep === undefined) {\n return false;\n }\n /* v8 ignore stop */\n if (step.quorum !== otherStep.quorum) {\n return false;\n }\n if (\"userIds\" in step && \"userIds\" in otherStep) {\n // The ordering is not important.\n return isEqual(step.userIds.slice().sort(), otherStep.userIds.slice().sort());\n }\n if (\"groupId\" in step && \"groupId\" in otherStep) {\n return step.groupId === otherStep.groupId;\n }\n // One has `userIds` while the other has `groupId`...\n return false;\n };\n\n return zip(steps, otherSteps).every(isEquivalent);\n};\n\n// Connect `ReviewConfig` to its related users and groups.\ntype ReviewConfigConnections = {\n users: { connect: { id: string }[] };\n groups: { connect: { id: string }[] };\n};\n\n/**\n * Given a data containing review steps, connect the related users and groups.\n *\n * Note: This function does NOT check if referenced users or groups exist in DB. If any of them\n * does not exist, prisma will throw an error when creating or updating objects in DB.\n */\nexport const connectReviewConfigData = <T extends { steps: ReviewStepData[] }>(\n data: T,\n): Omit<T, \"users\" | \"groups\"> & ReviewConfigConnections => {\n const { steps } = data;\n const userIds = steps.flatMap((step) => (\"userIds\" in step ? step.userIds : []));\n const groupIds = steps.flatMap((step) => (\"groupId\" in step ? [step.groupId] : []));\n return {\n ...data,\n users: { connect: wrapToObjectsWithId(userIds) },\n groups: { connect: wrapToObjectsWithId(groupIds) },\n };\n};\n\nexport type EnrichedReviewConfig = Omit<ReviewConfigWithMembers, \"steps\"> & {\n steps: ReviewStepData[];\n};\n\nexport const enrichReviewConfig = (reviewConfig: ReviewConfigWithMembers): EnrichedReviewConfig => {\n const steps = zReviewStepsArray.parse(reviewConfig.steps);\n return {\n ...reviewConfig,\n steps,\n };\n};\n\n/** Return individual users or group (with members) in a given review step. */\nexport const getReviewStepUsersOrGroup = (\n reviewConfig: ReviewConfigWithMembers,\n stepIndex: number,\n): { users: User[]; group: GroupWithMembers | null } => {\n const step = enrichReviewConfig(reviewConfig).steps[stepIndex];\n if (step === undefined) {\n return { users: [], group: null };\n }\n\n let users: User[];\n let group: GroupWithMembers | null;\n if (\"userIds\" in step) {\n users = step.userIds.map((userId) =>\n ensureNotNil(reviewConfig.users.find((_) => _.id === userId)),\n );\n group = null;\n } else {\n users = [];\n group = ensureNotNil(reviewConfig.groups.find((_) => _.id === step.groupId));\n }\n return { users, group };\n};\n\n/**\n * Return all the members in a given review step. This includes individual users and group members.\n * If the step index is out of bound, return an empty array.\n */\nexport const getReviewStepMembers = (\n reviewConfig: ReviewConfigWithMembers,\n stepIndex: number,\n): User[] => {\n const { users, group } = getReviewStepUsersOrGroup(reviewConfig, stepIndex);\n return users.concat(group?.members ?? []);\n};\n","import type { Policy, Prisma } from \"@prisma/client\";\nimport { z } from \"zod\";\n\nimport { zOperationType } from \"@/types\";\nimport { zHsmObjectId, zUnsignedIntString } from \"@/zod-utils\";\n\nexport const zThreshold = z\n .object({\n min: zUnsignedIntString.nullable().describe(\"Minimum transaction amount\"),\n max: zUnsignedIntString.nullable().describe(\"Maximum transaction amount\"),\n })\n .describe(\"Threshold for the transaction value\");\n\nexport type Threshold = z.infer<typeof zThreshold>;\n\nexport const zWhitelistIds = z\n .array(z.string().min(1))\n .describe(\"IDs of whitelists for the recipient address\");\n\n// Shape of the policy model rulesJsonArray field\nexport const zGovRuleJsonObject = z\n .object({\n // Required.\n operationType: zOperationType.describe(\"Allowed operation type\"),\n // Optional threshold on transaction value: null `min` = 0, null `max` = +inf\n threshold: zThreshold,\n // Optional whitelist on transaction recipient: Empty list means no whitelist.\n whitelistIds: zWhitelistIds,\n reviewConfigId: z.string().min(1).describe(\"Id of ReviewConfig\"),\n // HSM id for the rule\n hsmId: zHsmObjectId,\n })\n .describe(\"INTERNAL: Governance rule JSON representation in DB\");\n\nexport type GovRuleJsonObject = z.infer<typeof zGovRuleJsonObject>;\n\nexport const zGovRulesJsonArray = z.array(zGovRuleJsonObject);\n\ntype PolicyJsonFields = { rulesJsonArray: Prisma.JsonValue };\n\nexport type ParsedPolicy<T extends PolicyJsonFields = Policy> = Omit<T, \"rulesJsonArray\"> & {\n rulesJsonArray: GovRuleJsonObject[];\n};\n\nexport const parseFields = <T extends PolicyJsonFields>(policy: T): ParsedPolicy<T> => {\n const rulesJsonArray = zGovRulesJsonArray.parse(policy.rulesJsonArray);\n return { ...policy, rulesJsonArray };\n};\n","export const INCLUDE_MEMBERS = {\n users: true,\n groups: {\n include: { members: true },\n },\n};\n","import z from \"zod\";\n\nexport const zUpdateQuorumRequestData = z.object({\n quorum: z.number().int().min(2).describe(\"Workspace quorum\"),\n});\n\nexport type UpdateQuorumRequestData = z.infer<typeof zUpdateQuorumRequestData>;\n","import { ActivationStatus, type PrismaClient, type Workspace } from \"@prisma/client\";\nimport z from \"zod\";\n\nexport const zWorkspaceName = z\n .string()\n .min(1)\n .max(20)\n .regex(/^[a-z0-9]+$/);\n\nexport const getActiveWorkspaceOrThrow = async (\n name: string,\n prisma: PrismaClient,\n): Promise<Workspace> => {\n return prisma.workspace.findUniqueOrThrow({\n where: { name, status: ActivationStatus.ACTIVE },\n });\n};\n","import z from \"zod\";\n\nimport { zWorkspaceName } from \"@/workspaces\";\nimport { zCurrency, zUnsignedIntString } from \"@/zod-utils\";\n\nexport const zTradelinkWhitelistAddress = z.object({\n name: z.string().min(1),\n currency: zCurrency,\n address: z.string().min(1),\n});\n\nexport type TradelinkWhitelistAddress = z.infer<typeof zTradelinkWhitelistAddress>;\n\nexport const zTradelinkWhitelist = z.array(zTradelinkWhitelistAddress);\n\nconst zTradelinkId = z.string().describe(\"Unique identifier in Tradelink service\");\n\nexport type TradelinkId = z.infer<typeof zTradelinkId>;\n\nexport const zTradelinkOrgEntityResponse = z.object({\n tradelinkId: zTradelinkId,\n name: z.string().describe(\"Name\"),\n code: z.string().describe(\"Code\"),\n logoUrl: z.string().describe(\"Logo URL\"),\n});\n\nexport type TradelinkOrgEntityResponse = z.infer<typeof zTradelinkOrgEntityResponse>;\n\nexport const zCreateTradelinkOrgEntityInput = zTradelinkOrgEntityResponse.omit({\n tradelinkId: true,\n});\n\nexport type CreateTradelinkOrgEntityInput = z.infer<typeof zCreateTradelinkOrgEntityInput>;\n\nexport const zDeleteTradelinkOrgEntityInput = z.object({\n tradelinkId: zTradelinkId,\n});\n\nexport type DeleteTradelinkExchangeInput = z.infer<typeof zDeleteTradelinkOrgEntityInput>;\n\nconst zTradelinkExchangeConfig = z.object({\n exchangeId: z.string().describe(\"Tradelink exchange id\"),\n repledgeAuthorized: z\n .boolean()\n .describe(\"Determines whether this exchange is authorized to repledge on this account\"),\n needsAssetManagerApprovalForSettlements: z\n .boolean()\n .describe(\n 'Determines whether asset manager will \"pre-approve\" the settlement requests on this account',\n ),\n});\n\nexport type TradelinkExchangeConfig = z.infer<typeof zTradelinkExchangeConfig>;\n\nexport const zTradelinkExchangeConfigs = z.array(zTradelinkExchangeConfig);\n\nexport type TradelinkExchangeConfigs = z.infer<typeof zTradelinkExchangeConfigs>;\n\nexport const zCreateTradelinkNetworkBlueprintInput = z.object({\n workspaceName: zWorkspaceName,\n custodian: z.object({ name: z.string() }),\n assetManagers: z.array(z.object({ name: z.string() })),\n exchanges: z.array(z.object({ name: z.string() })),\n});\nexport type CreateTradelinkNetworkBlueprintInput = z.infer<\n typeof zCreateTradelinkNetworkBlueprintInput\n>;\n\nexport const zTradelinkNetworkBlueprintResponse = z.object({\n tradelinkId: z.string(),\n workspaceName: zWorkspaceName,\n custodian: zTradelinkOrgEntityResponse,\n assetManagers: z.array(zTradelinkOrgEntityResponse),\n exchanges: z.array(zTradelinkOrgEntityResponse),\n});\nexport type TradelinkNetworkBlueprintResponse = z.infer<typeof zTradelinkNetworkBlueprintResponse>;\n\n// #region ---------- Pledge ----------------------------------------------------------------------\n\nconst zTradelinkAsset = z.object({\n name: z.string(),\n magnitude: z.number().int().nonnegative(),\n});\n\nexport type TradelinkAsset = z.infer<typeof zTradelinkAsset>;\n\nexport const zPledgeResponse = z.object({\n tradelinkId: zTradelinkId,\n asset: zTradelinkAsset,\n state: z.enum([\n \"PLEDGE_READY\",\n \"PLEDGE_INCREMENT_PENDING_APPROVAL\",\n \"PLEDGE_APPROVED\",\n \"PLEDGE_REJECTED\",\n \"UNPLEDGE_PENDING_APPROVAL\",\n \"UNPLEDGE_APPROVED\",\n \"UNPLEDGE_REJECTED\",\n \"REPLEDGE_PENDING_APPROVAL\",\n \"REPLEDGE_APPROVED\",\n \"REPLEDGE_REJECTED\",\n \"ASSIGNED_TO_SETTLEMENT\",\n \"OUTBOUND_TRANSACTION_CONFIRMED\",\n \"OUTBOUND_TRANSACTION_FAILED\",\n \"RECOVERING_FROM_FAILURE\",\n \"PLEDGE_CONSUMED\",\n ]),\n isLocked: z.boolean(),\n amount: z.string().describe(\"Currently pledged amount\"),\n pending: z.string().describe(\"Requested pledge increment, not yet approved\"),\n repledge: z.string().describe(\"TODO: describe this field\"),\n exchangeTradelinkId: z.string(),\n accountId: z.string(),\n});\n\nexport type PledgeResponse = z.infer<typeof zPledgeResponse>;\n\nexport const zCreatePledgeInput = z.object({\n workspaceName: z.string(),\n clientAccountId: z.string().describe(\"Account ID from the client side\"),\n exchangeTradelinkId: zTradelinkId,\n asset: zTradelinkAsset,\n});\n\nexport type CreatePledgeInput = z.infer<typeof zCreatePledgeInput>;\n\nexport const zPledgeAdjustmentInput = z.object({\n pledgeTradelinkId: zTradelinkId,\n amount: zUnsignedIntString,\n asset: zTradelinkAsset,\n});\n\nexport type PledgeAdjustmentInput = z.infer<typeof zPledgeAdjustmentInput>;\n\nexport const zSettlementResponse = z.object({\n tradelinkId: z.string(),\n pledgeTradelinkId: z.string(),\n state: z.enum([\n \"REGISTERED\",\n \"PENDING_REPLEDGE_CREATION_APPROVAL\",\n \"PENDING_REPLEDGE_APPROVAL\",\n \"PENDING_CREATION_APPROVAL\",\n \"PENDING_PRE_APPROVAL\",\n \"PRE_APPROVED\",\n \"APPROVED\",\n \"REJECTED\",\n \"CONFIRMED\",\n \"FAILED\",\n \"CANCELED\",\n ]),\n // For now we only consider the outbound settlement\n outboundTransactionHash: z.string().nullable(),\n});\n\nexport type SettlementResponse = z.infer<typeof zSettlementResponse>;\n\n// #endregion\n","import z from \"zod\";\n\nimport { zReviewStepWithUsersArray } from \"@/governance\";\nimport { zSendOnlyTransactionData } from \"@/transactions\";\nimport { zIntString } from \"@/zod-utils\";\n\nimport { zTradelinkWhitelistAddress } from \"./types\";\n\nexport const zCustodianRequestData = z.object({\n settlement: zReviewStepWithUsersArray.describe(\"List of settlement review steps\"),\n withdraw: zReviewStepWithUsersArray.describe(\"List of withdraw review steps\"),\n arbitration: zReviewStepWithUsersArray.describe(\"List of arbitration review steps\"),\n});\n\nexport type CustodianRequestData = z.infer<typeof zCustodianRequestData>;\n\nexport const zTradelinkEntityRequestData = z.object({\n tradelinkId: z.string().min(1),\n groups: zReviewStepWithUsersArray.describe(\"List of asset manager review groups\"),\n whitelist: z\n .array(zTradelinkWhitelistAddress)\n .describe(\"List of asset manager whitelisted addresses\"),\n});\n\nexport type TradelinkEntityRequestData = z.infer<typeof zTradelinkEntityRequestData>;\n\n// #region ---------- Tradelink operations --------------------------------------------------------\n\nexport const zAdjustPledgeRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n exchangeId: z.string().describe(\"Exchange id\"),\n amount: zIntString.describe(\"Amount to add to pledge\"),\n});\n\nexport type AdjustPledgeRequestData = z.infer<typeof zAdjustPledgeRequestData>;\n\nexport const zRepledgeRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n exchangeId: z.string().describe(\"Exchange id\"),\n amount: zIntString.describe(\"Amount to add to pledge\"),\n});\n\nexport type RepledgeRequestData = z.infer<typeof zRepledgeRequestData>;\n\nexport const zCreateSettlementRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n exchangeId: z.string().describe(\"Exchange id\"),\n transaction: zSendOnlyTransactionData,\n});\n\nexport type CreateSettlementRequestData = z.infer<typeof zCreateSettlementRequestData>;\n\nexport const zForceUnpledgeRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n exchangeId: z.string().describe(\"Exchange id\"),\n});\n\nexport type ForceUnpledgeRequestData = z.infer<typeof zForceUnpledgeRequestData>;\n\nexport const zTradelinkWithdrawRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n transaction: zSendOnlyTransactionData,\n});\n\nexport type TradelinkWithdrawRequestData = z.infer<typeof zTradelinkWithdrawRequestData>;\n\nexport const zTradelinkArbitrationRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n transaction: zSendOnlyTransactionData,\n});\n\nexport type TradelinkArbitrationRequestData = z.infer<typeof zTradelinkArbitrationRequestData>;\n\n// #endregion\n","import { AccountGovernanceType } from \"@prisma/client\";\nimport { z } from \"zod\";\n\nimport { zTradelinkExchangeConfigs } from \"@/tradelink\";\n\nconst zClassicAccountGovernanceFields = z\n .object({\n type: z.literal(AccountGovernanceType.CLASSIC).describe(\"Classic account governance\"),\n policyId: z.string().describe(\"Identifier of corresponding governance policy\"),\n })\n .describe(\"Classic\");\n\nconst zTradelinkAccountGovernanceFields = z\n .object({\n type: z.literal(AccountGovernanceType.TRADELINK).describe(\"Tradelink account governance\"),\n assetManagerId: z.string().describe(\"Identifier of corresponding asset manager\"),\n exchangeConfigs: zTradelinkExchangeConfigs.describe(\"Tradelink exchange configurations\"),\n })\n .describe(\"Tradelink\");\n\nexport const zAccountGovernanceFields = z\n .discriminatedUnion(\"type\", [zClassicAccountGovernanceFields, zTradelinkAccountGovernanceFields])\n .describe(\"Governance fields\");\n\nexport type AccountGovernanceFields = z.infer<typeof zAccountGovernanceFields>;\n","import { AccountType } from \"@prisma/client\";\nimport z from \"zod\";\n\n// #region ---------- Cardano ---------------------------------------------------------------------\n\nexport const zCardanoLikeStakingData = z\n .object({\n staked: z.string().describe(\"Staked balance\"),\n })\n .nullable()\n .describe(\"Cardano-like staking data\");\n\nexport type CardanoLikeStakingData = z.infer<typeof zCardanoLikeStakingData>;\n\nexport const zCardanoLikeStakingFields = z.object({\n type: z.literal(AccountType.CARDANO_LIKE).describe(\"Account type\"),\n staking: zCardanoLikeStakingData.optional(),\n});\n\nexport type CardanoLikeStakingFields = z.infer<typeof zCardanoLikeStakingFields>;\n\n// #endregion\n\n// #region ---------- Ethereum --------------------------------------------------------------------\n\nexport const zEthereumLikeStakingData = z\n .object({\n totalStaking: z.string().describe(\"Total staked amount\"),\n totalRewards: z.string().describe(\"Total of rewards\"),\n availableRewards: z.string().describe(\"Available rewards\"),\n networkApy: z.number().describe(\"Network APY\"),\n })\n .nullable()\n .describe(\"Ethereum-like staking data\");\n\nexport type EthereumLikeStakingData = z.infer<typeof zEthereumLikeStakingData>;\n\nexport const zEthereumLikeStakingFields = z.object({\n type: z.literal(AccountType.ETHEREUM_LIKE).describe(\"Account type\"),\n staking: zEthereumLikeStakingData.optional(),\n});\n\nexport type EthereumLikeStakingFields = z.infer<typeof zEthereumLikeStakingFields>;\n\n// #endregion\n\n// #region ---------- Polkadot --------------------------------------------------------------------\n\nexport const zPolkadotUnbondingAmount = z.object({\n amount: z.string().describe(\"Amount\"),\n waiting_time: z.string().describe(\"Waiting time\"),\n});\n\nexport const zPolkadotLikeStakingData = z\n .object({\n info: z.object({\n controllerAddress: z.string().nullable().describe(\"Controller address\"),\n rewardsDestination: z.string().nullable().describe(\"Rewards destination\"),\n proxies: z.array(z.string()).describe(\"Proxies\"),\n legacyStaking: z.boolean().describe(\"True if account uses legacy staking\"),\n isNominator: z.boolean().describe(\"True if is nominator\"),\n }),\n balances: z.object({\n free: z.string().describe(\"Free balance\"),\n reserved: z.string().describe(\"Reserved balance\"),\n frozen: z.string().describe(\"Frozen balance\"),\n bonded: z.string().describe(\"Bonded balance\"),\n available: z.string().describe(\"Available balance\"),\n unbonding: z.array(zPolkadotUnbondingAmount).describe(\"Unbonding balances\"),\n unbonded: z.array(zPolkadotUnbondingAmount).describe(\"Unbonded balances\"),\n totalUnbonding: z.string().describe(\"Total unbonding\"),\n totalUnbonded: z.string().describe(\"Total unbonded\"),\n }),\n anonymousProxy: z\n .object({\n address: z.string().describe(\"Address\"),\n createdAt: z.string().describe(\"Creation date\"),\n isController: z.boolean().describe(\"True if is controller\"),\n isMain: z.boolean().describe(\"True if is main\"),\n balances: z\n .object({\n free: z.string().describe(\"Anonymous proxy free balance\"),\n reserved: z.string().describe(\"Anonymous proxy reserved balance\"),\n frozen: z.string().describe(\"Anonymous proxy frozen balance\"),\n bonded: z.string().describe(\"Anonymous proxy bonded balance\"),\n available: z.string().describe(\"Anonymous proxy available balance\"),\n total: z.string().describe(\"Anonymous proxy total balance\"),\n })\n .nullable(),\n blockHeight: z.string().describe(\"Anonymous proxy block height\"),\n extIndex: z.string().describe(\"Ext index\"),\n index: z.string().describe(\"Index\"),\n kind: z.string().describe(\"Kind\"),\n })\n .nullable()\n .describe(\"Anonymous proxy\"),\n })\n .nullable()\n .describe(\"Polkadot-like staking data\");\n\nexport type PolkadotLikeStakingData = z.infer<typeof zPolkadotLikeStakingData>;\n\nexport const zPolkadotLikeStakingFields = z.object({\n type: z.literal(AccountType.POLKADOT_LIKE).describe(\"Account type\"),\n staking: zPolkadotLikeStakingData.optional(),\n});\n\nexport type PolkadotLikeStakingFields = z.infer<typeof zPolkadotLikeStakingFields>;\n\n// #endregion\n\n// #region ---------- Solana ----------------------------------------------------------------------\n\nexport const zSolanaStakingAccountStatus = z\n .enum([\"not_sync\", \"activating\", \"activated\", \"deactivating\", \"deactivated\", \"deleted\"])\n .describe(\"Staking account status\");\n\nexport const zSolanaLikeStakingData = z\n .object({\n staked: z.string().describe(\"Staked balance\"),\n rewards: z.object({\n total: z.string().describe(\"Total rewards\"),\n last7: z.string().describe(\"Rewards on last 7 days\"),\n last30: z.string().describe(\"Rewards on last 30 days\"),\n }),\n stakes: z.array(\n z.object({\n uid: z.string(),\n baseAccountUid: z.string(),\n pubKey: z.string().describe(\"Public key\"),\n validatorPubKey: z.string().nullable().describe(\"Validator public key\"),\n initialAmount: z.string().describe(\"Initial amount\"),\n activeAmount: z.string().describe(\"Active amount\"),\n inactiveAmount: z.string().describe(\"Inactive amount\"),\n totalBalance: z.string().describe(\"Total balance\"),\n creationDate: z.string().describe(\"Creation date\"),\n activationEpoch: z.string().nullable().describe(\"Activation epoch\"),\n activationDate: z.string().nullable().describe(\"Activation date\"),\n deactivationEpoch: z.string().nullable().describe(\"Deactivation epoch\"),\n deactivationDate: z.string().nullable().describe(\"Deactivation date\"),\n status: zSolanaStakingAccountStatus,\n rentExemptReserve: z.string().describe(\"Rent exempt reserve\"),\n withdrawableAmount: z.string().describe(\"Withdrawable amount\"),\n totalRewards: z.string().describe(\"Total rewards\"),\n creationTxHash: z.string().nullable().describe(\"Creation transaction hash\"),\n actionsTxHashes: z.array(z.string()).describe(\"Actions transactions hashes\"),\n }),\n ),\n })\n .nullable()\n .describe(\"Solana-like staking data\");\n\nexport type SolanaLikeStakingData = z.infer<typeof zSolanaLikeStakingData>;\n\nexport const zSolanaLikeStakingFields = z.object({\n type: z.literal(AccountType.SOLANA_LIKE).describe(\"Account type\"),\n staking: zSolanaLikeStakingData.optional(),\n});\n\nexport type SolanaLikeStakingFields = z.infer<typeof zSolanaLikeStakingFields>;\n\n// #endregion\n\n// #region ---------- Tezos -----------------------------------------------------------------------\n\nexport const zTezosLikeStakingData = z\n .object({\n delegations: z.array(\n z.object({\n address: z.string(),\n }),\n ),\n })\n .nullable()\n .describe(\"Tezos-like staking data\");\n\nexport type TezosLikeStakingData = z.infer<typeof zTezosLikeStakingData>;\n\nexport const zTezosLikeStakingFields = z.object({\n type: z.literal(AccountType.TEZOS_LIKE).describe(\"Account type\"),\n staking: zTezosLikeStakingData.optional(),\n});\n\nexport type TezosLikeStakingFields = z.infer<typeof zTezosLikeStakingFields>;\n\n// #endregion\n\nexport const zAccountStakingFields = z.discriminatedUnion(\"type\", [\n zCardanoLikeStakingFields,\n zEthereumLikeStakingFields,\n zPolkadotLikeStakingFields,\n zSolanaLikeStakingFields,\n zTezosLikeStakingFields,\n]);\n\nexport type AccountStakingFields = z.infer<typeof zAccountStakingFields>;\n","import { AccountType, ActivationStatus } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport { zCurrency } from \"@/zod-utils\";\n\nimport { zAccountAssetStaticFields } from \"./account-asset-fields\";\nimport { zAccountGovernanceFields } from \"./account-governance-fields\";\nimport {\n zCardanoLikeStakingFields,\n zEthereumLikeStakingFields,\n zPolkadotLikeStakingFields,\n zSolanaLikeStakingFields,\n zTezosLikeStakingFields,\n} from \"./account-staking-fields\";\n\nexport const zAccountCommonFields = z.object({\n id: z.string().describe(\"Internal unique identifier\"),\n legacyId: z.number().describe(\"Legacy internal unique identifier (for retro-compatibility)\"),\n name: z.string().describe(\"Name\"),\n currency: zCurrency,\n index: z.number().gte(0).describe(\"BIP44 account index\"),\n derivationPath: z.string().describe(\"Derivation path\"),\n status: z.nativeEnum(ActivationStatus).describe(\"Status\"),\n createdAt: z.coerce.date().describe(\"Creation timestamp\"),\n updatedAt: z.coerce.date().describe(\"Last modification timestamp\"),\n});\n\nexport const zAccountBalanceFields = z\n .object({\n total: z.string().describe(\"Total balance\"),\n pending: z.string().describe(\"Pending balance\"),\n })\n .describe(\"Balance fields\");\n\nexport type AccountBalanceFields = z.infer<typeof zAccountBalanceFields>;\n\nexport const zAccountResponse = zAccountCommonFields.extend({\n asset: zAccountAssetStaticFields,\n governance: zAccountGovernanceFields,\n});\n\nexport type AccountResponse = z.infer<typeof zAccountResponse>;\n\nexport const zAccountSortBy = z\n .enum([\n \"name\",\n \"currency\",\n \"index\",\n \"createdAt\",\n \"updatedAt\",\n ] as const satisfies (keyof AccountResponse)[])\n .default(\"createdAt\");\n\nexport type AccountSortBy = z.infer<typeof zAccountSortBy>;\n\nconst zCommonLiveData = z.object({\n id: z.string().describe(\"Account internal unique identifier\"),\n balance: zAccountBalanceFields,\n});\n\nconst zBitcoinLikeLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.BITCOIN_LIKE).describe(\"Account type\"),\n })\n .describe(\"Bitcoin-like\");\n\nconst zCardanoLikeLiveData = zCommonLiveData\n .merge(zCardanoLikeStakingFields)\n .describe(\"Cardano-like\");\n\nconst zEthereumLikeLiveData = zCommonLiveData\n .merge(zEthereumLikeStakingFields)\n .describe(\"Ethereum-like\");\n\nconst zEthereumTokenLikeLiveData = zCommonLiveData\n .extend({\n type: z\n .enum([AccountType.ERC20_LIKE, AccountType.BEP20_LIKE, AccountType.TRC20_LIKE])\n .describe(\"Account type\"),\n })\n .describe(\"Ethereum-like token\");\n\nconst zGenericLikeLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.GENERIC_LIKE).describe(\"Account type\"),\n })\n .describe(\"Generic-like\");\n\nconst zPolkadotLikeLiveData = zCommonLiveData\n .merge(zPolkadotLikeStakingFields)\n .describe(\"Polkadot-like\");\n\nconst zRawSigningLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.RAW_SIGNING).describe(\"Account type\"),\n })\n .describe(\"Raw signing account\");\n\nconst zRippleLikeLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.RIPPLE_LIKE).describe(\"Account type\"),\n })\n .describe(\"Ripple-like\");\n\nconst zSolanaLikeLiveData = zCommonLiveData.merge(zSolanaLikeStakingFields).describe(\"Solana-like\");\n\nconst zStellarLikeLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.STELLAR_LIKE).describe(\"Account type\"),\n })\n .describe(\"Stellar-like\");\n\nconst zTezosLikeLiveData = zCommonLiveData.merge(zTezosLikeStakingFields).describe(\"Tezos-like\");\n\nexport const zAccountLiveData = z.discriminatedUnion(\"type\", [\n zBitcoinLikeLiveData,\n zCardanoLikeLiveData,\n zEthereumLikeLiveData,\n zEthereumTokenLikeLiveData,\n zGenericLikeLiveData,\n zPolkadotLikeLiveData,\n zRawSigningLiveData,\n zRippleLikeLiveData,\n zSolanaLikeLiveData,\n zStellarLikeLiveData,\n zTezosLikeLiveData,\n]);\n\nexport type AccountLiveData = z.infer<typeof zAccountLiveData>;\n","import z from \"zod\";\n\nimport { zNote } from \"@/types\";\nimport { ensureNonEmptyArray } from \"@/utils\";\n\nimport { zTransactionResponse } from \"./clients/types\";\n\nexport {\n type AccountResponse,\n type AccountSortBy,\n zAccountResponse,\n zAccountSortBy,\n} from \"./types\";\n\nexport { zOperationType } from \"@/types\";\n\n// re-export TransactionResponse from clients\nexport type { TransactionResponse } from \"./clients/types\";\n\nexport const zTransactionWithMetaResponse = z.discriminatedUnion(\n zTransactionResponse.discriminator,\n ensureNonEmptyArray(\n zTransactionResponse.options.map((_) =>\n _.extend({\n note: zNote.nullable().describe(\"Optional transaction note\"),\n }),\n ),\n ),\n);\n\nexport type TransactionWithMetaResponse = z.infer<typeof zTransactionWithMetaResponse>;\n\nexport { zEstimatedFees as zEstimateFeesResponse } from \"@/transactions\";\nexport { zAccountLiveData } from \"./types\";\n","import type { Whitelist } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport { zCurrency } from \"@/zod-utils\";\n\nexport const zWhitelistAddress = z.object({\n name: z.string().min(1).max(50),\n currency: zCurrency,\n address: z.string().min(1).max(200),\n // Destination tags are numeric-only or alpha-numeric.\n // Empty array (or undefined) means no check on destination tag.\n destinationTags: z.array(z.string().min(1).regex(/^\\w+$/)).optional(),\n});\n\nexport const zWhitelistAddresses = z.array(zWhitelistAddress);\n\nexport type WhitelistAddress = z.infer<typeof zWhitelistAddress>;\n\nexport type Destination = {\n currency: string;\n recipient: string;\n destinationTag?: string;\n};\n\nexport const isWhitelisted = (destination: Destination, whitelist: Whitelist): boolean => {\n const addresses = zWhitelistAddresses.parse(whitelist.addresses);\n return addresses.some(\n (whitelisted) =>\n whitelisted.currency === destination.currency &&\n whitelisted.address === destination.recipient &&\n // If no destination tags, it means all tags are allowed.\n (!whitelisted.destinationTags ||\n whitelisted.destinationTags.length === 0 ||\n whitelisted.destinationTags.includes(destination.destinationTag ?? \"\")),\n );\n};\n","import { WhitelistType } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport { zWhitelistAddresses } from \"./db-types\";\n\n// FIXME unify the different max length of object names\n// there is some inconsistencies right now between front<>gate and what is actually\n// possible on a real device screen\n//\n// for now, putting 45 to unlock Gate sync\n// see https://ledger.slack.com/archives/C05RD1RKUSV/p1719320103721699\n//\nexport const zWhitelistName = z.string().min(1).max(45).describe(\"Whitelist name\");\n\nexport const zCreateWhitelistRequestData = z.object({\n name: zWhitelistName,\n description: z.string().nullable(),\n addresses: zWhitelistAddresses,\n type: z.nativeEnum(WhitelistType),\n});\n\nexport type CreateWhitelistRequestData = z.infer<typeof zCreateWhitelistRequestData>;\n\n// FIXME should we allow edit of description? probably yes\nexport const zEditWhitelistRequestData = z.object({\n name: zWhitelistName,\n addresses: zWhitelistAddresses,\n});\n\nexport type EditWhitelistRequestData = z.infer<typeof zEditWhitelistRequestData>;\n","import type { Policy, PrismaClient, User, Whitelist } from \"@prisma/client\";\nimport { ReviewConfigType } from \"@prisma/client\";\nimport invariant from \"invariant\";\nimport { uniq } from \"lodash\";\nimport z from \"zod\";\n\nimport type { EnrichedReviewConfig, ReviewConfigWithMembers } from \"@/governance\";\nimport {\n connectReviewConfigData,\n enrichReviewConfig,\n getReviewStepMembers,\n zReviewStepsArray,\n} from \"@/governance\";\nimport type { GroupWithMembers } from \"@/groups\";\nimport { type HsmObjectId } from \"@/hsm\";\nimport { PolicyModel, ReviewConfigModel } from \"@/prisma-utils\";\nimport type { Operation } from \"@/types\";\nimport { isValueTransaction, zClassicOperationType, zOperationType } from \"@/types\";\nimport { ensureNotNil, uniqById } from \"@/utils\";\nimport { isWhitelisted } from \"@/whitelists\";\n\n// #region ---------- Public schema for governance rules ------------------------------------------\n\nconst zBaseGovRuleData = z.object({\n // Steps of users that will need to review operations\n reviewSteps: zReviewStepsArray,\n // Optional threshold on transaction value: null `min` = 0, null `max` = +inf\n threshold: PolicyModel.zThreshold.optional(),\n // Optional whitelist on transaction recipient: Empty list means no whitelist.\n whitelistIds: PolicyModel.zWhitelistIds.optional(),\n});\n\n// Used when creating/editing classic governance rules (non digest signing)\nexport const zClassicGovRuleData = zBaseGovRuleData\n .extend({\n operationType: zClassicOperationType.describe(\"Allowed operation type\"),\n })\n .describe(\"Account governance rule\");\n\nexport type ClassicGovRuleData = z.infer<typeof zClassicGovRuleData>;\n\n/**\n * Public facing governance rule response shape, facing clients and used in API.\n */\n\nexport const zGovRuleData = zBaseGovRuleData\n .extend({\n operationType: zOperationType.describe(\"Allowed operation type\"),\n })\n .describe(\"Governance rule\");\n\nexport type GovRuleData = z.infer<typeof zGovRuleData>;\n\n// #endregion\n\n// #region ---------- Utilities -------------------------------------------------------------------\n\n// TODO: Should be set with no duplicates!\nexport type PolicyRelatedObjects = {\n whitelists: Whitelist[];\n reviewConfigs: ReviewConfigWithMembers[];\n};\n\n/** Constant to be used with `prisma.policy` to include all the related objects of a policy. */\nexport const INCLUDE_POLICY_RELATED_OBJECTS = {\n whitelists: true,\n reviewConfigs: { include: ReviewConfigModel.INCLUDE_MEMBERS },\n};\n\n/** `Policy` with related objects. */\nexport type PolicyWithRelatedObjects = Policy & PolicyRelatedObjects;\n\n/** Extract individual users and groups (with members) from a policy. */\nexport const getPolicyUsersAndGroups = (\n policy: Omit<PolicyWithRelatedObjects, \"whitelists\">,\n): {\n users: User[];\n groups: GroupWithMembers[];\n} => {\n const users = uniqById(policy.reviewConfigs.flatMap((_) => _.users));\n const groups = uniqById(policy.reviewConfigs.flatMap((_) => _.groups));\n return { users, groups };\n};\n\n/** Extract members (individual users and group members) from a policy. */\nexport const getPolicyMembers = (policy: Omit<PolicyWithRelatedObjects, \"whitelists\">): User[] => {\n const { users, groups } = getPolicyUsersAndGroups(policy);\n return uniqById(users.concat(groups.flatMap((_) => _.members)));\n};\n\nexport const createGovRule = async (\n workspaceName: string,\n rule: GovRuleData,\n hsmId: string,\n prisma: PrismaClient,\n): Promise<PolicyModel.GovRuleJsonObject> => {\n const { operationType, reviewSteps, threshold, whitelistIds } = {\n threshold: { min: null, max: null },\n whitelistIds: [],\n ...rule,\n };\n const reviewConfig = await prisma.reviewConfig.create({\n data: connectReviewConfigData({\n workspaceName,\n type: ReviewConfigType.OPERATOR_REVIEW_CONFIG,\n steps: reviewSteps,\n ownerPolicyId: null,\n }),\n include: ReviewConfigModel.INCLUDE_MEMBERS,\n });\n const reviewConfigId = reviewConfig.id;\n return {\n operationType,\n threshold,\n whitelistIds,\n reviewConfigId,\n hsmId,\n };\n};\n\n/**\n * Create governance rules JSON array from the rules data. For each governance rule, it will create\n * review configs owned by the rule. It returns an object with:\n *\n * - `rulesJsonArray`: A JSON array suitable for the `Policy.rulesJsonArray` field.\n * - `whitelistIds`: IDs of related whitelists, to be connected to the `Policy` object.\n * - `reviewConfigIds`: IDs of related review configs, to be connected to the `Policy` object.\n */\nexport const createGovRules = async (\n workspaceName: string,\n rules: GovRuleData[],\n hsmRuleSetIds: string[],\n prisma: PrismaClient,\n): Promise<{\n rulesJsonArray: PolicyModel.GovRuleJsonObject[];\n whitelistIds: string[];\n reviewConfigIds: string[];\n}> => {\n invariant(\n rules.length === hsmRuleSetIds.length,\n `Rule and rule HSM id count mismatch ${rules.length} !== ${hsmRuleSetIds.length}`,\n );\n const rulesJsonArray = await Promise.all(\n rules.map(async (rule, index) =>\n createGovRule(workspaceName, rule, hsmRuleSetIds[index]!, prisma),\n ),\n );\n const whitelistIds = uniq(rulesJsonArray.flatMap((_) => _.whitelistIds));\n const reviewConfigIds = uniq(rulesJsonArray.map((_) => _.reviewConfigId));\n return { rulesJsonArray, whitelistIds, reviewConfigIds };\n};\n\nexport type GovRuleExpanded = Pick<PolicyModel.GovRuleJsonObject, \"operationType\" | \"threshold\"> & {\n whitelists: Whitelist[];\n reviewConfig: ReviewConfigWithMembers;\n hsmId: string;\n};\n\n/** Expand govRules of the given policy by dereferencing related objects from ID. */\nexport const expandGovRules = (policy: PolicyWithRelatedObjects): GovRuleExpanded[] =>\n PolicyModel.parseFields(policy).rulesJsonArray.map((ruleJsonObject) => {\n const { operationType, threshold, whitelistIds, reviewConfigId, hsmId } = ruleJsonObject;\n const whitelists = whitelistIds.map((whitelistId) =>\n ensureNotNil(policy.whitelists.find((_) => _.id === whitelistId)),\n );\n const reviewConfig = ensureNotNil(policy.reviewConfigs.find((_) => _.id === reviewConfigId));\n return {\n operationType,\n threshold,\n whitelists,\n reviewConfig,\n hsmId,\n };\n });\n\n/**\n * TODO: This function is only used by `app-routers` to convert `policy.rules` to JSON format\n * expected by `PolicyResponse`. Consider redefining the shape of `PolicyResponse`!\n */\nexport const jsonifyGovRules = (policy: PolicyWithRelatedObjects): GovRuleData[] =>\n expandGovRules(policy).map((rule) => {\n const { operationType, threshold, whitelists } = rule;\n const whitelistIds = whitelists.map((_) => _.id);\n const reviewSteps = zReviewStepsArray.parse(rule.reviewConfig.steps);\n return { operationType, whitelistIds, threshold, reviewSteps };\n });\n\nexport const checkPreconditions = (operation: Operation, govRule: GovRuleExpanded): boolean => {\n const { operationType, threshold, whitelists } = govRule;\n // Check if operation type is allowed.\n if (operationType !== operation.type) {\n return false;\n }\n\n if (isValueTransaction(operation)) {\n // Check if value is within the threshold.\n const { min, max } = threshold;\n const value = BigInt(operation.value);\n if ((min !== null && value < BigInt(min)) || (max !== null && value > BigInt(max))) {\n return false;\n }\n // If this govRule has whitelists: Check if the destination is whitelisted.\n if (whitelists.length > 0 && !whitelists.some((_) => isWhitelisted(operation, _))) {\n return false;\n }\n }\n\n // All checks passed!\n return true;\n};\n\n/**\n * Check the operation and find the first matching govRule for it. Then return the matching gov rule's\n * reviewConfig, hsm id, and whitelist hsm id.\n * If no govRule matches the operation, return undefined.\n */\nexport const findMatchingRule = (\n operation: Operation,\n currentUser: User,\n policy: PolicyWithRelatedObjects,\n):\n | { reviewConfig: EnrichedReviewConfig; govRuleHsmId: HsmObjectId; whitelistHsmId?: HsmObjectId }\n | undefined => {\n const matchingRule = expandGovRules(policy)\n .filter((rule) => checkPreconditions(operation, rule))\n .find((rule) => {\n const members = getReviewStepMembers(rule.reviewConfig, 0);\n return members.some((_) => _.id === currentUser.id);\n });\n\n if (matchingRule === undefined) {\n return undefined;\n }\n\n const matchingWhitelist = isValueTransaction(operation)\n ? matchingRule.whitelists.find((_) => isWhitelisted(operation, _))\n : undefined;\n\n return {\n reviewConfig: enrichReviewConfig(matchingRule.reviewConfig),\n govRuleHsmId: matchingRule.hsmId,\n whitelistHsmId: matchingWhitelist?.hsmId,\n };\n};\n\n// #endregion\n","import z from \"zod\";\n\nimport { zClassicGovRuleData } from \"./db-utils\";\n\nconst zPolicyName = z.string().min(1).max(19).describe(\"Policy name\");\nconst zCurrency = z.string().min(1).max(40).regex(/^\\w+$/).describe(\"Currency\");\n\nexport const zCreatePublicPolicyRequestData = z.object({\n name: zPolicyName,\n description: z.string().nullable().describe(\"Description\"),\n currency: zCurrency.nullable(),\n govRules: z.array(zClassicGovRuleData).describe(\"Governance rules\"),\n});\n\nexport type CreatePublicPolicyRequestData = z.infer<typeof zCreatePublicPolicyRequestData>;\n\nexport const zEditPublicPolicyRequestData = z.object({\n name: zPolicyName,\n description: z.string().nullable().describe(\"Description\"),\n govRules: z.array(zClassicGovRuleData).describe(\"Governance rules\"),\n});\n\nexport type EditPublicPolicyRequestData = z.infer<typeof zEditPublicPolicyRequestData>;\n","import { AccountGovernanceType, AccountType } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport { zReviewStepWithUsersArray } from \"@/governance\";\nimport { zClassicGovRuleData } from \"@/policies\";\nimport { zTradelinkExchangeConfigs } from \"@/tradelink\";\nimport { zCurrency } from \"@/zod-utils\";\n\nconst zAccountName = z.string().min(1).max(40).describe(\"Account name\");\n\nconst zSignDigestsGovRuleData = z\n .object({\n operationType: z.literal(\"SIGN_DIGESTS\"),\n reviewSteps: zReviewStepWithUsersArray, // we need to control for API users only\n })\n .describe(\"Digest signing rule\");\n\nexport type SignDigestGovRuleData = z.infer<typeof zSignDigestsGovRuleData>;\n\nexport const zAccountPolicyRequestData = z\n .union([\n z.object({ policyId: z.string() }).describe(\"Account policy\"),\n z.object({ rules: z.array(zClassicGovRuleData) }).describe(\"Account governance rules\"),\n ])\n .describe(\"Account policy or governance rules\");\n\nexport type AccountPolicyRequestData = z.infer<typeof zAccountPolicyRequestData>;\n\nexport const zCreateAccountGovernanceData = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(AccountGovernanceType.CLASSIC),\n policy: zAccountPolicyRequestData,\n }),\n z.object({\n type: z.literal(AccountGovernanceType.TRADELINK),\n assetManagerId: z.string(),\n exchangeConfigs: zTradelinkExchangeConfigs,\n }),\n z.object({\n type: z.literal(AccountGovernanceType.RAW_SIGNING),\n policy: z.object({ rules: z.array(zSignDigestsGovRuleData) }),\n }),\n]);\n\nexport type CreateAccountGovernanceData = z.infer<typeof zCreateAccountGovernanceData>;\n\nexport const zCreateAccountUserInputData = z.object({\n name: zAccountName,\n currency: zCurrency, // \"bitcoin\"\n index: z.number().nonnegative().optional().describe(\"Account index\"),\n contractAddress: z.string().min(1).optional().describe(\"Account contract address\"),\n governance: zCreateAccountGovernanceData,\n});\n\nexport type CreateAccountUserInputData = z.infer<typeof zCreateAccountUserInputData>;\n\n// CreateAccountUserInputData is exposed to the outside world, but we will resolve the\n// account index and derivation path before storing the request data in DB\nexport const zCreateAccountRequestData = zCreateAccountUserInputData.omit({ index: true }).extend({\n index: z.number().nonnegative().describe(\"Account index\"),\n derivationPath: z.string().describe(\"Account bip44 derivation path\"),\n type: z.nativeEnum(AccountType), // \"BITCOIN_LIKE\"\n});\n\nexport type CreateAccountRequestData = z.infer<typeof zCreateAccountRequestData>;\n\nexport const zEditAccountGovernanceData = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(AccountGovernanceType.CLASSIC),\n policy: zAccountPolicyRequestData,\n }),\n z.object({\n type: z.literal(AccountGovernanceType.TRADELINK),\n exchangeConfigs: zTradelinkExchangeConfigs,\n }),\n z.object({\n type: z.literal(AccountGovernanceType.RAW_SIGNING),\n policy: z.object({ rules: z.array(zSignDigestsGovRuleData) }),\n }),\n]);\n\nexport type EditAccountGovernanceData = z.infer<typeof zEditAccountGovernanceData>;\n\nexport const zEditAccountRequestData = z.object({\n name: zAccountName,\n governance: zEditAccountGovernanceData,\n});\n\nexport type EditAccountRequestData = z.infer<typeof zEditAccountRequestData>;\n\n// There is no request data, but putting z.null() breaks typechecking when implementing the workflow\nexport const zActivateAccountRequestData = z.object({});\n\nexport type ActivateAccountRequestData = z.infer<typeof zActivateAccountRequestData>;\n\nexport const zEditTokenRuleRequestData = z.object({\n parentAccountId: z.string().min(1).describe(\"Parent account unique ID\"),\n contractAddress: z.string().min(1).describe(\"Token contract address\"),\n rules: z.array(zClassicGovRuleData).describe(\"Account governance rules\"),\n});\nexport type EditTokenRuleRequestData = z.infer<typeof zEditTokenRuleRequestData>;\n","import type { Account, PrismaClient } from \"@prisma/client\";\nimport { AccountGovernanceType, AccountType } from \"@prisma/client\";\nimport { keyBy } from \"lodash\";\n\nimport { zTradelinkExchangeConfigs } from \"@/tradelink\";\nimport { zNote } from \"@/types\";\nimport { unreachable } from \"@/utils\";\n\nimport { type AccountAssetStaticFields } from \"./account-asset-fields\";\nimport { type AccountGovernanceFields } from \"./account-governance-fields\";\nimport { type AccountStakingFields } from \"./account-staking-fields\";\nimport type { TransactionResponse, TransactionWithMetaResponse } from \"./app-types\";\nimport type {\n LamaCardanoClient,\n LamaEthereumClient,\n LamaSolanaClient,\n PolkadotAccountClient,\n WdTezosClient,\n} from \"./clients\";\nimport { getAccountClient } from \"./clients\";\nimport type { AccountWithGovernanceMixins } from \"./db-types\";\nimport type { AccountBalanceFields, AccountLiveData, AccountResponse } from \"./types\";\nimport { zAccountResponse } from \"./types\";\nimport { getAccountBalance } from \"./utils\";\n\nconst loadBalanceFields = async (\n account: Account,\n prisma: PrismaClient,\n): Promise<AccountBalanceFields> => {\n const { total, pending } = await getAccountBalance(account, prisma);\n return {\n total: total.toString(),\n pending: pending.toString(),\n };\n};\n\nconst loadStakingFields = async (account: Account): Promise<AccountStakingFields | null> => {\n const client = getAccountClient(account);\n switch (account.type) {\n case AccountType.ETHEREUM_LIKE:\n return {\n type: account.type,\n staking: await (client as LamaEthereumClient).getAccountStakingData(account),\n };\n case AccountType.CARDANO_LIKE:\n return {\n type: account.type,\n staking: await (client as LamaCardanoClient).getAccountStakingData(account),\n };\n case AccountType.SOLANA_LIKE:\n if (account.contractAddress) {\n // No staking for Solana SPL tokens\n return {\n type: account.type,\n staking: null,\n };\n }\n return {\n type: account.type,\n staking: await (client as LamaSolanaClient).getAccountStakingData(account),\n };\n case AccountType.TEZOS_LIKE:\n return {\n type: account.type,\n staking: await (client as WdTezosClient).getAccountStakingData(account),\n };\n case AccountType.POLKADOT_LIKE:\n return {\n type: account.type,\n staking: await (client as PolkadotAccountClient).getAccountStakingData(account),\n };\n }\n return null;\n};\n\nexport const getAccountLiveData = async (\n account: Account,\n prisma: PrismaClient,\n): Promise<AccountLiveData> => {\n const result = await Promise.all([\n loadBalanceFields(account, prisma),\n loadStakingFields(account),\n ]);\n const balance: AccountBalanceFields = result[0];\n const staking: AccountStakingFields | null = result[1];\n return {\n id: account.id,\n balance,\n ...(staking ?? { type: account.type }),\n };\n};\n\nconst getAccountAssetStaticFields = (\n account: AccountWithGovernanceMixins,\n): AccountAssetStaticFields => {\n switch (account.type) {\n case AccountType.BITCOIN_LIKE:\n return {\n type: account.type,\n xpub: account.xpub!,\n };\n case AccountType.ETHEREUM_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.ERC20_LIKE:\n case AccountType.BEP20_LIKE:\n case AccountType.TRC20_LIKE:\n return {\n type: account.type,\n address: account.address,\n contractAddress: account.contractAddress!,\n };\n case AccountType.CARDANO_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.SOLANA_LIKE:\n return {\n type: account.type,\n address: account.address,\n contractAddress: account.contractAddress,\n };\n case AccountType.TEZOS_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.STELLAR_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.RIPPLE_LIKE:\n return {\n type: account.type,\n xpub: account.xpub!,\n };\n case AccountType.POLKADOT_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.GENERIC_LIKE:\n case AccountType.RAW_SIGNING:\n return {\n type: account.type,\n };\n /* v8 ignore start */\n default:\n unreachable(account.type);\n /* v8 ignore stop */\n }\n};\n\nconst getAccountGovernanceFields = (\n account: AccountWithGovernanceMixins,\n): AccountGovernanceFields => {\n switch (account.governanceType) {\n case AccountGovernanceType.CLASSIC:\n case AccountGovernanceType.RAW_SIGNING:\n return {\n type: AccountGovernanceType.CLASSIC,\n policyId: account.classicGovernanceMixin!.policyId,\n };\n case AccountGovernanceType.TRADELINK:\n return {\n type: AccountGovernanceType.TRADELINK,\n assetManagerId: account.tradelinkGovernanceMixin!.assetManagerId,\n exchangeConfigs: zTradelinkExchangeConfigs.parse(\n account.tradelinkGovernanceMixin!.exchangeConfigs,\n ),\n };\n /* v8 ignore start */\n default:\n unreachable(account.governanceType);\n /* v8 ignore stop */\n }\n};\n\nexport const serializeAccount = (account: AccountWithGovernanceMixins): AccountResponse => {\n const asset = getAccountAssetStaticFields(account);\n const governance = getAccountGovernanceFields(account);\n\n const response: AccountResponse = {\n ...account,\n legacyId: account.gateId,\n governance,\n asset,\n };\n\n // Parse to strip off fields that are not defined in the schema.\n return zAccountResponse.parse(response);\n};\n\n/**\n * For each transaction, check if there is an associated TransactionMeta object, and retrieve\n * the corresponding data on the corresponding request\n *\n * @param transactions - TransactionResponse[] - transactions from account client\n * @param prisma - PrismaClient - prisma client\n *\n * @returns TransactionWithMetaResponse[]\n */\nexport const fetchTransactionMetas = async (\n workspaceName: string,\n transactions: TransactionResponse[],\n prisma: PrismaClient,\n): Promise<TransactionWithMetaResponse[]> => {\n const txHashes = transactions.map((tx) => tx.hash);\n const metas = await prisma.transactionMeta.findMany({\n where: { workspaceName, hash: { in: txHashes } },\n });\n const metasByHash = keyBy(metas, \"hash\");\n return transactions.map((t) => {\n const note = metasByHash[t.hash]?.note ? zNote.parse(metasByHash[t.hash]?.note) : null;\n return { ...t, note };\n });\n};\n","import z from \"zod\";\n\nexport const zSciConfigData = z.object({\n dapps: z.array(z.string()).nullable().describe(\"Allowed DApps, null allows all\"),\n customContractCallEnabled: z.boolean().describe(\"Allow non-DApp SCI\"),\n});\n\nexport const zCreateSciConfigRequestData = z.object({\n account: z.string().describe(\"Account UUID\"),\n config: zSciConfigData,\n});\n\nexport type CreateSciConfigRequestData = z.infer<typeof zCreateSciConfigRequestData>;\n\nexport const zEditSciConfigRequestData = z.object({\n config: zSciConfigData,\n});\n\nexport type EditSciConfigRequestData = z.infer<typeof zEditSciConfigRequestData>;\n","import type {\n ChallengeType,\n PrismaClient,\n User,\n VaultRequest,\n VaultRequestReview,\n Workspace,\n} from \"@prisma/client\";\nimport { z } from \"zod\";\n\nimport type { HsmChallengeStage } from \"@/hsm\";\n\nexport type WorkflowContext = {\n prisma: PrismaClient;\n workspace: Workspace;\n};\n\n/** The base type of `VaultRequest.data`. */\nexport type RequestData = Record<string, unknown>;\n\nexport type RequestWithData<T extends RequestData> = Omit<VaultRequest, \"data\"> & { data: T };\n\n/** Resolved review step that participates in the review process of a request. */\nexport type ResolvedReviewStep = {\n stageName: string;\n users: User[];\n quorum: number;\n};\n\nexport type ValidationResult<T extends RequestData> = {\n resolvedReviewSteps: ResolvedReviewStep[];\n requestData: T;\n managedData?: Record<string, unknown>;\n};\n\n/**\n * All approved review stages so far, where key is the stage name, and value is an array of\n * reviews with `APPROVED` status in the stage.\n */\nexport type ApprovedReviewStages = Record<string, VaultRequestReview[]>;\n\n/** Challenge response (signature) that user provides as proof to approve or reject a request. */\nexport type Proof =\n | {\n challengeType: ChallengeType;\n signature: string;\n }\n | {\n challengeType: null; // soft approval with no challenge to sign\n signature: \"!\";\n };\n\nexport type TargetObject = { id: string };\n\nexport type WorkflowEvent =\n | {\n type: \"TRANSACTION_SUBMITTED\";\n requestId: string;\n txHash: string;\n }\n | {\n type: \"TRANSACTION_FAILED\" | \"TRANSACTION_ONCHAIN\" | \"TRANSACTION_CONFIRMED\";\n requestId: string;\n }\n | {\n // Dummy event type just for testing\n type: \"DUMMY\";\n foobar: \"foo\" | \"bar\";\n };\n\n// #region ---------- VaultRequest.reviewSteps ----------------------------------------------------\n\n/** Item in `VaultRequest.reviewSteps` array representing one review step. */\nexport const zRequestReviewStep = z.object({\n stageName: z.string().regex(/^\\w+$/).describe(\"The review stage name\"),\n quorum: z.number().int().min(1).describe(\"Quorum for the review step\"),\n});\n\nexport const zRequestReviewSteps = z.array(zRequestReviewStep);\n\nexport type RequestReviewStep = z.infer<typeof zRequestReviewStep>;\n\n// #endregion\n\n// #region ---------- Multi-stage HSM challenges --------------------------------------------------\n\nexport type MultiStageHsmChallenges = {\n targetHsmId: string;\n stages: HsmChallengeStage[];\n};\n\n// #endregion\n","import { PsdModel, UserRegistrationState, UserRole } from \"@prisma/client\";\nimport { z } from \"zod\";\n\nexport const zUserName = z.string().min(1).max(19).describe(\"User name\");\n\nexport const zUserRegistrationCreateInput = z.object({\n name: zUserName,\n role: z.enum([UserRole.ADMIN, UserRole.OPERATOR]).describe(\"User role\"),\n psdModel: z.nativeEnum(PsdModel).describe(\"PSD model\"),\n deviceUserId: z.string().describe(\"Device user ID\"),\n});\n\nexport type UserRegistrationCreateInput = z.infer<typeof zUserRegistrationCreateInput>;\n\nexport const zUserRegistrationResponse = zUserRegistrationCreateInput.extend({\n id: z.string().describe(\"User registration ID\"),\n workspaceName: z.string().describe(\"Workspace name\"),\n state: z.nativeEnum(UserRegistrationState).describe(\"User registration state\"),\n isLocked: z.boolean().describe(\"Whether the registration is locked by a request\"),\n});\n\nexport type UserRegistrationResponse = z.infer<typeof zUserRegistrationResponse>;\n","import z from \"zod\";\n\nimport { zUserName } from \"./types\";\n\nexport const zCreatePsdUserRequestData = z.object({\n registrationId: z.string().describe(\"User registration ID\"),\n});\n\nexport type CreatePsdUserRequestData = z.infer<typeof zCreatePsdUserRequestData>;\n\nexport const zCreateApiUserRequestData = z\n .object({\n name: zUserName,\n pubKey: z.string().describe(\"Public key\"),\n role: z.enum([\"ADMIN\", \"OPERATOR\"]).describe(\"User role\"),\n viewAll: z.boolean().describe(\"View all data\").default(false).optional(),\n })\n .describe(\"Create API user request data\");\n\nexport type CreateApiUserRequestData = z.infer<typeof zCreateApiUserRequestData>;\n\nexport const zCreateApiUserAccessRequestData = z\n .object({\n name: zUserName,\n })\n .describe(\"Create API user credential request data\");\n\nexport type CreateApiUserAccessRequestData = z.infer<typeof zCreateApiUserAccessRequestData>;\n\nexport const zCreateApiUserManagedData = z\n .object({\n authUserId: z.string().describe(\"Authentication broker ID\"),\n })\n .describe(\"Managed data for API user\");\n\n// #endregion\n","import z from \"zod\";\n\nconst zGroupName = z.string().min(1).max(19).describe(\"Group name\");\n\nexport const zCreateGroupRequestData = z.object({\n name: zGroupName,\n description: z.string().nullable().describe(\"Group description\"),\n members: z.array(z.string()).describe(\"List of group members ids\"),\n});\n\nexport type CreateGroupRequestData = z.infer<typeof zCreateGroupRequestData>;\n\nexport const zEditGroupRequestData = z.object({\n name: zGroupName,\n description: z.string().nullable().describe(\"Group description\"),\n members: z.array(z.string()).describe(\"List of group members ids\"),\n});\n\nexport type EditGroupRequestData = z.infer<typeof zEditGroupRequestData>;\n","import z from \"zod\";\n\nexport const zApiKeyName = z.string().min(1).max(19).describe(\"API key name\");\n\nexport const zCreateApiKeyRequestData = z\n .object({\n name: zApiKeyName,\n entities: z.array(z.string()).describe(\"List of related entities ids\"),\n scopes: z.object({}).describe(\"FIXME to be precised\"),\n })\n .describe(\"Create read-only API key request data\");\n\nexport type CreateApiKeyRequestData = z.infer<typeof zCreateApiKeyRequestData>;\n\nexport const zEditApiKeyRequestData = zCreateApiKeyRequestData.describe(\n \"Edit read-only API key request data\",\n);\n\nexport type EditApiKeyRequestData = z.infer<typeof zEditApiKeyRequestData>;\n","import z from \"zod\";\n\nexport const zEntityName = z.string().min(1).max(19).describe(\"Entity name\");\n\nexport const zCreateEntityRequestData = z.object({\n name: zEntityName,\n accounts: z.array(z.string()),\n});\n\nexport type CreateEntityRequestData = z.infer<typeof zCreateEntityRequestData>;\n\nexport const zEditEntityRequestData = z.object({\n name: zEntityName,\n accounts: z.array(z.string()),\n});\n\nexport type EditEntityRequestData = z.infer<typeof zEditEntityRequestData>;\n","import { AdminPermission } from \"@prisma/client\";\nimport { omit } from \"lodash\";\nimport z from \"zod\";\n\nimport { zReviewStepWithUsersArray } from \"./review-config\";\n\nconst NonRootAdminPermission = omit(AdminPermission, \"ROOT\");\n\n// A non-root admin gov rule is uniquely identified by its permission\nexport const zWorkspaceRuleRequestData = z.object({\n permission: z.nativeEnum(NonRootAdminPermission).describe(\"Granted permissions\"),\n reviewConfig: zReviewStepWithUsersArray.describe(\"List of admin review steps\"),\n});\n\nexport type WorkspaceRuleRequestData = z.infer<typeof zWorkspaceRuleRequestData>;\n","/**\n * All zod schemas for `VaultRequest.data` are registered here.\n */\nimport { RequestType } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport {\n zActivateAccountRequestData,\n zCreateAccountRequestData,\n zCreateSciConfigRequestData,\n zEditAccountRequestData,\n zEditSciConfigRequestData,\n zEditTokenRuleRequestData,\n} from \"@/accounts\";\nimport { zCreateApiKeyRequestData, zEditApiKeyRequestData } from \"@/api-keys/api-key-requests\";\nimport { zCreateEntityRequestData, zEditEntityRequestData } from \"@/entities/entity-requests\";\nimport { zUpdateQuorumRequestData } from \"@/governance\";\nimport { zWorkspaceRuleRequestData } from \"@/governance/workspace-rule-requests\";\nimport { zCreateGroupRequestData, zEditGroupRequestData } from \"@/groups\";\nimport { zCreatePublicPolicyRequestData, zEditPublicPolicyRequestData } from \"@/policies\";\nimport {\n zAdjustPledgeRequestData,\n zCreateSettlementRequestData,\n zCustodianRequestData,\n zForceUnpledgeRequestData,\n zRepledgeRequestData,\n zTradelinkArbitrationRequestData,\n zTradelinkEntityRequestData,\n zTradelinkWithdrawRequestData,\n} from \"@/tradelink\";\nimport {\n zCreateTransactionRequestData,\n zSignDigestsRequestData,\n zSignMessageRequestData,\n} from \"@/transactions\";\nimport {\n zCreateApiUserAccessRequestData,\n zCreateApiUserRequestData,\n zCreatePsdUserRequestData,\n} from \"@/users\";\nimport {\n zCreateWhitelistRequestData,\n zEditWhitelistRequestData,\n} from \"@/whitelists/whitelist-requests\";\n\nexport const zVaultRequestMixinsByType = {\n // Workspaces\n [RequestType.UPDATE_QUORUM]: z.object({\n type: z.literal(RequestType.UPDATE_QUORUM),\n data: zUpdateQuorumRequestData,\n }),\n // Operator requests\n [RequestType.CREATE_TRANSACTION]: z.object({\n type: z.literal(RequestType.CREATE_TRANSACTION),\n data: zCreateTransactionRequestData,\n meta: z\n .object({\n hash: z.string().nullable(),\n })\n .optional()\n .nullable(),\n }),\n [RequestType.SIGN_MESSAGE]: z.object({\n type: z.literal(RequestType.SIGN_MESSAGE),\n data: zSignMessageRequestData,\n }),\n [RequestType.SIGN_DIGESTS]: z.object({\n type: z.literal(RequestType.SIGN_DIGESTS),\n data: zSignDigestsRequestData,\n }),\n // Accounts\n [RequestType.CREATE_ACCOUNT]: z.object({\n type: z.literal(RequestType.CREATE_ACCOUNT),\n data: zCreateAccountRequestData,\n }),\n [RequestType.EDIT_ACCOUNT]: z.object({\n type: z.literal(RequestType.EDIT_ACCOUNT),\n targetId: z.string(),\n data: zEditAccountRequestData,\n }),\n [RequestType.ACTIVATE_TRADELINK_ACCOUNT]: z.object({\n type: z.literal(RequestType.ACTIVATE_TRADELINK_ACCOUNT),\n targetId: z.string(),\n data: zActivateAccountRequestData,\n }),\n [RequestType.EDIT_TOKEN_RULE]: z.object({\n type: z.literal(RequestType.EDIT_TOKEN_RULE),\n targetId: z.string(),\n data: zEditTokenRuleRequestData,\n }),\n // Groups\n [RequestType.CREATE_GROUP]: z.object({\n type: z.literal(RequestType.CREATE_GROUP),\n data: zCreateGroupRequestData,\n }),\n [RequestType.EDIT_GROUP]: z.object({\n type: z.literal(RequestType.EDIT_GROUP),\n targetId: z.string(),\n data: zEditGroupRequestData,\n }),\n [RequestType.REVOKE_GROUP]: z.object({\n type: z.literal(RequestType.REVOKE_GROUP),\n data: z.object({}),\n }),\n // Whitelists\n [RequestType.CREATE_WHITELIST]: z.object({\n type: z.literal(RequestType.CREATE_WHITELIST),\n data: zCreateWhitelistRequestData,\n }),\n [RequestType.EDIT_WHITELIST]: z.object({\n type: z.literal(RequestType.EDIT_WHITELIST),\n targetId: z.string(),\n data: zEditWhitelistRequestData,\n }),\n // Entities\n [RequestType.CREATE_ENTITY]: z.object({\n type: z.literal(RequestType.CREATE_ENTITY),\n data: zCreateEntityRequestData,\n }),\n [RequestType.EDIT_ENTITY]: z.object({\n type: z.literal(RequestType.EDIT_ENTITY),\n data: zEditEntityRequestData,\n }),\n [RequestType.REVOKE_ENTITY]: z.object({\n type: z.literal(RequestType.REVOKE_ENTITY),\n data: z.object({}),\n }),\n // Users\n [RequestType.CREATE_PSD_USER]: z.object({\n type: z.literal(RequestType.CREATE_PSD_USER),\n data: zCreatePsdUserRequestData,\n }),\n [RequestType.CREATE_API_USER]: z.object({\n type: z.literal(RequestType.CREATE_API_USER),\n data: zCreateApiUserRequestData,\n }),\n [RequestType.CREATE_API_USER_ACCESS]: z.object({\n type: z.literal(RequestType.CREATE_API_USER_ACCESS),\n data: zCreateApiUserAccessRequestData,\n }),\n [RequestType.REVOKE_USER]: z.object({\n type: z.literal(RequestType.REVOKE_USER),\n data: z.object({}),\n }),\n // Admin gov rules\n [RequestType.CREATE_WORKSPACE_RULE]: z.object({\n type: z.literal(RequestType.CREATE_WORKSPACE_RULE),\n data: zWorkspaceRuleRequestData,\n }),\n [RequestType.EDIT_WORKSPACE_RULE]: z.object({\n type: z.literal(RequestType.EDIT_WORKSPACE_RULE),\n data: zWorkspaceRuleRequestData,\n }),\n // SCI configs\n [RequestType.CREATE_SCICONFIG]: z.object({\n type: z.literal(RequestType.CREATE_SCICONFIG),\n data: zCreateSciConfigRequestData,\n }),\n [RequestType.EDIT_SCICONFIG]: z.object({\n type: z.literal(RequestType.EDIT_SCICONFIG),\n data: zEditSciConfigRequestData,\n }),\n // API keys\n [RequestType.CREATE_API_KEY]: z.object({\n type: z.literal(RequestType.CREATE_API_KEY),\n data: zCreateApiKeyRequestData,\n }),\n [RequestType.EDIT_API_KEY]: z.object({\n type: z.literal(RequestType.EDIT_API_KEY),\n data: zEditApiKeyRequestData,\n }),\n [RequestType.REVOKE_API_KEY]: z.object({\n type: z.literal(RequestType.REVOKE_API_KEY),\n data: z.object({}),\n }),\n // Policies\n [RequestType.CREATE_POLICY]: z.object({\n type: z.literal(RequestType.CREATE_POLICY),\n data: zCreatePublicPolicyRequestData,\n }),\n [RequestType.EDIT_POLICY]: z.object({\n type: z.literal(RequestType.EDIT_POLICY),\n targetId: z.string(),\n data: zEditPublicPolicyRequestData,\n }),\n // Tradelink\n [RequestType.CREATE_TRADELINK_CUSTODIAN]: z.object({\n type: z.literal(RequestType.CREATE_TRADELINK_CUSTODIAN),\n data: zCustodianRequestData,\n }),\n [RequestType.EDIT_TRADELINK_CUSTODIAN]: z.object({\n type: z.literal(RequestType.EDIT_TRADELINK_CUSTODIAN),\n targetId: z.string(),\n data: zCustodianRequestData,\n }),\n [RequestType.CREATE_TRADELINK_EXCHANGE]: z.object({\n type: z.literal(RequestType.CREATE_TRADELINK_EXCHANGE),\n data: zTradelinkEntityRequestData,\n }),\n [RequestType.EDIT_TRADELINK_EXCHANGE]: z.object({\n type: z.literal(RequestType.EDIT_TRADELINK_EXCHANGE),\n targetId: z.string(),\n data: zTradelinkEntityRequestData,\n }),\n [RequestType.CREATE_TRADELINK_ASSET_MANAGER]: z.object({\n type: z.literal(RequestType.CREATE_TRADELINK_ASSET_MANAGER),\n data: zTradelinkEntityRequestData,\n }),\n [RequestType.EDIT_TRADELINK_ASSET_MANAGER]: z.object({\n type: z.literal(RequestType.EDIT_TRADELINK_ASSET_MANAGER),\n targetId: z.string(),\n data: zTradelinkEntityRequestData,\n }),\n [RequestType.ADJUST_PLEDGE]: z.object({\n type: z.literal(RequestType.ADJUST_PLEDGE),\n data: zAdjustPledgeRequestData,\n }),\n [RequestType.TRADELINK_REPLEDGE]: z.object({\n type: z.literal(RequestType.TRADELINK_REPLEDGE),\n data: zRepledgeRequestData,\n }),\n [RequestType.CREATE_SETTLEMENT]: z.object({\n type: z.literal(RequestType.CREATE_SETTLEMENT),\n data: zCreateSettlementRequestData,\n meta: z\n .object({\n hash: z.string().nullable(),\n })\n .optional()\n .nullable(),\n }),\n [RequestType.FORCE_UNPLEDGE]: z.object({\n type: z.literal(RequestType.FORCE_UNPLEDGE),\n data: zForceUnpledgeRequestData,\n }),\n [RequestType.TRADELINK_WITHDRAW]: z.object({\n type: z.literal(RequestType.TRADELINK_WITHDRAW),\n data: zTradelinkWithdrawRequestData,\n meta: z\n .object({\n hash: z.string().nullable(),\n })\n .optional()\n .nullable(),\n }),\n [RequestType.TRADELINK_ARBITRATE]: z.object({\n type: z.literal(RequestType.TRADELINK_ARBITRATE),\n data: zTradelinkArbitrationRequestData,\n meta: z\n .object({\n hash: z.string().nullable(),\n })\n .optional()\n .nullable(),\n }),\n} as const satisfies Record<RequestType, unknown>;\n","import { RequestReviewStatus, RequestState, RequestType } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport { zCreateAccountUserInputData } from \"@/accounts\";\nimport { zUserChallenge } from \"@/hsm\";\nimport { zSignMessageUserInputData } from \"@/transactions\";\nimport { zNote } from \"@/types\";\nimport { ensureNonEmptyArray } from \"@/utils\";\nimport { zRequestReviewSteps } from \"@/workflows\";\n\nimport { zVaultRequestMixinsByType } from \"./request-data\";\n\nconst zRequestReviewResponse = z.object({\n // Note: Do NOT include `quorum` as it is already available in the request's `reviewSteps` field.\n stepIndex: z.number().int().describe(\"Index of the governance step in the request workflow\"),\n userId: z.string().describe(\"Reviewer id\"),\n status: z.nativeEnum(RequestReviewStatus).describe(\"Review status\"),\n createdAt: z.coerce.date().describe(\"Created date\"),\n updatedAt: z.coerce.date().describe(\"Updated date\"),\n});\n\nconst zVaultRequestCommonMixin = z.object({\n id: z.string().describe(\"Request unique identifier\"),\n legacyId: z.number().describe(\"Legacy internal unique identifier (for retro-compatibility)\"),\n state: z.nativeEnum(RequestState).describe(\"Request state\"),\n reviewSteps: zRequestReviewSteps.describe(\"Request review steps\"),\n currentStepIndex: z.number().int().min(0).describe(\"Index of the current approval step\"),\n expiresAt: z.coerce.date().describe(\"Request expiration date\"),\n targetId: z.string().nullable().describe(\"Optional ID of the target object\"),\n note: zNote.nullable().describe(\"Optional request note\"),\n reviews: z.array(zRequestReviewResponse).describe(\"Requests reviews\"),\n // `type` and `data` are correlated -- See `zVaultRequestMixinsByType`\n createdAt: z.coerce.date().describe(\"Creation timestamp\"),\n updatedAt: z.coerce.date().describe(\"Last modification timestamp\"),\n createdById: z.string().describe(\"ID of the user who created the request\"),\n // `inflight` is fetched from ONGOING RequestSaga\n inflight: z\n .object({\n lastError: z.string().describe(\"Error message from the last failure\"),\n numFailed: z.number().int().describe(\"Number of failures so far\"),\n retryAfter: z.coerce.date().describe(\"Date after which next retry is scheduled\"),\n })\n .optional()\n .describe(\"Extra information if the request is currently being processed\"),\n});\n\n/**\n * Maps from request type to request creation input schema.\n *\n * Most of the time, the user input data shape for request creation is the same as `request.data`.\n * But there are some exceptions. In such case, we redefine the shape for input data.\n */\nconst allowedRequestCreationInputByType = {\n [RequestType.UPDATE_QUORUM]: zVaultRequestMixinsByType[RequestType.UPDATE_QUORUM],\n [RequestType.CREATE_PSD_USER]: zVaultRequestMixinsByType[RequestType.CREATE_PSD_USER],\n [RequestType.CREATE_API_USER]: zVaultRequestMixinsByType[RequestType.CREATE_API_USER],\n [RequestType.CREATE_GROUP]: zVaultRequestMixinsByType[RequestType.CREATE_GROUP],\n [RequestType.EDIT_GROUP]: zVaultRequestMixinsByType[RequestType.EDIT_GROUP],\n [RequestType.CREATE_WHITELIST]: zVaultRequestMixinsByType[RequestType.CREATE_WHITELIST],\n [RequestType.EDIT_WHITELIST]: zVaultRequestMixinsByType[RequestType.EDIT_WHITELIST],\n [RequestType.CREATE_TRANSACTION]: zVaultRequestMixinsByType[RequestType.CREATE_TRANSACTION],\n [RequestType.SIGN_MESSAGE]: z.object({\n type: z.literal(RequestType.SIGN_MESSAGE),\n data: zSignMessageUserInputData,\n }),\n [RequestType.CREATE_POLICY]: zVaultRequestMixinsByType[RequestType.CREATE_POLICY],\n [RequestType.EDIT_POLICY]: zVaultRequestMixinsByType[RequestType.EDIT_POLICY],\n [RequestType.CREATE_ACCOUNT]: z.object({\n type: z.literal(RequestType.CREATE_ACCOUNT),\n data: zCreateAccountUserInputData,\n }),\n [RequestType.EDIT_ACCOUNT]: zVaultRequestMixinsByType[RequestType.EDIT_ACCOUNT],\n [RequestType.ACTIVATE_TRADELINK_ACCOUNT]:\n zVaultRequestMixinsByType[RequestType.ACTIVATE_TRADELINK_ACCOUNT],\n [RequestType.CREATE_TRADELINK_CUSTODIAN]:\n zVaultRequestMixinsByType[RequestType.CREATE_TRADELINK_CUSTODIAN],\n [RequestType.EDIT_TRADELINK_CUSTODIAN]:\n zVaultRequestMixinsByType[RequestType.EDIT_TRADELINK_CUSTODIAN],\n [RequestType.CREATE_TRADELINK_EXCHANGE]:\n zVaultRequestMixinsByType[RequestType.CREATE_TRADELINK_EXCHANGE],\n [RequestType.EDIT_TRADELINK_EXCHANGE]:\n zVaultRequestMixinsByType[RequestType.EDIT_TRADELINK_EXCHANGE],\n [RequestType.CREATE_TRADELINK_ASSET_MANAGER]:\n zVaultRequestMixinsByType[RequestType.CREATE_TRADELINK_ASSET_MANAGER],\n [RequestType.EDIT_TRADELINK_ASSET_MANAGER]:\n zVaultRequestMixinsByType[RequestType.EDIT_TRADELINK_ASSET_MANAGER],\n [RequestType.ADJUST_PLEDGE]: zVaultRequestMixinsByType[RequestType.ADJUST_PLEDGE],\n [RequestType.TRADELINK_REPLEDGE]: zVaultRequestMixinsByType[RequestType.TRADELINK_REPLEDGE],\n [RequestType.FORCE_UNPLEDGE]: zVaultRequestMixinsByType[RequestType.FORCE_UNPLEDGE],\n [RequestType.CREATE_SETTLEMENT]: zVaultRequestMixinsByType[RequestType.CREATE_SETTLEMENT],\n [RequestType.TRADELINK_WITHDRAW]: zVaultRequestMixinsByType[RequestType.TRADELINK_WITHDRAW],\n [RequestType.TRADELINK_ARBITRATE]: zVaultRequestMixinsByType[RequestType.TRADELINK_ARBITRATE],\n};\n\nconst zRequestCreationInputCommonMixin = z.object({\n note: zNote.optional().describe(\"Optional request note\"),\n});\n\n// To generate the OpenAPI schema with trpc-openapi, we need the input to be a zod object.\n// See: https://github.com/jlalmes/trpc-openapi?tab=readme-ov-file#requirements\nexport const zVaultRequestCreateInput = z.object({\n request: z.discriminatedUnion(\n \"type\",\n ensureNonEmptyArray(\n Object.values(allowedRequestCreationInputByType).map((_) => {\n // properly extract request type for documentation generation\n const requestType = _.shape.type._def.value;\n return _.merge(zRequestCreationInputCommonMixin).describe(`${requestType} request data`);\n }),\n ),\n ),\n});\n\nexport type VaultRequestCreateInput = z.infer<typeof zVaultRequestCreateInput>;\n\nexport const zVaultRequestResponse = z.discriminatedUnion(\n \"type\",\n ensureNonEmptyArray(\n Object.values(zVaultRequestMixinsByType).map((_) => {\n // properly extract request type for documentation generation\n const requestType = _.shape.type._def.value;\n return _.merge(zVaultRequestCommonMixin).describe(`${requestType} request`);\n }),\n ),\n);\n\nexport type VaultRequestResponse = z.infer<typeof zVaultRequestResponse>;\n\nexport const zRequestSortBy = z\n .enum([\n \"state\",\n \"expiresAt\",\n \"createdAt\",\n \"updatedAt\",\n ] as const satisfies (keyof VaultRequestResponse)[])\n .default(\"createdAt\");\n\nexport type RequestSortBy = z.infer<typeof zRequestSortBy>;\n\nexport const zUserChallengeResponse = z.object({\n pubKey: z.string().describe(\"Public key of the current user\"),\n challenge: zUserChallenge.describe(\"Challenge data to sign with the user's private key\"),\n});\n\nexport type UserChallengeResponse = z.infer<typeof zUserChallengeResponse>;\n","import type { VaultRequest } from \"@prisma/client\";\nimport { RequestState, RequestType } from \"@prisma/client\";\n\n/** Return whether a request with the given type and state should have a non-null `targetHsmId`. */\nexport const shouldHaveTargetHsmId = (\n request: Pick<VaultRequest, \"type\" | \"state\">,\n): boolean | undefined => {\n switch (request.type) {\n case RequestType.CREATE_ENTITY:\n case RequestType.EDIT_ENTITY:\n case RequestType.REVOKE_ENTITY:\n case RequestType.CREATE_SCICONFIG:\n case RequestType.EDIT_SCICONFIG:\n case RequestType.CREATE_API_KEY:\n case RequestType.EDIT_API_KEY:\n case RequestType.REVOKE_API_KEY:\n case RequestType.CREATE_WORKSPACE_RULE:\n case RequestType.EDIT_WORKSPACE_RULE:\n case RequestType.UPDATE_QUORUM:\n return false;\n case RequestType.CREATE_PSD_USER:\n case RequestType.CREATE_API_USER:\n case RequestType.CREATE_API_USER_ACCESS: // targeting / editing an existing `User`\n case RequestType.REVOKE_USER:\n case RequestType.CREATE_TRANSACTION:\n case RequestType.SIGN_MESSAGE:\n case RequestType.SIGN_DIGESTS:\n case RequestType.CREATE_ACCOUNT:\n case RequestType.EDIT_ACCOUNT:\n case RequestType.ACTIVATE_TRADELINK_ACCOUNT:\n case RequestType.CREATE_GROUP:\n case RequestType.EDIT_GROUP:\n case RequestType.REVOKE_GROUP:\n case RequestType.CREATE_WHITELIST:\n case RequestType.EDIT_WHITELIST:\n case RequestType.CREATE_POLICY:\n case RequestType.EDIT_POLICY:\n case RequestType.CREATE_TRADELINK_CUSTODIAN:\n case RequestType.EDIT_TRADELINK_CUSTODIAN:\n case RequestType.CREATE_TRADELINK_EXCHANGE:\n case RequestType.EDIT_TRADELINK_EXCHANGE:\n case RequestType.CREATE_TRADELINK_ASSET_MANAGER:\n case RequestType.EDIT_TRADELINK_ASSET_MANAGER:\n return request.state !== RequestState.INITIAL;\n case RequestType.EDIT_TOKEN_RULE:\n return true;\n }\n};\n\n/** Return whether a request with the given type and state should have a non-null `targetId`. */\nexport const shouldHaveTargetId = (request: Pick<VaultRequest, \"type\" | \"state\">): boolean => {\n switch (request.type) {\n case RequestType.CREATE_API_KEY:\n case RequestType.EDIT_API_KEY:\n case RequestType.REVOKE_API_KEY:\n // We don't wire read-only API keys for now on revault (and we may never will, as it is not\n // sure if we will synchronize those models and implement read-only API key auth)\n return false;\n case RequestType.CREATE_TRANSACTION:\n case RequestType.SIGN_MESSAGE:\n case RequestType.SIGN_DIGESTS:\n // TODO: We don't know how to wire, so just return the request unchanged.\n return false;\n case RequestType.UPDATE_QUORUM:\n case RequestType.CREATE_PSD_USER:\n case RequestType.CREATE_API_USER:\n case RequestType.CREATE_WORKSPACE_RULE:\n case RequestType.CREATE_ACCOUNT:\n case RequestType.CREATE_GROUP:\n case RequestType.CREATE_WHITELIST:\n case RequestType.CREATE_ENTITY:\n case RequestType.CREATE_SCICONFIG:\n case RequestType.CREATE_POLICY:\n case RequestType.CREATE_TRADELINK_CUSTODIAN:\n case RequestType.CREATE_TRADELINK_EXCHANGE:\n case RequestType.CREATE_TRADELINK_ASSET_MANAGER:\n // The request is to create the target object. The target object will exist only when\n // the request is executed.\n return request.state === RequestState.EXECUTED;\n case RequestType.EDIT_WORKSPACE_RULE:\n case RequestType.EDIT_ACCOUNT:\n case RequestType.ACTIVATE_TRADELINK_ACCOUNT:\n case RequestType.EDIT_TOKEN_RULE: // EDIT_TOKEN_RULE targetId is the parent account which must always exist, even when creating new token rule.\n case RequestType.EDIT_GROUP:\n case RequestType.REVOKE_GROUP:\n case RequestType.EDIT_WHITELIST:\n case RequestType.EDIT_ENTITY:\n case RequestType.REVOKE_ENTITY:\n case RequestType.CREATE_API_USER_ACCESS:\n case RequestType.REVOKE_USER:\n case RequestType.EDIT_SCICONFIG:\n case RequestType.EDIT_POLICY:\n case RequestType.EDIT_TRADELINK_CUSTODIAN:\n case RequestType.EDIT_TRADELINK_EXCHANGE:\n case RequestType.EDIT_TRADELINK_ASSET_MANAGER:\n case RequestType.ADJUST_PLEDGE:\n case RequestType.TRADELINK_REPLEDGE:\n case RequestType.CREATE_SETTLEMENT:\n case RequestType.FORCE_UNPLEDGE:\n case RequestType.TRADELINK_WITHDRAW:\n case RequestType.TRADELINK_ARBITRATE:\n return true;\n }\n};\n","import type { RequestSagaWithFailures } from \"@/workflows\";\n\nimport { type VaultRequestResponse, zVaultRequestResponse } from \"../app-types\";\nimport { type VaultRequestWithRelatedObjects } from \"../db-types\";\n\nexport { GateRequestService } from \"./gate-service\";\n\nexport function serializeVaultRequest(\n request: VaultRequestWithRelatedObjects,\n): VaultRequestResponse {\n const serialized = {\n ...request,\n legacyId: request.gateId,\n } satisfies Omit<VaultRequestResponse, \"type\" | \"data\" | \"reviewSteps\" | \"note\">;\n /* v8 ignore start */\n switch (request.type) {\n case \"CREATE_TRANSACTION\":\n case \"TRADELINK_WITHDRAW\":\n case \"TRADELINK_ARBITRATE\":\n case \"CREATE_SETTLEMENT\":\n Object.assign(serialized, {\n meta: {\n hash: request.transactionMeta?.hash ?? null,\n },\n });\n break;\n default:\n break;\n }\n /* v8 ignore stop */\n return zVaultRequestResponse.parse(serialized);\n}\n\nexport function serializeVaultRequestWithOngoingSaga(\n request: VaultRequestWithRelatedObjects,\n ongoingSaga: RequestSagaWithFailures | null,\n): VaultRequestResponse {\n let inflightField;\n if (ongoingSaga !== null) {\n const { retryAfter, failures } = ongoingSaga;\n const lastError = failures[failures.length - 1]!.message;\n const numFailed = failures.length;\n inflightField = {\n inflight: { lastError, numFailed, retryAfter },\n };\n } else {\n inflightField = {};\n }\n return {\n ...serializeVaultRequest(request),\n ...inflightField,\n };\n}\n","import { faker } from \"@faker-js/faker\";\nimport { ChallengeType } from \"@prisma/client\";\nimport { times } from \"lodash\";\n\nimport type { ApiChallenge, HsmCertificate, HsmChallengeSteps, PsdChallenge } from \"@/hsm\";\nimport { base64urlEncode } from \"@/utils\";\nimport type { Proof } from \"@/workflows\";\n\nexport const fakeHexString = (length: number, casing: \"lower\" | \"upper\" = \"upper\"): string =>\n faker.string.hexadecimal({ prefix: \"\", casing, length });\n\nexport const fakePubKey = (): string => fakeHexString(130);\n\nexport const fakeBlob = (length?: number): string => fakeHexString(length ?? 100);\n\nexport const fakeDeviceUserId = (): string =>\n faker.string.hexadecimal({ prefix: \"\", casing: \"upper\", length: 16 });\n\n/**\n * Generate a fake integer ID for postgres. For postgres, max value of an integer is 2147483647.\n * See: https://www.postgresql.org/docs/current/datatype-numeric.html\n */\nexport const fakeIntegerId = (): number => faker.number.int({ min: 1, max: 2000000000 });\n\n/** Generate a fake Gate ID, which is an integer primary key in postgres. */\nexport const fakeGateId = fakeIntegerId;\n\nexport const fakeBase64String = (length?: number): string => btoa(faker.string.sample(length));\n\nexport const fakePsdSignature = (): string => fakeBase64String(100);\n\nexport const fakeJws = (): string =>\n times(3, () => faker.string.hexadecimal({ prefix: \"\", length: 100 })).join(\".\");\n\nexport const fakeHsmObjectId = (): string => faker.string.uuid();\n\nexport const fakeHsmCertificate = (): HsmCertificate => ({\n codeHash: fakeBase64String(10),\n attestationPub: fakeBase64String(20),\n certificate: fakeBase64String(20),\n signature: fakeBase64String(20),\n});\n\nexport const fakePsdChallenge = (): PsdChallenge => ({\n challengeType: \"PSD\",\n wActions: [fakeBase64String(50), fakeBase64String(50), fakeBase64String(50)],\n handshake: fakeBase64String(100),\n handshakeAttestation: fakeHsmCertificate(),\n partitionId: fakeBase64String(20),\n});\n\nexport const fakeApiChallenge = (): ApiChallenge => ({\n challengeType: \"API\",\n payload: {\n approve: base64urlEncode({ randomHex: fakeHexString(20), action: \"approve\" }),\n reject: base64urlEncode({ randomHex: fakeHexString(20), action: \"reject\" }),\n },\n});\n\nexport const fakePsdProof = (): Proof => ({\n signature: fakeBase64String(100),\n challengeType: ChallengeType.PSD,\n});\n\n/**\n * HSM challenges are an array of record indexed by user's public key\n */\nexport const fakeHsmChallenges = (type: ChallengeType, pubKeys?: string[]): HsmChallengeSteps => {\n const challengeKeys = pubKeys ?? times(3, () => fakePubKey());\n const fakeChallengeFunctions = {\n [ChallengeType.PSD]: fakePsdChallenge,\n [ChallengeType.API]: fakeApiChallenge,\n } as const;\n const fakeChallenge = fakeChallengeFunctions[type];\n return [Object.fromEntries(challengeKeys.map((pubKey) => [pubKey, fakeChallenge()]))];\n};\n\nexport const fakeWorkspaceName = (): string => faker.string.alpha({ length: 8, casing: \"lower\" });\n\n// Compartment id is stored as a integer in the prisma schema, which are signed 32bits on postgres\n// Hence, pick a number between 0 and 2^31 - 1 (0x7fffffff)\nexport const fakeCompartmentId = (): number => faker.number.int({ max: 0x7fffffff });\n\nexport const fakeRootCaHex = (): string => fakeHexString(260);\nexport const fakeRootCaBase64 = (): string =>\n Buffer.from(fakeRootCaHex(), \"hex\").toString(\"base64\");\n","import { faker } from \"@faker-js/faker\";\n\nimport type { GateType } from \"@/sync-utils\";\nimport { buildGateSyncId } from \"@/sync-utils\";\n\nexport type MaybeFromGate = {\n workspaceName: string;\n gateType: GateType | null;\n gateId: number;\n syncId?: string; // If provided, do not overwrite.\n};\n\nexport const injectSyncId = <T extends MaybeFromGate>(obj: T): T & { syncId: string } => {\n let { syncId } = obj;\n if (syncId === undefined) {\n if (obj.gateType !== null && obj.gateId !== 0) {\n syncId = buildGateSyncId(obj.workspaceName, obj.gateType, obj.gateId);\n } else if (obj.gateType === null && obj.gateId === 0) {\n syncId = faker.string.uuid();\n } else {\n throw new Error(`Invalid gateType and gateId: ${obj.gateType}, ${obj.gateId}`);\n }\n }\n return { ...obj, syncId };\n};\n","import { faker } from \"@faker-js/faker\";\nimport type { Account, ClassicGovernanceMixin, TradelinkGovernanceMixin } from \"@prisma/client\";\nimport {\n AccountGovernanceType,\n AccountType,\n ActivationStatus,\n GateAccountType,\n} from \"@prisma/client\";\n\nimport { type AccountWithGovernanceMixins } from \"@/accounts\";\n\nimport { fakeGateId, fakeHsmObjectId, fakeWorkspaceName } from \"../faker-utils\";\nimport { injectSyncId } from \"./sync-id-utils\";\n\nconst genAssetFieldsForType = (\n type: AccountType,\n): Pick<\n Account,\n | \"type\"\n | \"currency\"\n | \"derivationPath\"\n | \"address\"\n | \"contractAddress\"\n | \"xpub\"\n | \"hsmXpub\"\n | \"hsmChainCode\"\n> => {\n const hsmXpub = faker.string.hexadecimal({ prefix: \"\", casing: \"upper\", length: 66 });\n const hsmChainCode = faker.string.hexadecimal({ prefix: \"\", casing: \"upper\", length: 64 });\n switch (type) {\n case \"BITCOIN_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"bitcoin\", \"bitcoin_testnet\"]),\n derivationPath: \"84'/0'/0'\",\n address: null,\n contractAddress: null,\n xpub: faker.string.hexadecimal({ prefix: \"\", length: 120 }),\n hsmXpub,\n hsmChainCode,\n };\n case \"ETHEREUM_LIKE\": // fall-through...\n case \"ERC20_LIKE\":\n case \"BEP20_LIKE\":\n return {\n type,\n currency:\n type === \"BEP20_LIKE\"\n ? \"bsc\"\n : faker.helpers.arrayElement([\"ethereum\", \"ethereum_goerli\"]),\n derivationPath: \"44'/60'/0'\",\n address: faker.finance.ethereumAddress(),\n contractAddress: type === \"ETHEREUM_LIKE\" ? null : faker.finance.ethereumAddress(),\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"CARDANO_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"cardano\"]),\n derivationPath: \"1852'/1815'/0'\",\n address: `addr${faker.string.alphanumeric({ length: 100, casing: \"lower\" })}`,\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"SOLANA_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"solana\"]),\n derivationPath: \"44'/501'/0'\",\n address: faker.string.alphanumeric({ length: 44, casing: \"lower\" }),\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode: null,\n };\n case \"TEZOS_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"tezos\"]),\n derivationPath: \"44'/1729'/0'\",\n address: `tz${faker.string.alphanumeric({ length: 34, casing: \"mixed\" })}`,\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"STELLAR_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"stellar\"]),\n derivationPath: \"44'/148'/0'\",\n address: faker.string.alphanumeric({ length: 56, casing: \"upper\" }),\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"RIPPLE_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"ripple\"]),\n derivationPath: \"44'/144'/0'\",\n address: faker.string.alphanumeric({ length: 34, casing: \"mixed\" }),\n contractAddress: null,\n xpub: `xpub${faker.string.alphanumeric({ length: 107, casing: \"mixed\" })}`,\n hsmXpub,\n hsmChainCode,\n };\n case \"POLKADOT_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"polkadot\"]),\n derivationPath: \"44'/354'/0'\",\n address: faker.string.alphanumeric({ length: 48, casing: \"mixed\" }),\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode: null,\n };\n case \"TRC20_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"tron\"]),\n derivationPath: \"44'/195'/0'\",\n address: faker.string.alphanumeric({ length: 34, casing: \"mixed\" }),\n contractAddress: faker.string.alphanumeric({ length: 34, casing: \"mixed\" }),\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"GENERIC_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"cosmos\"]),\n derivationPath: \"44'/118'/0'\",\n address: faker.string.alphanumeric({ length: 34, casing: \"mixed\" }),\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"RAW_SIGNING\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"ethereum\", \"bitcoin\"]),\n derivationPath: \"44'/118'/0'\",\n address: null,\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n }\n};\n\nconst genGovernanceFieldsForType = (\n governanceType: AccountGovernanceType,\n {\n accountId,\n policyId,\n assetManagerId,\n }: { accountId: string; policyId?: string; assetManagerId?: string },\n):\n | {\n governanceType: typeof AccountGovernanceType.CLASSIC;\n classicGovernanceMixin: ClassicGovernanceMixin;\n tradelinkGovernanceMixin: null;\n }\n | {\n governanceType: typeof AccountGovernanceType.TRADELINK;\n classicGovernanceMixin: null;\n tradelinkGovernanceMixin: TradelinkGovernanceMixin;\n }\n | {\n governanceType: typeof AccountGovernanceType.RAW_SIGNING;\n classicGovernanceMixin: ClassicGovernanceMixin;\n tradelinkGovernanceMixin: null;\n } => {\n switch (governanceType) {\n case AccountGovernanceType.CLASSIC:\n case AccountGovernanceType.RAW_SIGNING:\n return {\n governanceType,\n classicGovernanceMixin: {\n id: faker.number.int(),\n policyId: policyId ?? faker.string.uuid(),\n accountId: accountId,\n },\n tradelinkGovernanceMixin: null,\n };\n case AccountGovernanceType.TRADELINK:\n return {\n governanceType,\n classicGovernanceMixin: null,\n tradelinkGovernanceMixin: {\n id: faker.number.int(),\n assetManagerId: assetManagerId ?? faker.string.uuid(),\n accountId: accountId,\n exchangeConfigs: [],\n status: ActivationStatus.ACTIVE,\n },\n };\n }\n};\n\nexport const genAccount = (\n opts?: Partial<Account> & { policyId?: string; assetManagerId?: string },\n): AccountWithGovernanceMixins => {\n const { policyId, assetManagerId, ...rest } = opts ?? {};\n const commonFields = {\n id: faker.string.uuid(),\n workspaceName: fakeWorkspaceName(),\n name: faker.finance.accountName(),\n hsmId: fakeHsmObjectId(),\n status: ActivationStatus.ACTIVE,\n index: faker.number.int({ min: 0, max: 10 }),\n gateId: fakeGateId(),\n gateType: GateAccountType.Account,\n createdAt: faker.date.past(),\n updatedAt: faker.date.past(),\n };\n const assetFields = genAssetFieldsForType(\n opts?.type ?? faker.helpers.arrayElement(Object.values(AccountType)),\n );\n const governanceFields = genGovernanceFieldsForType(\n opts?.governanceType ?? faker.helpers.arrayElement(Object.values(AccountGovernanceType)),\n { accountId: commonFields.id, policyId, assetManagerId },\n );\n return injectSyncId({\n ...commonFields,\n ...governanceFields,\n ...assetFields,\n ...rest,\n });\n};\n","import { faker } from \"@faker-js/faker\";\nimport type { VaultRequest, VaultRequestReview } from \"@prisma/client\";\nimport { ChallengeType, RequestReviewStatus, RequestState, RequestType } from \"@prisma/client\";\nimport { times } from \"lodash\";\n\nimport type {\n CreateAccountRequestData,\n CreateSciConfigRequestData,\n EditAccountRequestData,\n EditSciConfigRequestData,\n EditTokenRuleRequestData,\n} from \"@/accounts\";\nimport type { CreateApiKeyRequestData, EditApiKeyRequestData } from \"@/api-keys/api-key-requests\";\nimport type { CreateEntityRequestData, EditEntityRequestData } from \"@/entities/entity-requests\";\nimport type { UpdateQuorumRequestData } from \"@/governance\";\nimport type { WorkspaceRuleRequestData } from \"@/governance/workspace-rule-requests\";\nimport type { CreateGroupRequestData, EditGroupRequestData } from \"@/groups\";\nimport type { UserChallenge } from \"@/hsm\";\nimport type { CreatePublicPolicyRequestData, EditPublicPolicyRequestData } from \"@/policies\";\nimport { shouldHaveTargetHsmId, shouldHaveTargetId } from \"@/requests/utils\";\nimport type {\n AdjustPledgeRequestData,\n CreateSettlementRequestData,\n ForceUnpledgeRequestData,\n RepledgeRequestData,\n TradelinkArbitrationRequestData,\n TradelinkWithdrawRequestData,\n} from \"@/tradelink\";\nimport type {\n CreateTransactionRequestData,\n SignDigestsRequestData,\n SignMessageRequestData,\n} from \"@/transactions\";\nimport type {\n CreateApiUserAccessRequestData,\n CreateApiUserRequestData,\n CreatePsdUserRequestData,\n} from \"@/users\";\nimport type {\n CreateWhitelistRequestData,\n EditWhitelistRequestData,\n} from \"@/whitelists/whitelist-requests\";\nimport type { RequestReviewStep } from \"@/workflows\";\n\nimport {\n fakeGateId,\n fakeHsmObjectId,\n fakeJws,\n fakePsdChallenge,\n fakePsdSignature,\n fakePubKey,\n fakeWorkspaceName,\n} from \"../../faker-utils\";\nimport { injectSyncId } from \"../sync-id-utils\";\nimport {\n genCreateAccountData,\n genEditAccountData,\n genEditTokenRuleData,\n} from \"./request-for-account\";\nimport { genCreateApiKeyData, genEditApiKeyData } from \"./request-for-api-key\";\nimport { genSignDigestsData } from \"./request-for-digests-signature\";\nimport { genCreateEntityData, genEditEntityData } from \"./request-for-entity\";\nimport { genCreateGroupData, genEditGroupData } from \"./request-for-group\";\nimport { genSignMessageData } from \"./request-for-message-signature\";\nimport { genCreatePolicyData, genEditPolicyData } from \"./request-for-policy\";\nimport { genCreateSciConfigData, genEditSciConfigData } from \"./request-for-sciconfig\";\nimport {\n genCreatePledgeIncrementData,\n genCreateSettlementData,\n genForceUnpledgeData,\n genRepledgeRequestData,\n genTradelinkArbitrationData,\n genTradelinkWithdrawData,\n} from \"./request-for-tradelink\";\nimport { genCreateTransactionData } from \"./request-for-transaction\";\nimport {\n genCreateApiUserAccessData,\n genCreateApiUserData,\n genCreatePsdUserData,\n} from \"./request-for-user\";\nimport { genCreateWhitelistData, genEditWhitelistData } from \"./request-for-whitelist\";\nimport { genWorkspaceRuleData } from \"./request-for-workspace-rule\";\n\nexport type RequestDataTypes = {\n // Workspace...\n [RequestType.UPDATE_QUORUM]: UpdateQuorumRequestData;\n // User...\n [RequestType.CREATE_PSD_USER]: CreatePsdUserRequestData;\n [RequestType.CREATE_API_USER]: CreateApiUserRequestData;\n [RequestType.CREATE_API_USER_ACCESS]: CreateApiUserAccessRequestData;\n [RequestType.REVOKE_USER]: Record<string, never>;\n // Admin gov rule...\n [RequestType.CREATE_WORKSPACE_RULE]: WorkspaceRuleRequestData;\n [RequestType.EDIT_WORKSPACE_RULE]: WorkspaceRuleRequestData;\n // Group...\n [RequestType.CREATE_GROUP]: CreateGroupRequestData;\n [RequestType.EDIT_GROUP]: EditGroupRequestData;\n [RequestType.REVOKE_GROUP]: Record<string, never>;\n // API key...\n [RequestType.CREATE_API_KEY]: CreateApiKeyRequestData;\n [RequestType.EDIT_API_KEY]: EditApiKeyRequestData;\n [RequestType.REVOKE_API_KEY]: Record<string, never>;\n // Whitelist...\n [RequestType.CREATE_WHITELIST]: CreateWhitelistRequestData;\n [RequestType.EDIT_WHITELIST]: EditWhitelistRequestData;\n // Entity...\n [RequestType.CREATE_ENTITY]: CreateEntityRequestData;\n [RequestType.EDIT_ENTITY]: EditEntityRequestData;\n [RequestType.REVOKE_ENTITY]: Record<string, never>;\n // Account...\n [RequestType.CREATE_ACCOUNT]: CreateAccountRequestData;\n [RequestType.EDIT_ACCOUNT]: EditAccountRequestData;\n [RequestType.EDIT_TOKEN_RULE]: EditTokenRuleRequestData;\n // Operator requests...\n [RequestType.CREATE_TRANSACTION]: CreateTransactionRequestData;\n [RequestType.SIGN_MESSAGE]: SignMessageRequestData;\n [RequestType.SIGN_DIGESTS]: SignDigestsRequestData;\n // SCI config ...\n [RequestType.CREATE_SCICONFIG]: CreateSciConfigRequestData;\n [RequestType.EDIT_SCICONFIG]: EditSciConfigRequestData;\n // Policy\n [RequestType.CREATE_POLICY]: CreatePublicPolicyRequestData;\n [RequestType.EDIT_POLICY]: EditPublicPolicyRequestData;\n // Tradelink...\n [RequestType.ADJUST_PLEDGE]: AdjustPledgeRequestData;\n [RequestType.TRADELINK_REPLEDGE]: RepledgeRequestData;\n [RequestType.CREATE_SETTLEMENT]: CreateSettlementRequestData;\n [RequestType.FORCE_UNPLEDGE]: ForceUnpledgeRequestData;\n [RequestType.TRADELINK_WITHDRAW]: TradelinkWithdrawRequestData;\n [RequestType.TRADELINK_ARBITRATE]: TradelinkArbitrationRequestData;\n};\n\n/**\n * A more strict subtype of `VaultRequest`: The `data` field should be a `Prisma.JsonValue`\n * (in this case, a `Prisma.JsonObject`) __AND__ also of type `D`.\n */\nexport type RequestWith<D> = VaultRequest & { data: D };\n\nexport const genRequestData = <T extends keyof RequestDataTypes>(\n type: T,\n opts?: Partial<RequestDataTypes[T]>,\n): RequestDataTypes[T] => {\n switch (type) {\n // Workspace...\n case RequestType.UPDATE_QUORUM:\n return { quorum: 3, ...opts } as RequestDataTypes[T];\n\n // User...\n case RequestType.CREATE_PSD_USER:\n return genCreatePsdUserData(opts) as RequestDataTypes[T];\n case RequestType.CREATE_API_USER:\n return genCreateApiUserData(opts) as RequestDataTypes[T];\n case RequestType.CREATE_API_USER_ACCESS:\n return genCreateApiUserAccessData(opts) as RequestDataTypes[T];\n case RequestType.REVOKE_USER:\n return {} as RequestDataTypes[T];\n\n // Admin gov rule...\n case RequestType.CREATE_WORKSPACE_RULE:\n return genWorkspaceRuleData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_WORKSPACE_RULE:\n return genWorkspaceRuleData(opts) as RequestDataTypes[T];\n\n // Group...\n case RequestType.CREATE_GROUP:\n return genCreateGroupData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_GROUP:\n return genEditGroupData(opts) as RequestDataTypes[T];\n case RequestType.REVOKE_GROUP:\n return {} as RequestDataTypes[T];\n\n // ApiKey...\n case RequestType.CREATE_API_KEY:\n return genCreateApiKeyData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_API_KEY:\n return genEditApiKeyData(opts) as RequestDataTypes[T];\n case RequestType.REVOKE_API_KEY:\n return {} as RequestDataTypes[T];\n\n // Whitelist...\n case RequestType.CREATE_WHITELIST:\n return genCreateWhitelistData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_WHITELIST:\n return genEditWhitelistData(opts) as RequestDataTypes[T];\n\n // Entity...\n case RequestType.CREATE_ENTITY:\n return genCreateEntityData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_ENTITY:\n return genEditEntityData(opts) as RequestDataTypes[T];\n case RequestType.REVOKE_ENTITY:\n return {} as RequestDataTypes[T];\n\n // Account...\n case RequestType.CREATE_ACCOUNT:\n return genCreateAccountData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_ACCOUNT:\n return genEditAccountData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_TOKEN_RULE:\n return genEditTokenRuleData(opts) as RequestDataTypes[T];\n\n // Operator requests...\n case RequestType.CREATE_TRANSACTION:\n return genCreateTransactionData(opts) as RequestDataTypes[T];\n case RequestType.SIGN_MESSAGE:\n return genSignMessageData(opts) as RequestDataTypes[T];\n case RequestType.SIGN_DIGESTS:\n return genSignDigestsData(opts) as RequestDataTypes[T];\n\n // SCI config...\n case RequestType.CREATE_SCICONFIG:\n return genCreateSciConfigData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_SCICONFIG:\n return genEditSciConfigData(opts) as RequestDataTypes[T];\n\n // Policy\n case RequestType.CREATE_POLICY:\n return genCreatePolicyData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_POLICY:\n return genEditPolicyData(opts) as RequestDataTypes[T];\n\n // Tradelink...\n case RequestType.ADJUST_PLEDGE:\n return genCreatePledgeIncrementData(opts) as RequestDataTypes[T];\n case RequestType.CREATE_SETTLEMENT:\n return genCreateSettlementData(opts) as RequestDataTypes[T];\n case RequestType.FORCE_UNPLEDGE:\n return genForceUnpledgeData(opts) as RequestDataTypes[T];\n case RequestType.TRADELINK_WITHDRAW:\n return genTradelinkWithdrawData(opts) as RequestDataTypes[T];\n case RequestType.TRADELINK_REPLEDGE:\n return genRepledgeRequestData(opts) as RequestDataTypes[T];\n case RequestType.TRADELINK_ARBITRATE:\n return genTradelinkArbitrationData(opts) as RequestDataTypes[T];\n\n default: {\n const unknownType: never = type;\n throw new Error(`Unknown request type: ${unknownType}`);\n }\n }\n};\n\nexport const genRequestReviewSteps = (numSteps?: number): RequestReviewStep[] =>\n times(numSteps ?? 1, () => ({ stageName: \"default\", quorum: 2 }));\n\nexport type VaultRequestOpts<T extends keyof RequestDataTypes> = {\n type: T;\n data: RequestDataTypes[T];\n} & Partial<Omit<VaultRequest, \"type\" | \"data\">>;\n\nexport const genVaultRequest = <T extends keyof RequestDataTypes>(\n opts: VaultRequestOpts<T>,\n): RequestWith<RequestDataTypes[T]> => {\n const { type, state = RequestState.PENDING_APPROVAL, data, ...custom } = opts;\n const targetHsmId = shouldHaveTargetHsmId({ type, state })\n ? type === RequestType.CREATE_PSD_USER\n ? fakePubKey()\n : fakeHsmObjectId()\n : null;\n const targetId = shouldHaveTargetId({ type, state }) ? faker.string.uuid() : null;\n return injectSyncId({\n id: faker.string.uuid(),\n workspaceName: fakeWorkspaceName(),\n type,\n state,\n reviewSteps: genRequestReviewSteps(),\n currentStepIndex: 0,\n expiresAt: faker.date.future(),\n targetHsmId,\n createdById: faker.string.uuid(),\n createdAt: faker.date.past(),\n updatedAt: faker.date.past(),\n note: null,\n managedData: null,\n data,\n targetId,\n gateTargetType: \"Whatsoever\",\n gateTargetId: 0,\n gateType: \"Request\",\n gateId: fakeGateId(),\n // Note: Custom properties will overwrite the default ones. It is still possible for caller\n // to overwrite `targetId`. Thus it is not guaranteed that these values will always be\n // consistent with `type` and `state`.\n ...custom,\n });\n};\n\nexport const genVaultRequestReview = (\n opts?: Partial<VaultRequestReview & { challenge: UserChallenge }>,\n): VaultRequestReview => {\n const status = opts?.status ?? RequestReviewStatus.PENDING;\n const challenge = opts?.challenge ?? fakePsdChallenge();\n const { challengeType } = challenge;\n let signature;\n if (status !== RequestReviewStatus.APPROVED) {\n signature = null;\n } else {\n switch (challengeType) {\n case ChallengeType.PSD:\n signature = fakePsdSignature();\n break;\n case ChallengeType.API:\n signature = fakeJws();\n break;\n }\n }\n return {\n id: faker.number.int(),\n requestId: faker.string.uuid(),\n stageName: \"default\", // assume the simple case where there is one single stage\n stepIndex: 0,\n userId: faker.string.uuid(),\n pubKey: fakePubKey(),\n challengeType,\n challenge,\n signature,\n status,\n createdAt: faker.date.past(),\n updatedAt: faker.date.past(),\n ...opts,\n };\n};\n","import { faker } from \"@faker-js/faker\";\nimport type { Account, VaultRequestReview } from \"@prisma/client\";\nimport { AccountType } from \"@prisma/client\";\n\nimport { type AccountStakingFields } from \"@/accounts/account-staking-fields\";\nimport { type AccountResponse, zAccountResponse } from \"@/accounts/app-types\";\nimport { serializeAccount } from \"@/accounts/app-utils\";\nimport { type VaultRequestResponse } from \"@/requests/app-types\";\nimport { serializeVaultRequest } from \"@/requests/app-utils\";\n\nimport { genAccount, genVaultRequest } from \"./models\";\nimport { type RequestDataTypes } from \"./models/requests/requests-and-reviews\";\n\nexport const genStakingFields = (account: Account): AccountStakingFields | null => {\n switch (account.type) {\n case AccountType.BEP20_LIKE:\n return null;\n case AccountType.BITCOIN_LIKE:\n return null;\n case AccountType.CARDANO_LIKE:\n return {\n type: \"CARDANO_LIKE\",\n staking: {\n staked: faker.number.int().toString(),\n },\n };\n case AccountType.ERC20_LIKE:\n return null;\n case AccountType.ETHEREUM_LIKE:\n return {\n type: \"ETHEREUM_LIKE\",\n staking: {\n totalStaking: faker.number.int().toString(),\n totalRewards: faker.number.int().toString(),\n availableRewards: faker.number.int().toString(),\n networkApy: faker.number.float({ min: 0, max: 1 }),\n },\n };\n case AccountType.GENERIC_LIKE:\n return null;\n case AccountType.RAW_SIGNING:\n return null;\n case AccountType.POLKADOT_LIKE:\n return {\n type: \"POLKADOT_LIKE\",\n staking: {\n info: {\n controllerAddress: \"<fake-controller-address>\",\n rewardsDestination: \"<fake-rewards-destination>\",\n proxies: [\"<fake-proxy>\"],\n legacyStaking: false,\n isNominator: false,\n },\n balances: {\n free: faker.number.int().toString(),\n reserved: faker.number.int().toString(),\n frozen: faker.number.int().toString(),\n bonded: faker.number.int().toString(),\n available: faker.number.int().toString(),\n unbonding: [\n { amount: faker.number.int().toString(), waiting_time: \"<fake-waiting-time>\" },\n ],\n unbonded: [\n { amount: faker.number.int().toString(), waiting_time: \"<fake-waiting-time>\" },\n ],\n totalUnbonding: faker.number.int().toString(),\n totalUnbonded: faker.number.int().toString(),\n },\n anonymousProxy: {\n address: \"<fake-anonymous-proxy-address>\",\n createdAt: faker.date.past().toISOString(),\n isController: false,\n isMain: false,\n balances: {\n free: faker.number.int().toString(),\n reserved: faker.number.int().toString(),\n frozen: faker.number.int().toString(),\n bonded: faker.number.int().toString(),\n available: faker.number.int().toString(),\n total: faker.number.int().toString(),\n },\n blockHeight: faker.number.int().toString(),\n extIndex: faker.number.int().toString(),\n index: faker.number.int().toString(),\n kind: \"<fake-kind>\",\n },\n },\n };\n case AccountType.RIPPLE_LIKE:\n return null;\n case AccountType.SOLANA_LIKE:\n if (account.contractAddress) {\n return {\n type: \"SOLANA_LIKE\",\n staking: null,\n };\n }\n return {\n type: \"SOLANA_LIKE\",\n staking: {\n staked: faker.number.int().toString(),\n rewards: {\n total: faker.number.int().toString(),\n last7: faker.number.int().toString(),\n last30: faker.number.int().toString(),\n },\n stakes: [\n {\n uid: \"<fake-stake-uid>\",\n baseAccountUid: \"<fake-base-account-uid>\",\n pubKey: \"<fake-pub-key>\",\n validatorPubKey: \"<fake-validator-pub-key>\",\n initialAmount: faker.number.int().toString(),\n activeAmount: faker.number.int().toString(),\n inactiveAmount: faker.number.int().toString(),\n totalBalance: faker.number.int().toString(),\n creationDate: faker.date.past().toISOString(),\n activationEpoch: faker.date.past().toISOString(),\n activationDate: faker.date.past().toISOString(),\n deactivationEpoch: \"<fake-deactivation-epoch>\",\n deactivationDate: faker.date.past().toISOString(),\n status: \"activated\",\n rentExemptReserve: faker.number.int().toString(),\n withdrawableAmount: faker.number.int().toString(),\n totalRewards: faker.number.int().toString(),\n creationTxHash: \"<fake-creation-tx-hash>\",\n actionsTxHashes: [\"<fake-action-tx-hash>\"],\n },\n ],\n },\n };\n case AccountType.STELLAR_LIKE:\n return null;\n case AccountType.TEZOS_LIKE:\n return {\n type: \"TEZOS_LIKE\",\n staking: {\n delegations: [{ address: faker.string.alpha({ length: 10 }) }],\n },\n };\n case AccountType.TRC20_LIKE:\n return null;\n }\n};\n\nexport function genVaultRequestResponse<T extends keyof RequestDataTypes>(\n opts: Parameters<typeof genVaultRequest<T>>[0],\n reviews: VaultRequestReview[] = [],\n): VaultRequestResponse {\n const request = genVaultRequest(opts);\n const requestWithReviews = { ...request, reviews };\n return serializeVaultRequest(requestWithReviews);\n}\n\nexport function genAccountResponse(overrides?: Partial<Account>): AccountResponse {\n const dbAccount = genAccount(overrides);\n const account = serializeAccount(dbAccount);\n return zAccountResponse.parse(account);\n}\n"]}
1
+ {"version":3,"sources":["../src/zod-utils.ts","../src/types/operation.ts","../src/types/common.ts","../src/errors.ts","../src/sync-utils.ts","../src/utils.ts","../src/hsm/types.ts","../src/transactions/types.ts","../src/transactions/request-data.ts","../src/accounts/clients/types.ts","../src/accounts/account-asset-fields.ts","../src/governance/review-config.ts","../src/prisma-utils/policy.ts","../src/prisma-utils/review-config.ts","../src/governance/request-data.ts","../src/workspaces/utils.ts","../src/tradelink/types.ts","../src/tradelink/request-data.ts","../src/accounts/account-governance-fields.ts","../src/accounts/account-staking-fields.ts","../src/accounts/types.ts","../src/accounts/app-types.ts","../src/whitelists/db-types.ts","../src/whitelists/whitelist-requests.ts","../src/policies/db-utils.ts","../src/policies/request-data.ts","../src/accounts/request-data.ts","../src/accounts/app-utils.ts","../src/accounts/sci/request-data.ts","../src/workflows/types.ts","../src/users/types.ts","../src/users/request-data.ts","../src/groups/request-data.ts","../src/api-keys/api-key-requests.ts","../src/entities/entity-requests.ts","../src/governance/workspace-rule-requests.ts","../src/requests/request-data.ts","../src/requests/app-types.ts","../src/requests/utils.ts","../src/requests/app-utils/index.ts","../src/__fakes__/faker-utils.ts","../src/__fakes__/models/sync-id-utils.ts","../src/__fakes__/models/accounts.ts","../src/__fakes__/models/requests/requests-and-reviews.ts","../src/__fakes__/responses.ts"],"names":["z","AccountType","ActivationStatus","zCurrency","AccountGovernanceType","PsdModel","omit","RequestType","RequestState","faker","times","RequestReviewStatus","ChallengeType"],"mappings":"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","file":"fakes.mjs","sourcesContent":["import { z } from \"zod\";\n\nexport const zHexString = z.string().regex(/^[0-9a-fA-F]+$/);\n\nexport const zIntString = z\n .string()\n .nonempty()\n .regex(/^(-?[1-9]\\d*|0)$/);\n\nexport const zUnsignedIntString = z\n .string()\n .nonempty()\n .regex(/^([1-9]\\d*|0)$/);\n\nexport const zCurrency = z.string().nonempty().max(40).regex(/^\\w+$/).describe(\"Currency\");\n\nexport const zHsmObjectId = z\n .string()\n .regex(/^[\\w-]+$/) // TODO: what is the exact format of an HSM ID?\n .min(1);\n\nexport type HsmObjectId = z.infer<typeof zHsmObjectId>;\n","import { z } from \"zod\";\n\nimport type { TypeEquals } from \"@/type-utils\";\nimport { zCurrency, zUnsignedIntString } from \"@/zod-utils\";\n\n// #region ---------- Operation by type -----------------------------------------------------------\n\nconst zValueTransactionOperationType = z.enum([\n \"SEND\",\n \"STAKE\",\n \"DEPLOY_CONTRACT\",\n \"EXECUTE_CONTRACT\",\n \"ACTIVATE_TOKEN\",\n]);\n\nexport const zValueTransactionOperation = z.object({\n type: zValueTransactionOperationType,\n currency: zCurrency,\n recipient: z.string().nonempty(),\n destinationTag: z.string().nonempty().optional(),\n value: zUnsignedIntString,\n});\n\nexport type ValueTransactionOperation = z.infer<typeof zValueTransactionOperation>;\n\nconst zSigningOperationType = z.enum([\"SIGN_MESSAGE\", \"SIGN_DIGESTS\"]);\n\nexport const zSigningOperation = z.object({\n type: zSigningOperationType,\n});\n\nexport type SigningOperation = z.infer<typeof zSigningOperation>;\n\n// #endregion\n\n// #region ---------- Operation by governance -----------------------------------------------------\n\n/** Operation type that is allowed on an account */\nexport const zClassicOperationType = z.enum([\n \"SEND\",\n \"STAKE\",\n \"DEPLOY_CONTRACT\",\n \"EXECUTE_CONTRACT\",\n \"SIGN_MESSAGE\",\n \"ACTIVATE_TOKEN\",\n]);\n\nexport type ClassicOperationType = z.infer<typeof zClassicOperationType>;\n\nexport const zRawSigningOperationType = z.enum([\"SIGN_DIGESTS\"]);\n\nexport type RawSigningOperationType = z.infer<typeof zRawSigningOperationType>;\n\n// #endregion\n\n// #region ---------- Aggregated ------------------------------------------------------------------\n\nexport const zOperationType = z.enum([\n ...zValueTransactionOperationType.options,\n ...zSigningOperationType.options,\n]);\n\nexport type OperationType = z.infer<typeof zOperationType>;\n\nexport const zOperation = z.discriminatedUnion(\"type\", [\n zValueTransactionOperation,\n zSigningOperation,\n]);\n\nexport type Operation = z.infer<typeof zOperation>;\n\n// #endregion\n\n// #region ---------- Utilities -------------------------------------------------------------------\n\nexport const isValueTransaction = (\n operation: Operation,\n): operation is ValueTransactionOperation => {\n const validTypes: OperationType[] = zValueTransactionOperationType.options;\n return validTypes.includes(operation.type);\n};\n\n// #endregion\n\n/* v8 ignore start */\n// This function is only used for type-checking.\nconst _ensureOperationType = (\n shouldBeTrue: TypeEquals<OperationType, ClassicOperationType | RawSigningOperationType>,\n): true => shouldBeTrue;\n/* v8 ignore stop */\n","import z from \"zod\";\n\nexport const zNote = z.object({\n title: z.string().describe(\"Note title\"),\n content: z.string().describe(\"Note content\"),\n});\n\nexport type Note = z.infer<typeof zNote>;\n","/** Error thrown when a model object does not pass the validation. */\nexport class ValidationError extends Error {}\n\n/** Error thrown when data is in an unexpected state - e.g. missing objects or duplicate entries */\nexport class DataInconsistencyError extends Error {}\n","import type {\n GateAccountType,\n GateEntityType,\n GateGroupType,\n GatePolicyType,\n GateRequestType,\n GateReviewConfigType,\n GateSciConfigType,\n GateUserType,\n GateWhitelistType,\n GateWorkspaceRuleType,\n} from \"@prisma/client\";\n\nimport { ValidationError } from \"./errors\";\n\nexport type GateType =\n | GateAccountType\n | GateEntityType\n | GateGroupType\n | GateReviewConfigType\n | GatePolicyType\n | GateRequestType\n | GateUserType\n | GateWhitelistType\n | GateWorkspaceRuleType\n | GateSciConfigType;\n\nconst GATE_SYNC_ID_PREFIX = \"gate://\";\n\n/** Build `syncId` for object synchronized from Gate. */\nexport const buildGateSyncId = (\n workspaceName: string,\n gateType: GateType,\n gateId: number,\n): string => {\n if (gateId <= 0) {\n throw new ValidationError(`Invalid gate ID: ${gateId}`);\n }\n return `${GATE_SYNC_ID_PREFIX}${workspaceName}/${gateType}/${gateId}`;\n};\n\n/**\n * Object that might have been synchronized from Gate.\n *\n * - To create a new object, `gateType` can be omitted (like `gateId` and `syncId`).\n * - For an object already saved in DB, `gateType` can be null.\n */\nexport type Syncable<T> = Omit<T, \"gateType\" | \"gateId\" | \"syncId\"> & {\n workspaceName: string;\n gateType?: GateType | null;\n gateId?: number;\n syncId?: string;\n};\n\n/**\n * Validate object sync fields.\n *\n * Following are some possible combinations:\n *\n * - All the fields are missing (`undefined`): This happens when we create a new object which\n * does not come from Gate. In such case, we will use default values defined in Prisma schema.\n * - All the fields are present:\n * - When `gateType` is not null: This happens for objects that come from Gate.\n * - When `gateType` is null: This happens for objects that do not come from Gate.\n *\n * All other combinations should be considered as invalid.\n */\nexport const validateSyncFields = <T>(syncable: Syncable<T>): void => {\n const { workspaceName, gateType, gateId, syncId } = syncable;\n\n // Case 1: All fields are missing.\n if (gateType === undefined && gateId === undefined && syncId === undefined) {\n return;\n }\n\n // Case 2: All fields are present...\n if (gateType !== undefined && gateId !== undefined && syncId !== undefined) {\n if (gateType !== null) {\n // Case 2.1: `gateType` is not null: Object is coming from Gate.\n if (gateId <= 0) {\n throw new ValidationError(`Invalid gateId for ${gateType}: ${gateId}`);\n }\n const expectedSyncId = buildGateSyncId(workspaceName, gateType, gateId);\n if (expectedSyncId !== syncId) {\n throw new ValidationError(`Invalid syncId: expected ${expectedSyncId} but got ${syncId}`);\n }\n } else {\n // Case 2.2: `gateType` is null: Object is not coming from Gate.\n if (gateId !== 0) {\n throw new ValidationError(`Expected gateId to be 0 but got: ${gateId}`);\n }\n if (syncId.startsWith(GATE_SYNC_ID_PREFIX)) {\n throw new ValidationError(\n `Invalid syncId: ${syncId} should not start with ${GATE_SYNC_ID_PREFIX}`,\n );\n }\n }\n return;\n }\n\n // All other cases are considered invalid.\n throw new ValidationError(`Inconsistent sync fields: ${gateType}, ${gateId}, ${syncId}`);\n};\n","import { Prisma } from \"@prisma/client\";\nimport { AxiosError } from \"axios\";\nimport invariant from \"invariant\";\nimport { isPlainObject, omit, uniq, uniqBy } from \"lodash\";\nimport crypto from \"node:crypto\";\nimport z from \"zod\";\n\nimport { DataInconsistencyError } from \"./errors\";\nimport type { GateType } from \"./sync-utils\";\nimport { buildGateSyncId } from \"./sync-utils\";\n\nexport const formatError = (err: unknown): string => {\n if (err instanceof AxiosError) {\n // See: https://axios-http.com/docs/handling_errors\n return `AxiosError: ${err.message ?? \"no detail provided\"}`;\n }\n if (err instanceof z.ZodError) {\n return `ZodError: ${JSON.stringify(err.flatten())}`;\n }\n return err instanceof Error ? err.message : /* v8 ignore next */ `${err} (${typeof err})`;\n};\n\n/** A type guard to assert that a value is a record. */\nexport const isRecord = (value: unknown): value is Record<string, unknown> => isPlainObject(value);\n\n/**\n * Convert an arbitrary value to a `Prisma.JsonValue` suitable to be assigned to a `Json` field.\n * @param value - the value to convert\n * @returns a `Prisma.JsonValue`\n */\nexport const toJsonValue = (value: unknown): Prisma.JsonValue => {\n const jsonPrimitives = [\"string\", \"number\", \"boolean\"];\n if (value === undefined) {\n throw new Error(\"Tried to convert undefined to JSON\");\n }\n if (value === null) {\n return null;\n }\n if (jsonPrimitives.includes(typeof value)) {\n return value;\n }\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n if (value instanceof Date) {\n return `${value.toISOString().slice(0, -5)}Z`; // Strip off milliseconds.\n }\n if (Array.isArray(value)) {\n return toJsonArray(value);\n }\n if (isRecord(value)) {\n return toJsonObject(value);\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string -- intended\n return String(value); // We can't do any better...\n};\n\n/**\n * Convert an arbitrary object to a `Prisma.JsonObject` suitable to be assigned to a `Json` field.\n * @param value - the object to convert\n * @returns a `Prisma.JsonObject`\n */\nexport const toJsonObject = (obj: Record<string, unknown>): Prisma.JsonObject => {\n return Object.fromEntries(\n Object.entries(obj)\n // strip off `undefined` values\n .filter(([_k, v]) => v !== undefined)\n .map(([k, v]): [string, Prisma.JsonValue] => {\n return [k, toJsonValue(v)];\n }),\n );\n};\n\nexport const toJsonArray = (obj: unknown[]): Prisma.JsonArray => obj.map(toJsonValue);\n\nexport type InputJsonValueOrNull = Prisma.InputJsonValue | Prisma.NullTypes.JsonNull;\n\nexport const convertToInputJsonValueOrJsonNull = (value: Prisma.JsonValue): InputJsonValueOrNull =>\n /* v8 ignore next */\n value === null || value === undefined ? Prisma.JsonNull : (value as Prisma.InputJsonValue);\n\n/**\n * Transform the object by iterating through the specified Json fields and converting all `null`\n * values to `Prisma.JsonNull`.\n *\n * Prisma does not accept `null` when writing to a Json field. This is because of the ambiguity\n * that there exist two possible null values: `Prisma.DbNull` and `Prisma.JsonNull`. Given a list\n * of keys for the Json fields, this function converts all `null` values to `Prisma.JsonNull`.\n *\n * See: See: https://github.com/prisma/prisma/issues/13969\n */\nexport const convertNullToJsonNull = <\n K extends string,\n T extends Record<K, Prisma.JsonValue | null>,\n>(\n obj: T,\n jsonKeys: K[],\n): Omit<T, K> & Record<K, InputJsonValueOrNull> => {\n const inputJsonEntries = jsonKeys.map((k): [K, InputJsonValueOrNull] => {\n const value = obj[k];\n return [k, value ?? Prisma.JsonNull];\n });\n const inputJsonFields = Object.fromEntries(inputJsonEntries) as Record<K, InputJsonValueOrNull>;\n return { ...omit(obj, jsonKeys), ...inputJsonFields };\n};\n\nexport const validateJsonField = (fieldName: string, value: unknown, schema: z.ZodType): void => {\n try {\n schema.parse(value);\n } catch (err) {\n throw new Error(`Invalid ${fieldName} field: ${formatError(err)}`);\n }\n};\n\n/**\n * Sleep for given ms\n *\n * @param ms - number of milliseconds to sleep\n * @returns Promise<void>\n */\nexport async function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * Generate random hex string\n * @param length - length in bytes\n * @returns 'length' bytes long hex string\n */\nexport const randomHex = (length: number): string =>\n Array.from(crypto.getRandomValues(new Uint8Array(length)))\n .map((v) => (v % 16).toString(16))\n .join(\"\")\n .toUpperCase();\n\nexport const genAuthUserId = (): string => randomHex(40);\n\n/**\n * Return the unique item in an array, or null if the array is empty.\n * @throws an error if the array contains multiple items.\n */\nexport const getUniqueOrNull = <T>(items: T[], msg: () => string): T | null => {\n if (items.length > 1) {\n throw new DataInconsistencyError(`Expected 0 or 1 but got ${items.length}: ${msg()}`);\n }\n return items.length === 0 ? null : items[0]!;\n};\n\n/**\n * Return the unique item in an array.\n * @throws an error if the array is empty or contains multiple items.\n */\nexport const getUniqueOrThrow = <T>(items: T[], msg: () => string): T => {\n if (items.length !== 1) {\n throw new DataInconsistencyError(`Expected 1 but got ${items.length}: ${msg()}`);\n }\n return items[0]!;\n};\n\n/** Extract object ids and join them to string. */\nexport const joinObjectIds = <T extends { id: string }>(objects: T[]): string =>\n objects.map((_) => _.id).join(\", \");\n\nexport const uniqById = <T extends { id: string }>(objects: T[]): T[] =>\n uniqBy(objects, (_) => _.id);\n\n/**\n * Given an array of string ids, return an array of objects containing only the `id` field.\n * The result is suitable for connecting or setting model foreign keys.\n */\nexport const wrapToObjectsWithId = (ids: string[]): { id: string }[] =>\n uniq(ids).map((id) => ({ id }));\n\n/**\n * Used in tRPC procedures to give ability to bypass automatic inference of query & mutations input/output\n * Handy when some performance problems starts to occur (e.g: request data inference).\n *\n * At static or build time, the given parametric type is used, removing tRPC need to compute the return\n * type.\n */\nexport const skipStaticInference = <T>(validator: z.ZodType): z.ZodType<T> => validator;\n\n/**\n * Return a `where` object for `findUnique` function for a given\n * ID, where it could be either revault uuid or gate ID (integer).\n */\nexport const compatWhereById = (\n workspaceName: string,\n type: GateType,\n id: string,\n): { workspaceName: string; id: string } | { workspaceName: string; syncId: string } => {\n // If `id` looks like an integer, assume it is the Gate ID.\n if (/^\\d+$/.test(id)) {\n const syncId = buildGateSyncId(workspaceName, type, parseInt(id, 10));\n return { workspaceName, syncId };\n }\n // Otherwise - it must be UUID\n return { workspaceName, id };\n};\n\n/**\n * Capitalize first letter of given string.\n */\nexport const capitalize = (text: string): string => text && text[0]!.toUpperCase() + text.slice(1);\n\n// #region ---------- Base64 ----------------------------------------------------------------------\n\nexport const base64urlEncode = (payload: Record<string, unknown>): string => {\n const jsonString = JSON.stringify(payload);\n return Buffer.from(jsonString, \"utf-8\").toString(\"base64url\").replace(/=+$/, \"\");\n};\n\nexport const base64urlDecode = (encodedPayload: string): Record<string, unknown> => {\n // Add missing padding chars to payload if necessary.\n const paddedBase64 = encodedPayload.padEnd(\n encodedPayload.length + ((4 - (encodedPayload.length % 4)) % 4),\n \"=\",\n );\n const decoded = JSON.parse(Buffer.from(paddedBase64, \"base64url\").toString(\"utf-8\"));\n invariant(isRecord(decoded), \"Decoded payload should be a JSON object\");\n return decoded;\n};\n\n// #endregion\n\n// #region ---------- Assertions ------------------------------------------------------------------\n\nexport const ensureNotNil = <T>(value: T | null | undefined, message?: string): T => {\n invariant(\n value !== null && value !== undefined,\n message ?? `Expected non-nil value but got ${value}`,\n );\n return value;\n};\n\n/**\n * Check the string is not nil and not empty, then return the trimmed string.\n */\nexport const ensureNonEmptyString = (\n value: string | null | undefined,\n message?: string,\n): string => {\n const trimmed = (value ?? \"\").trim();\n invariant(trimmed.length > 0, message ?? `Expected non-empty string but got: ${value}`);\n return trimmed;\n};\n\n/**\n * Ensure an array to be non-empty, and return the same array with a conforming type.\n * This is useful when used in combination of zod's `union` or `discriminatedUnion`.\n */\nexport const ensureNonEmptyArray = <T>(values: T[], message?: string): [T, ...T[]] => {\n invariant(\n values.length > 0,\n message ?? `Expected non-empty array but got one with length ${values.length}`,\n );\n return values as [T, ...T[]];\n};\n\n/* v8 ignore start */\n/**\n * Utility to enforce all branches are covered at compile time\n */\nexport function unreachable(value: never): never {\n throw new Error(`Un-covered: ${value}`);\n}\n/* v8 ignore stop */\n\n// #endregion\n","import { ChallengeType, PsdModel } from \"@prisma/client\";\nimport { z } from \"zod\";\n\nimport { type HsmObjectId, zHexString } from \"@/zod-utils\";\n\nexport type HsmObject = {\n hsmId: HsmObjectId;\n};\n\n// #region ---------- Common schemas & types ------------------------------------------------------\n\nexport const zPubKey = zHexString.describe(\"Public key\");\n\nexport type PubKey = z.infer<typeof zPubKey>;\n\nexport const zHsmCertificate = z.object({\n codeHash: z.string().base64().describe(\"Hash of the executable that generated this certificate\"),\n attestationPub: z.string().base64().describe(\"Attestation public key\"),\n certificate: z.string().base64().describe(\"Certificate bytes\"),\n signature: z.string().base64().describe(\"Certificate signature\"),\n});\n\nexport type HsmCertificate = z.infer<typeof zHsmCertificate>;\n\nexport const zBlob = z.string(); // TODO: .min(1).max(???).regex(???)\n\nexport type Blob = z.infer<typeof zBlob>;\n\nexport type HsmReviewStep = {\n quorum: number;\n users: PubKey[];\n};\n\nexport type HsmCurrency = {\n family: string;\n ticker: string; // hack: replaced by ledger id\n parameters: string; // the atp payload\n signature: string; // the atp signature\n};\n\n// #endregion\n\n// #region ---------- Challenge -------------------------------------------------------------------\n\nexport const zPsdChallenge = z.object({\n challengeType: z.literal(ChallengeType.PSD),\n wActions: z.array(z.string()).describe(\"Wrapped blobs that describe the screens to display\"),\n handshake: z.string().describe(\"Handshake for the HSM <-> PSD communication\"),\n handshakeAttestation: zHsmCertificate.describe(\n \"Handshake attestation to verify secure channel between HSM & PSD\",\n ),\n partitionId: z.string().describe(\"HSM partition id (maybe not useful)\"),\n});\n\nexport type PsdChallenge = z.infer<typeof zPsdChallenge>;\n\nexport const zApiChallenge = z.object({\n challengeType: z.literal(ChallengeType.API),\n payload: z\n .object({\n approve: z.string().describe(\"JSON payload to sign (as JWS) to approve\"),\n reject: z.string().describe(\"JSON payload to sign (as JWS) to reject\"),\n })\n .describe(\"JSON payload to approve and to reject\"),\n});\n\nexport type ApiChallenge = z.infer<typeof zApiChallenge>;\n\nexport const zUserChallenge = z.discriminatedUnion(\"challengeType\", [\n zPsdChallenge.describe(\"Necessary data to approve on a PSD\"),\n zApiChallenge.describe(\"Necessary data for approval by an API user\"),\n]);\n\nexport type UserChallenge = z.infer<typeof zUserChallenge>;\n\n/** A group of challenges indexed by pub key. */\nexport const zHsmChallengeGroup = z.record(zPubKey, zUserChallenge);\n\nexport type HsmChallengeGroup = z.infer<typeof zHsmChallengeGroup>;\n\n/**\n * One or more steps of challenges, each step contains a challenge group.\n * It is a 2D structure where the 1st dimension is \"step\", and the 2nd dimension is \"pubKey\".\n */\nexport const zHsmChallengeSteps = z.array(zHsmChallengeGroup);\n\nexport type HsmChallengeSteps = z.infer<typeof zHsmChallengeSteps>;\n\n// #endregion\n\n// #region ---------- Signature -------------------------------------------------------------------\n\n// TODO: Make it more strict (but don't be too strict).\nexport const zPsdSignature = z.string().min(1).describe(\"Signature from PSD\");\n\nexport type PsdSignature = z.infer<typeof zPsdSignature>;\n\n// TODO: Make it more strict (but don't be too strict).\nexport const zApiSignature = z.string().min(1).describe(\"Signature from API (JWS)\");\n\nexport type ApiSignature = z.infer<typeof zApiSignature>;\n\nexport const zUserApproval = z.discriminatedUnion(\"challengeType\", [\n z.object({\n challengeType: z.literal(ChallengeType.PSD),\n signature: zPsdSignature,\n }),\n z.object({\n challengeType: z.literal(ChallengeType.API),\n signature: zApiSignature,\n }),\n]);\n\nexport type UserApproval = z.infer<typeof zUserApproval>;\n\n/** A group of approvals indexed by pub key. */\nconst zHsmApprovalGroup = z.record(zPubKey, zUserApproval);\n\nexport type HsmApprovalGroup = z.infer<typeof zHsmApprovalGroup>;\n\n/**\n * One or more steps of approvals, each step contains an approval group.\n * This is a 2D matrix while the 1st dimension is \"step\", and the 2nd dimension is \"pubKey\".\n */\nexport const zHsmApprovalSteps = z.array(zHsmApprovalGroup);\n\nexport type HsmApprovalSteps = z.infer<typeof zHsmApprovalSteps>;\n\n/**\n * HSM approvals for approved stages. Key is the approved stage name, and value is an array of\n * approval steps where each step is a record of approvals indexed by user pub key.\n */\nexport type HsmApprovalStages = Record<string, HsmApprovalSteps>;\n\n/**\n * A challenge stage has a name and contains an array of one or more challenge steps.\n * Each challenge step contains challenges for multiple users, indexed by user's pub key.\n */\nexport const zHsmChallengeStage = z.object({\n stageName: z.string(),\n steps: zHsmChallengeSteps,\n});\n\nexport type HsmChallengeStage = z.infer<typeof zHsmChallengeStage>;\n\n// #endregion\n\n// #region ---------- User registration -----------------------------------------------------------\n\n/**\n * Device data submitted by the invited user, to generate a registration challenge.\n */\nexport const zUserRegistrationDeviceData = z\n .object({\n name: z.string().describe(\"Name of the user to register\"),\n psdModel: z.nativeEnum(PsdModel).describe(\"Device model\"),\n pubKey: zPubKey.describe(\"Device public key\"),\n confidentialityKey: zPubKey,\n psdEphemeralKey: zPubKey,\n psdEphemeralKeyAttestation: zHsmCertificate,\n })\n .describe(\"Data generated by the PSD to register on HSM\");\n\nexport type UserRegistrationDeviceData = z.infer<typeof zUserRegistrationDeviceData>;\n\n/**\n * Registration challenge for the invited user, generated by HSM.\n */\nexport const zUserRegistrationChallenge = z\n .object({\n challenge: z.string(),\n ephemeralPublicKey: zPubKey,\n ephemeralPublicKeyAttestation: zHsmCertificate,\n handshake: zHexString,\n handshakeAttestation: zHsmCertificate,\n u2fRegisterData: z.string(),\n ciphertext: z.string(),\n requestId: z.string(),\n })\n .describe(\"Challenge generated by HSM using the PSD registration data\");\n\nexport type UserRegistrationChallenge = z.infer<typeof zUserRegistrationChallenge>;\n\n/**\n * Response to the user registration challenge, submitted by the invited user.\n */\nexport const zUserRegistrationChallengeResponse = z\n .object({\n certificate: zHsmCertificate,\n u2fRegister: zHexString,\n u2fKeyHandle: zHexString,\n registerData: z.string(),\n validationKey: zPubKey,\n pairingPayload: z.string(),\n })\n .describe(\"Final registration response from PSD to HSM\");\n\nexport type UserRegistrationChallengeResponse = z.infer<typeof zUserRegistrationChallengeResponse>;\n\n// #endregion\n\n// #region ---------- PSD Pairing -----------------------------------------------------------------\n\nexport const zPsdPairingInputData = z.object({\n confidentialityKeyCurve25519: z.string(),\n confidentialityKeySignature: z.string(),\n});\n\nexport type PsdPairingInputData = z.infer<typeof zPsdPairingInputData>;\n\nexport const zPsdPairingData = z.object({\n pairing: z.object({\n workspaceName: z.string(),\n partitionKey: z.string(), // TODO: Is this `zPubKey`?\n bootstrapEnabled: z.boolean(),\n }),\n // TODO: Is this `zHsmCertificate`?\n partitionKeyAttestation: z.object({\n codeHash: z.string(),\n attestationPub: z.string(),\n certificate: z.string(),\n signature: z.string(),\n }),\n blob: zBlob,\n});\n\nexport type PsdPairingData = z.infer<typeof zPsdPairingData>;\n\n// #endregion\n\n// #region ---------- Signatures ------------------------------------------------------------------\n\nexport const zHsmSignature = z.object({\n digest: z.string().nullable().describe(\"Signed digest\"),\n derivationPath: z.string().nullable().describe(\"Derivation path used to sign the digest\"),\n r: z.string().base64().describe(\"Base64 encoded signature r coordinate\"),\n s: z.string().base64().describe(\"Base64 encoded signature s coordinate\"),\n v: z\n .union([z.literal(0), z.literal(1)])\n .nullable()\n .describe(\"Ecdsa only, signature recovery value\"),\n der: zHexString.describe(\n \"Hex string encoded DER signature format (for eddsa, concatenation of r & s)\",\n ),\n pubkey: zHexString.nullable().describe(\"Public key for signature verification, 32 or 33 bytes\"),\n});\n\nexport type HsmSignature = z.infer<typeof zHsmSignature>;\n\n// #endregion\n","import z from \"zod\";\n\nimport { zHexString, zIntString } from \"@/zod-utils\";\n\nexport const zBitcoinLikeTransactionType = z\n .enum([\"BITCOIN_LIKE_SEND\", \"BITCOIN_LIKE_RECEIVE\"])\n .describe(\"Bitcoin-like transaction type\");\nexport type BitcoinLikeTransactionType = z.infer<typeof zBitcoinLikeTransactionType>;\n\nexport const zCardanoLikeTransactionType = z\n .enum([\n \"CARDANO_LIKE_SEND\",\n \"CARDANO_LIKE_RECEIVE\",\n \"CARDANO_LIKE_STAKING_REGISTER\",\n \"CARDANO_LIKE_STAKING_DEREGISTER\",\n \"CARDANO_LIKE_STAKING_DELEGATE\",\n \"CARDANO_LIKE_STAKING_WITHDRAW\",\n ])\n .describe(\"Cardano-like transaction type\");\nexport type CardanoLikeTransactionType = z.infer<typeof zCardanoLikeTransactionType>;\n\nexport const zEthereumLikeTransferTransactionType = z\n .enum([\"ETHEREUM_LIKE_SEND\", \"ETHEREUM_LIKE_RECEIVE\"])\n .describe(\"Ethereum-like transaction type\");\nexport type EthereumLikeTransferTransactionType = z.infer<\n typeof zEthereumLikeTransferTransactionType\n>;\n\nexport const zEthereumLikeContractTransactionType = z\n .enum([\"ETHEREUM_LIKE_EXECUTE_CONTRACT\", \"ETHEREUM_LIKE_DEPLOY_CONTRACT\"])\n .describe(\"Ethereum-like transaction type\");\nexport type EthereumLikeContractTransactionType = z.infer<\n typeof zEthereumLikeContractTransactionType\n>;\n\nexport const zPolkadotLikeTransactionType = z\n .enum([\n \"POLKADOT_LIKE_SEND\",\n \"POLKADOT_LIKE_RECEIVE\",\n \"POLKADOT_LIKE_ADDPROXY\",\n \"POLKADOT_LIKE_REMOVEPROXY\",\n \"POLKADOT_LIKE_BOND\",\n \"POLKADOT_LIKE_REBOND\",\n \"POLKADOT_LIKE_BONDEXTRA\",\n \"POLKADOT_LIKE_UNBOND\",\n \"POLKADOT_LIKE_WITHDRAWUNBONDED\",\n \"POLKADOT_LIKE_SETCONTROLLER\",\n \"POLKADOT_LIKE_SETPAYEE\",\n \"POLKADOT_LIKE_PROXY\",\n \"POLKADOT_LIKE_ANONYMOUSPROXY\",\n \"POLKADOT_LIKE_KILLANONYMOUS\",\n \"POLKADOT_LIKE_PUREPROXY\",\n \"POLKADOT_LIKE_KILLPURE\",\n \"POLKADOT_LIKE_NOMINATE\",\n \"POLKADOT_LIKE_REWARD\",\n \"POLKADOT_LIKE_CHILL\",\n \"POLKADOT_LIKE_TRANSFERALL\",\n ])\n .describe(\"Polkadot-like transaction type\");\nexport type PolkadotLikeTransactionType = z.infer<typeof zPolkadotLikeTransactionType>;\n\nexport const zRippleLikeTransactionType = z\n .enum([\"RIPPLE_LIKE_SEND\", \"RIPPLE_LIKE_RECEIVE\"])\n .describe(\"Ripple-like transaction type\");\nexport type RippleLikeTransactionType = z.infer<typeof zRippleLikeTransactionType>;\n\nexport const zSolanaLikeTransactionType = z\n .enum([\n \"SOLANA_LIKE_SEND\",\n \"SOLANA_LIKE_RECEIVE\",\n \"SOLANA_LIKE_CREATE_DELEGATE_STAKE\",\n \"SOLANA_LIKE_DELEGATE_STAKE\",\n \"SOLANA_LIKE_WITHDRAW_STAKE\",\n \"SOLANA_LIKE_DEACTIVATE_STAKE\",\n \"SOLANA_LIKE_SPLIT_STAKE\",\n \"SOLANA_LIKE_SPLIT_DEACTIVATE_STAKE\",\n \"SOLANA_LIKE_MERGE_STAKE\",\n \"SOLANA_LIKE_SEND_TOKEN\",\n \"SOLANA_LIKE_FUND_TOKEN\",\n ])\n .describe(\"Solana-like transaction type\");\nexport type SolanaLikeTransactionType = z.infer<typeof zSolanaLikeTransactionType>;\n\nexport const zStellarLikeTransactionType = z\n .enum([\"STELLAR_LIKE_SEND\", \"STELLAR_LIKE_RECEIVE\"])\n .describe(\"Stellar-like transaction type\");\nexport type StellarLikeTransactionType = z.infer<typeof zStellarLikeTransactionType>;\n\nexport const zTezosLikeTransactionType = z\n .enum([\n \"TEZOS_LIKE_SEND\",\n \"TEZOS_LIKE_RECEIVE\",\n \"TEZOS_LIKE_REVEAL\",\n \"TEZOS_LIKE_DELEGATE\",\n \"TEZOS_LIKE_UNDELEGATE\",\n ])\n .describe(\"Tezos-like transaction type\");\nexport type TezosLikeTransactionType = z.infer<typeof zTezosLikeTransactionType>;\n\nexport const zGenericTransactionType = z\n .enum([\"GENERIC_TRANSACTION\"])\n .describe(\"Generic transaction type\");\nexport type GenericTransactionType = z.infer<typeof zGenericTransactionType>;\n\nexport const zTransactionType = z.union([\n zBitcoinLikeTransactionType,\n zCardanoLikeTransactionType,\n zEthereumLikeTransferTransactionType,\n zEthereumLikeContractTransactionType,\n zGenericTransactionType,\n zPolkadotLikeTransactionType,\n zRippleLikeTransactionType,\n zSolanaLikeTransactionType,\n zStellarLikeTransactionType,\n zTezosLikeTransactionType,\n]);\nexport type TransactionType = z.infer<typeof zTransactionType>;\n\nexport const zEstimatedFees = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"ETHEREUM_LIKE\"),\n baseFees: zIntString,\n gasLimit: zIntString,\n nonce: z.string(),\n priorityFees: zIntString,\n }),\n]);\n\nexport type EstimatedFees = z.infer<typeof zEstimatedFees>;\n\n// #region ---------- Message Signing -------------------------------------------------------------\n\nexport const zMessageType = z.enum([\"EIP191\", \"EIP712\"]);\n\nexport type MessageType = z.infer<typeof zMessageType>;\n\n// TODO: Rename? \"message\" is a too generic word...\nexport const zMessage = z.object({\n type: zMessageType.describe(\"Type of the message to sign\"),\n data: zHexString\n .nonempty()\n .describe(\"Hex data to sign, either a json string for EIP712, or a raw string for EIP191\"),\n});\n\nexport type Message = z.infer<typeof zMessage>;\n\n// #endregion\n","import z from \"zod\";\n\nimport { zHsmSignature } from \"@/hsm\";\nimport type { Operation } from \"@/types\";\nimport { zCurrency, zHexString, zHsmObjectId, zIntString, zUnsignedIntString } from \"@/zod-utils\";\n\nimport {\n zBitcoinLikeTransactionType,\n zCardanoLikeTransactionType,\n zEthereumLikeContractTransactionType,\n zEthereumLikeTransferTransactionType,\n zGenericTransactionType,\n zMessage,\n zPolkadotLikeTransactionType,\n zRippleLikeTransactionType,\n zSolanaLikeTransactionType,\n zStellarLikeTransactionType,\n zTezosLikeTransactionType,\n} from \"./types\";\n\n/**\n * Ensure that this is a hex string and transform it to lowercase with 0x prefix.\n * Not to be used for EIP-55 addresses or other attributes where letter casing is important!\n */\nlet zHexDataString = z\n .string()\n .regex(/^(?:0x|0X)?[a-fA-F0-9]+$/)\n .transform((hex) => `0x${hex.toLowerCase().replace(\"0x\", \"\")}`);\n\n/**\n * As we are using `.transform()`, we have to add extra information to\n * make zod-to-openapi properly transform the data (when generating\n * the OpenAPI spec). However, this `.openapi()` method is only added\n * when we generate the OpenAPI spec, so we should dynamically add this\n * block so it doesn't break when generating Gate message (for example).\n */\n/* v8 ignore start */\nif (\"openapi\" in zHexDataString) {\n zHexDataString = zHexDataString.openapi?.({ effectType: \"same\" });\n}\n/* v8 ignore stop */\n\n/**\n * Schema of `Request.data.transaction`\n */\nconst zCommonTransactionData = z.object({\n amount: zUnsignedIntString.describe(\"Transaction amount\"),\n currency: zCurrency.describe(\"Transaction currency\"), // TODO: strict literal or enum?\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n recipient: z.string().describe(\"Transaction recipient\"),\n});\n\nconst zFeeStrategyCustom = z.object({\n type: z.enum([\"SLOW\", \"NORMAL\", \"FAST\", \"CUSTOM\"]),\n});\n\nconst zFeeStrategy = z.object({\n type: z.enum([\"SLOW\", \"NORMAL\", \"FAST\"]),\n});\n\n// #region ---------- BITCOIN ---------------------------------------------------------------------\n\nconst zBitcoinLikeFeeStrategy = zFeeStrategyCustom\n .extend({\n // nullish is optional + nullable, it is easier to seed rather than just optional\n feePerByte: zUnsignedIntString.nullish().describe(\"Fee per byte\"),\n })\n .describe(\"Bitcoin-like fee strategy\");\n\nconst zBitcoinLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zBitcoinLikeTransactionType.enum.BITCOIN_LIKE_SEND),\n feeStrategy: zBitcoinLikeFeeStrategy,\n })\n .describe(\"Bitcoin-like send data\");\n\nexport type BitcoinLikeSendData = z.infer<typeof zBitcoinLikeSendData>;\n\n// #endregion\n\n// #region ---------- ETHEREUM --------------------------------------------------------------------\n\nconst zEthereumLikeLegacyFeeStrategy = zFeeStrategyCustom\n .extend({\n gasPrice: zUnsignedIntString.describe(\"Gas price\"),\n gasLimit: zUnsignedIntString.describe(\"Gas limit\"),\n })\n .describe(\"Ethereum-like legacy fee strategy\");\n\nconst zEthereumLikeEip1559FeeStrategy = zFeeStrategyCustom\n .extend({\n maxPriorityFeePerGas: zUnsignedIntString.describe(\"Maximum priority fee per gas\"),\n maxFeePerGas: zUnsignedIntString.describe(\"Maximum fee per gas (base + priority)\"),\n gasLimit: zUnsignedIntString.describe(\"Gas limit\"),\n })\n .describe(\"Ethereum-like EIP-1559 fee strategy\");\n\nconst zEthereumLikeFeeStrategy = z\n .union([zEthereumLikeLegacyFeeStrategy, zEthereumLikeEip1559FeeStrategy])\n .describe(\"Ethereum-like fee strategy\");\n\nexport type EthereumLikeFeeStrategy = z.infer<typeof zEthereumLikeFeeStrategy>;\n\nconst zEthereumLikeDeployContractData = zCommonTransactionData\n .extend({\n type: z.literal(zEthereumLikeContractTransactionType.enum.ETHEREUM_LIKE_DEPLOY_CONTRACT),\n // force the recipient to be the zero address\n recipient: z.literal(\"0x0000000000000000000000000000000000000000\"),\n contractData: zHexDataString.describe(\"Contract data in hexadecimal format\"),\n feeStrategy: zEthereumLikeFeeStrategy,\n })\n .describe(\"Ethereum-like deploy contract data\");\n\nconst zEthereumLikeExecuteContractData = zCommonTransactionData\n .extend({\n type: z.literal(zEthereumLikeContractTransactionType.enum.ETHEREUM_LIKE_EXECUTE_CONTRACT),\n contractData: zHexDataString.describe(\"Contract call data in hexadecimal format\"),\n feeStrategy: zEthereumLikeFeeStrategy,\n })\n .describe(\"Ethereum-like execute contract data\");\n\nconst zEthereumLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zEthereumLikeTransferTransactionType.enum.ETHEREUM_LIKE_SEND),\n feeStrategy: zEthereumLikeFeeStrategy,\n })\n .describe(\"Ethereum-like send data\");\n\nexport type EthereumLikeSendData = z.infer<typeof zEthereumLikeSendData>;\n\n// #endregion\n\n// #region ---------- TEZOS -----------------------------------------------------------------------\n\nconst zTezosLikeFeeStrategy = zFeeStrategyCustom\n .extend({\n gasLimit: zUnsignedIntString.describe(\"Gas limit\"),\n storageLimit: zUnsignedIntString.nullable().describe(\"Storage limit\"),\n })\n .describe(\"Tezos-like fee strategy\");\n\nconst zTezosLikeDelegateData = zCommonTransactionData\n .extend({\n type: z.literal(zTezosLikeTransactionType.enum.TEZOS_LIKE_DELEGATE),\n feeStrategy: zTezosLikeFeeStrategy,\n })\n .describe(\"Tezos-like delegate data\");\n\nconst zTezosLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zTezosLikeTransactionType.enum.TEZOS_LIKE_SEND),\n feeStrategy: zTezosLikeFeeStrategy,\n })\n .describe(\"Tezos-like send data\");\n\nexport type TezosLikeSendData = z.infer<typeof zTezosLikeSendData>;\n\nconst zTezosLikeUndelegateData = zCommonTransactionData\n .extend({\n type: z.literal(zTezosLikeTransactionType.enum.TEZOS_LIKE_UNDELEGATE),\n feeStrategy: zTezosLikeFeeStrategy,\n })\n .describe(\"Tezos-like undelegate data\");\n\n// #endregion\n\n// #region ---------- POLKADOT --------------------------------------------------------------------\n\nconst zPolkadotRewardDestination = z.enum([\"Staked\", \"Stash\"]);\n\nconst zPolkadotLikeAddProxyData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_ADDPROXY),\n currency: zCurrency.describe(\"Transaction currency\"),\n kind: z.literal(\"Staking\").describe(\"Proxy kind\"),\n proxy: z.string().describe(\"Proxy address\"),\n })\n .describe(\"Polkadot-like add proxy data\");\n\nconst zPolkadotLikeAnonymousProxyData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_ANONYMOUSPROXY),\n currency: zCurrency.describe(\"Transaction currency\"),\n })\n .describe(\"Polkadot-like anonymous proxy data\");\n\nconst zPolkadotLikeBondData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_BOND),\n currency: zCurrency.describe(\"Transaction currency\"),\n payee: zPolkadotRewardDestination,\n amount: zUnsignedIntString.describe(\"Amount\"),\n })\n .describe(\"Polkadot-like bond data\");\n\nconst zPolkadotLikeBondExtraData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_BONDEXTRA),\n currency: zCurrency.describe(\"Transaction currency\"),\n amount: zUnsignedIntString.describe(\"Amount\"),\n })\n .describe(\"Polkadot-like bond extra data\");\n\nconst zPolkadotLikeChillData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_CHILL),\n currency: zCurrency.describe(\"Transaction currency\"),\n })\n .describe(\"Polkadot-like chill data\");\n\nconst zPolkadotLikeKillAnonymousData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_KILLANONYMOUS),\n currency: zCurrency.describe(\"Transaction currency\"),\n })\n .describe(\"Polkadot-like kill anonymous data\");\n\nconst zPolkadotLikeRebondData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_REBOND),\n currency: zCurrency.describe(\"Transaction currency\"),\n amount: zUnsignedIntString.describe(\"Amount\"),\n })\n .describe(\"Polkadot-like rebond data\");\n\nconst zPolkadotLikeRemoveProxyData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_REMOVEPROXY),\n currency: zCurrency.describe(\"Transaction currency\"),\n kind: z.literal(\"Staking\"),\n proxy: z.string().describe(\"Proxy address\"),\n })\n .describe(\"Polkadot-like remove proxy data\");\n\nconst zPolkadotLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_SEND),\n })\n .describe(\"Polkadot-like send data\");\n\nconst zPolkadotLikeSetPayeeData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_SETPAYEE),\n currency: zCurrency.describe(\"Transaction currency\"),\n payee: zPolkadotRewardDestination,\n })\n .describe(\"Polkadot-like set payee data\");\n\nconst zPolkadotLikeUnbondData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_UNBOND),\n currency: zCurrency.describe(\"Transaction currency\"),\n amount: zUnsignedIntString.describe(\"Amount\"),\n })\n .describe(\"Polkadot-like unbond data\");\n\nconst zPolkadotLikeWithdrawUnbondedData = z\n .object({\n type: z.literal(zPolkadotLikeTransactionType.enum.POLKADOT_LIKE_WITHDRAWUNBONDED),\n currency: zCurrency.describe(\"Transaction currency\"),\n })\n .describe(\"Polkadot-like withdraw unbonded data\");\n\n// #endregion\n\n// #region ---------- RIPPLE ----------------------------------------------------------------------\n\nconst zRippleLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zRippleLikeTransactionType.enum.RIPPLE_LIKE_SEND),\n destinationTag: zIntString.nullable().describe(\"Destination tag\"),\n feeStrategy: zFeeStrategyCustom.describe(\"Ripple-like fee strategy\"),\n })\n .describe(\"Ripple-like send data\");\n\n// #endregion\n\n// #region ---------- STELLAR ---------------------------------------------------------------------\n\n// https://developers.stellar.org/docs/learn/encyclopedia/memos\nconst zStellarMemo = z.union([\n z\n .object({ MEMO_TEXT: z.string().max(28).describe(\"Text memo (at most a 28 bytes string)\") })\n .describe(\"Text memo\"),\n z\n .object({ MEMO_ID: zIntString.describe(\"Id memo (unsigned 64 bits integer)\") })\n .describe(\"Id memo\"),\n z\n .object({\n MEMO_HASH: z\n .string()\n .max(128)\n .regex(/^[a-fA-F0-9]+$/)\n .describe(\"Transaction hash memo (64 bytes hexadecimal string)\"),\n })\n .describe(\"Hash memo\"),\n z\n .object({\n MEMO_RETURN: z\n .string()\n .max(128)\n .regex(/^[a-fA-F0-9]+$/)\n .describe(\n \"A 64 bytes hexadecimal string intended to be interpreted as the hash of the transaction the sender is refunding.\",\n ),\n })\n .describe(\"Return memo\"),\n]);\n\nconst zStellarLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zStellarLikeTransactionType.enum.STELLAR_LIKE_SEND),\n memo: zStellarMemo.nullable().describe(\"Stellar memo\"),\n feeStrategy: zFeeStrategy.describe(\"Stellar-like fee strategy\"),\n })\n .describe(\"Stellar-like send data\");\n\n// #endregion\n\n// #region ---------- SOLANA ----------------------------------------------------------------------\n\nconst zSolanaLikeCreateDelegateStakeData = zCommonTransactionData\n .extend({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_CREATE_DELEGATE_STAKE),\n recipient: z.string().describe(\"Delegated vote address\"), // Re-described\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n })\n .describe(\"Solana-like create delegate stake data\");\n\nconst zSolanaLikeDeactivateStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_DEACTIVATE_STAKE),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n stakeAccount: z.string().describe(\"Stake account address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No recipient, no amount\n })\n .describe(\"Solana-like deactivate stake data\");\n\nconst zSolanaLikeDelegateStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_DELEGATE_STAKE),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n recipient: z.string().describe(\"Delegated vote address\"),\n stakeAccount: z.string().describe(\"Stake account address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No amount\n })\n .describe(\"Solana-like delegate stake data\");\n\nconst zSolanaLikeMergeStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_MERGE_STAKE),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n mergeSrcAccount: z.string().describe(\"Source stake address\"),\n mergeDstAccount: z.string().describe(\"Destination stake address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No recipient, no amount\n })\n .describe(\"Solana-like merge stake data\");\n\nconst zSolanaLikeSendData = zCommonTransactionData\n .extend({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_SEND),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n })\n .describe(\"Solana-like send data\");\n\nconst zSolanaLikeSplitDeactivateStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_SPLIT_DEACTIVATE_STAKE),\n amount: zUnsignedIntString.describe(\"Transaction amount\"),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n stakeAccount: z.string().describe(\"Stake account address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No recipient\n })\n .describe(\"Solana-like split deactivate stake data\");\n\nconst zSolanaLikeSplitStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_SPLIT_STAKE),\n amount: zUnsignedIntString.describe(\"Transaction amount\"),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n stakeAccount: z.string().describe(\"Stake account address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No recipient\n })\n .describe(\"Solana-like split stake data\");\n\nconst zSolanaLikeWithdrawStakeData = z\n .object({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_WITHDRAW_STAKE),\n amount: zUnsignedIntString.describe(\"Transaction amount\"),\n currency: zCurrency.describe(\"Transaction currency\"),\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n stakeAccount: z.string().describe(\"Stake account address\"),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n // No recipient\n })\n .describe(\"Solana-like delegate stake data\");\n\nconst zSolanaLikeSendTokenData = zCommonTransactionData\n .extend({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_SEND_TOKEN),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n })\n .describe(\"Solana-like send token data\");\n\nconst zSolanaLikeFundTokenData = zCommonTransactionData\n .extend({\n type: z.literal(zSolanaLikeTransactionType.enum.SOLANA_LIKE_FUND_TOKEN),\n feeStrategy: zFeeStrategy.describe(\"Solana-like fee strategy\"),\n })\n .describe(\"Solana-like fund token data\");\n\n// #endregion\n\n// #region ---------- CARDANO ---------------------------------------------------------------------\n\nconst zCardanoSendData = zCommonTransactionData\n .extend({\n type: z.literal(zCardanoLikeTransactionType.enum.CARDANO_LIKE_SEND),\n feeStrategy: zFeeStrategy.describe(\"Cardano-like fee strategy\"),\n })\n .describe(\"Cardano-like send data\");\n\nconst zCardanoStakingDelegateData = z\n .object({\n type: z.literal(zCardanoLikeTransactionType.enum.CARDANO_LIKE_STAKING_DELEGATE),\n currency: zCurrency.describe(\"Transaction currency\"), // TODO: strict literal or enum?\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n feeStrategy: zFeeStrategy.describe(\"Cardano-like fee strategy\"),\n // DELEGATE doesn't have neither amount nor recipient\n stakePoolId: z.string().min(1).max(100).describe(\"\"),\n })\n .describe(\"Cardano-like staking delegate\");\n\nconst zCardanoStakingDeregisterData = z\n .object({\n type: z.literal(zCardanoLikeTransactionType.enum.CARDANO_LIKE_STAKING_DEREGISTER),\n currency: zCurrency.describe(\"Transaction currency\"), // TODO: strict literal or enum?\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n feeStrategy: zFeeStrategy.describe(\"Cardano-like fee strategy\"),\n // DEREGISTER doesn't have a recipient\n amount: zUnsignedIntString.describe(\"Amount to deregister\"),\n })\n .describe(\"Cardano-like staking deregister data\");\n\nconst zCardanoStakingRegisterData = z\n .object({\n type: z.literal(zCardanoLikeTransactionType.enum.CARDANO_LIKE_STAKING_REGISTER),\n currency: zCurrency.describe(\"Transaction currency\"), // TODO: strict literal or enum?\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n feeStrategy: zFeeStrategy.describe(\"Cardano-like fee strategy\"),\n // REGISTER doesn't have a recipient\n amount: zUnsignedIntString.describe(\"Amount to register\"),\n })\n .describe(\"Cardano-like staking register data\");\n\nconst zCardanoStakingWithdrawData = z\n .object({\n type: z.literal(zCardanoLikeTransactionType.enum.CARDANO_LIKE_STAKING_WITHDRAW),\n currency: zCurrency.describe(\"Transaction currency\"), // TODO: strict literal or enum?\n maxFee: zUnsignedIntString.nullable().describe(\"Transaction max fee\"),\n feeStrategy: zFeeStrategy.describe(\"Cardano-like fee strategy\"),\n // WITHDRAW doesn't have a recipient\n amount: zUnsignedIntString.describe(\"Amount to withdraw\"),\n })\n .describe(\"Cardano-like staking withdraw data\");\n\n// #endregion\n\n// #region ---------- GENERIC ---------------------------------------------------------------------\n\nconst zGenericTransactionData = z\n .object({\n type: z.literal(zGenericTransactionType.enum.GENERIC_TRANSACTION),\n currency: zCurrency.describe(\"Transaction currency\"),\n rawTx: z.string().describe(\"Raw tx\"),\n })\n .describe(\"Generic transaction data\");\n\nexport type GenericTransactionData = z.infer<typeof zGenericTransactionData>;\n\n// #endregion\n\nexport const zTransactionData = z.discriminatedUnion(\"type\", [\n // Bitcoin\n zBitcoinLikeSendData,\n // Cardano\n zCardanoSendData,\n zCardanoStakingDelegateData,\n zCardanoStakingDeregisterData,\n zCardanoStakingRegisterData,\n zCardanoStakingWithdrawData,\n // Ethereum\n zEthereumLikeDeployContractData,\n zEthereumLikeExecuteContractData,\n zEthereumLikeSendData,\n // Generic\n zGenericTransactionData,\n // Polkadot\n zPolkadotLikeAddProxyData,\n zPolkadotLikeAnonymousProxyData,\n zPolkadotLikeBondData,\n zPolkadotLikeBondExtraData,\n zPolkadotLikeChillData,\n zPolkadotLikeKillAnonymousData,\n zPolkadotLikeRebondData,\n zPolkadotLikeRemoveProxyData,\n zPolkadotLikeSendData,\n zPolkadotLikeSetPayeeData,\n zPolkadotLikeUnbondData,\n zPolkadotLikeWithdrawUnbondedData,\n // Ripple\n zRippleLikeSendData,\n // Solana\n zSolanaLikeCreateDelegateStakeData,\n zSolanaLikeDeactivateStakeData,\n zSolanaLikeDelegateStakeData,\n zSolanaLikeMergeStakeData,\n zSolanaLikeSendData,\n zSolanaLikeSplitDeactivateStakeData,\n zSolanaLikeSplitStakeData,\n zSolanaLikeWithdrawStakeData,\n zSolanaLikeSendTokenData,\n zSolanaLikeFundTokenData,\n // Stellar\n zStellarLikeSendData,\n // Tezos\n zTezosLikeDelegateData,\n zTezosLikeSendData,\n zTezosLikeUndelegateData,\n]);\n\nexport type TransactionData = z.infer<typeof zTransactionData>;\n\nexport const zSendOnlyTransactionData = z.discriminatedUnion(\"type\", [\n zBitcoinLikeSendData,\n zCardanoSendData,\n zEthereumLikeSendData,\n zPolkadotLikeSendData,\n zRippleLikeSendData,\n zSolanaLikeSendData,\n zStellarLikeSendData,\n zTezosLikeSendData,\n]);\n\nexport type SendOnlyTransactionData = z.infer<typeof zSendOnlyTransactionData>;\n\n/**\n * Schema of `Request.data` for `CREATE_TRANSACTION` request.\n */\nexport const zCreateTransactionRequestData = z.object({\n accountId: z.string().min(1).describe(\"Target account id\"),\n transaction: zTransactionData,\n});\n\nexport type CreateTransactionRequestData = z.infer<typeof zCreateTransactionRequestData>;\n\n// #region ---------- Convert TransactionData to Operation ----------------------------------------\n\nexport const convertTransactionDataToOperation = (transaction: TransactionData): Operation => {\n switch (transaction.type) {\n case \"ETHEREUM_LIKE_SEND\": {\n return {\n type: \"SEND\",\n currency: transaction.currency,\n recipient: transaction.recipient,\n value: transaction.amount,\n };\n }\n /* v8 ignore start */\n // TODO : we need a more systematic way to cover the whole thing e2e\n // Probably as a transaction workflow parametrized test\n case \"BITCOIN_LIKE_SEND\": {\n return {\n type: \"SEND\",\n currency: transaction.currency,\n recipient: transaction.recipient,\n value: transaction.amount,\n };\n }\n case \"CARDANO_LIKE_SEND\":\n case \"CARDANO_LIKE_STAKING_DELEGATE\":\n case \"CARDANO_LIKE_STAKING_DEREGISTER\":\n case \"CARDANO_LIKE_STAKING_REGISTER\":\n case \"CARDANO_LIKE_STAKING_WITHDRAW\":\n case \"ETHEREUM_LIKE_DEPLOY_CONTRACT\":\n case \"ETHEREUM_LIKE_EXECUTE_CONTRACT\":\n case \"GENERIC_TRANSACTION\":\n case \"POLKADOT_LIKE_ADDPROXY\":\n case \"POLKADOT_LIKE_ANONYMOUSPROXY\":\n case \"POLKADOT_LIKE_BOND\":\n case \"POLKADOT_LIKE_BONDEXTRA\":\n case \"POLKADOT_LIKE_CHILL\":\n case \"POLKADOT_LIKE_KILLANONYMOUS\":\n case \"POLKADOT_LIKE_REBOND\":\n case \"POLKADOT_LIKE_REMOVEPROXY\":\n case \"POLKADOT_LIKE_SEND\":\n case \"POLKADOT_LIKE_SETPAYEE\":\n case \"POLKADOT_LIKE_UNBOND\":\n case \"POLKADOT_LIKE_WITHDRAWUNBONDED\":\n case \"RIPPLE_LIKE_SEND\":\n case \"SOLANA_LIKE_CREATE_DELEGATE_STAKE\":\n case \"SOLANA_LIKE_DEACTIVATE_STAKE\":\n case \"SOLANA_LIKE_DELEGATE_STAKE\":\n case \"SOLANA_LIKE_MERGE_STAKE\":\n case \"SOLANA_LIKE_SEND\":\n case \"SOLANA_LIKE_SPLIT_DEACTIVATE_STAKE\":\n case \"SOLANA_LIKE_SPLIT_STAKE\":\n case \"SOLANA_LIKE_WITHDRAW_STAKE\":\n case \"SOLANA_LIKE_SEND_TOKEN\":\n case \"SOLANA_LIKE_FUND_TOKEN\":\n case \"STELLAR_LIKE_SEND\":\n case \"TEZOS_LIKE_DELEGATE\":\n case \"TEZOS_LIKE_SEND\":\n case \"TEZOS_LIKE_UNDELEGATE\":\n // TODO: Support creating transaction of more types in Gate!\n throw new Error(`Transaction type ${transaction.type} not yet supported`);\n } /* v8 ignore stop */\n};\n\n// #endregion\n\n// #region ---------- SIGN_MESSAGE ----------------------------------------------------------------\n\nexport const zSignMessageRequestData = z.object({\n message: zMessage.describe(\"Message to sign\"),\n accountId: z.string().min(1).describe(\"Target account id\"),\n address: z.string().nonempty().describe(\"Address with which to sign the message\"),\n derivationPath: z.string().nonempty().describe(\"Derivation path of the signing address\"),\n});\n\nexport type SignMessageRequestData = z.infer<typeof zSignMessageRequestData>;\n\nexport const zSignMessageUserInputData = zSignMessageRequestData.partial({\n address: true,\n derivationPath: true,\n});\n\nexport type SignMessageUserInputData = z.infer<typeof zSignMessageUserInputData>;\n\nexport const zSignMessageManagedData = z.object({\n // Populated after input data is validated.\n govRuleHsmId: zHsmObjectId.optional(),\n // Populated after request is executed -- it holds the message-signing result.\n signature: zHsmSignature.optional(),\n});\n\nexport type SignMessageManagedData = z.infer<typeof zSignMessageManagedData>;\n\n// #endregion\n\n// #region ---------- SIGN_DIGESTS ----------------------------------------------------------------\n\nexport const zDigestData = z.object({\n digest: zHexString.describe(\"The hex string digest to sign\"),\n derivationPath: z\n .string()\n .nonempty()\n .describe(\"The derivation path with which to sign the digest\"),\n});\n\nexport type DigestData = z.infer<typeof zDigestData>;\n\nexport const zSignDigestsRequestData = z.object({\n accountId: z.string().min(1).describe(\"Target account id\"),\n digests: z.array(zDigestData).describe(\"The digests to sign\"),\n});\n\nexport type SignDigestsRequestData = z.infer<typeof zSignDigestsRequestData>;\n\nexport const zSignDigestsManagedData = z.object({\n signatures: z.array(zHsmSignature),\n});\n\nexport type SignDigestsManagedData = z.infer<typeof zSignDigestsManagedData>;\n\n// #endregion\n","import z from \"zod\";\n\nimport {\n zBitcoinLikeTransactionType,\n zCardanoLikeTransactionType,\n zEthereumLikeContractTransactionType,\n zEthereumLikeTransferTransactionType,\n zGenericTransactionType,\n zPolkadotLikeTransactionType,\n zRippleLikeTransactionType,\n zSolanaLikeTransactionType,\n zStellarLikeTransactionType,\n zTezosLikeTransactionType,\n} from \"@/transactions\";\nimport { zNote } from \"@/types\";\nimport { ensureNonEmptyArray } from \"@/utils\";\n\nexport const zTransactionStatus = z.enum([\"SUCCESSFUL\", \"FAILED\"]);\n\nexport type TransactionStatus = z.infer<typeof zTransactionStatus>;\n\nconst zBitcoinLikeCoinFields = z.object({\n type: zBitcoinLikeTransactionType,\n});\n\nconst zCardanoLikeCoinFields = z.object({\n type: zCardanoLikeTransactionType,\n});\n\nconst zEthereumLikeTransferCoinFields = z.object({\n type: zEthereumLikeTransferTransactionType,\n gasPrice: z.string(),\n gasLimit: z.string(),\n nonce: z.string(),\n});\n\nconst zEthereumLikeContractCoinFields = zEthereumLikeTransferCoinFields.extend({\n type: zEthereumLikeContractTransactionType,\n contractData: z.string().describe(\"Contract deployment or contract execution data\"),\n});\n\nconst zGenericCoinFields = z.object({\n type: zGenericTransactionType,\n});\n\nconst zPolkadotLikeCoinFields = z.object({\n type: zPolkadotLikeTransactionType,\n});\n\nconst zRippleLikeCoinFields = z.object({\n type: zRippleLikeTransactionType,\n memos: z.array(z.string()),\n destinationTag: z.string(),\n});\n\nconst zSolanaLikeCoinFields = z.object({\n type: zSolanaLikeTransactionType,\n});\n\nconst zStellarLikeCoinFields = z.object({\n type: zStellarLikeTransactionType,\n});\n\nconst zTezosLikeCoinFields = z.object({\n type: zTezosLikeTransactionType,\n});\nexport const zCommonTransactionResponse = z.object({\n id: z.string().describe(\"Internal unique identifier\"),\n hash: z.string().describe(\"Transaction hash\"),\n block: z.object({\n height: z.string().nullable().describe(\"Transaction block height\"),\n time: z.string().nullable().describe(\"Transaction block time\"),\n }),\n status: zTransactionStatus.describe(\"Transaction status\"),\n confirmations: z.string().describe(\"Block confirmations\"),\n amount: z.string().describe(\"Transaction amount\"),\n fee: z.string().describe(\"Transaction fee\"),\n senders: z.array(z.string()).describe(\"Senders (can be multiple for UTXOs-based accounts)\"),\n recipients: z\n .array(z.string())\n .describe(\"Recipients (can be multiple for multi-output transactions)\"),\n});\n\nconst zBitcoinLikeTransactionResponse = zCommonTransactionResponse\n .merge(zBitcoinLikeCoinFields)\n .describe(\"Bitcoin-like transaction\");\n\nconst zCardanoLikeTransactionResponse = zCommonTransactionResponse\n .merge(zCardanoLikeCoinFields)\n .describe(\"Cardano-like transaction\");\n\nconst zEthereumLikeTransferTransactionResponse = zCommonTransactionResponse\n .merge(zEthereumLikeTransferCoinFields)\n .describe(\"Ethereum-like transfer transaction\");\n\nconst zEthereumLikeContractTransactionResponse = zCommonTransactionResponse\n .merge(zEthereumLikeContractCoinFields)\n .describe(\"Ethereum-like contract transaction\");\n\nconst zGenericTransactionResponse = zCommonTransactionResponse\n .merge(zGenericCoinFields)\n .describe(\"Generic transaction\");\n\nconst zPolkadotLikeTransactionResponse = zCommonTransactionResponse\n .merge(zPolkadotLikeCoinFields)\n .describe(\"Polkadot-like transaction\");\n\nconst zRippleLikeTransactionResponse = zCommonTransactionResponse\n .merge(zRippleLikeCoinFields)\n .describe(\"Ripple-like transaction\");\n\nconst zSolanaLikeTransactionResponse = zCommonTransactionResponse\n .merge(zSolanaLikeCoinFields)\n .describe(\"Solana-like transaction\");\n\nconst zStellarLikeTransactionResponse = zCommonTransactionResponse\n .merge(zStellarLikeCoinFields)\n .describe(\"Stellar-like transaction\");\n\nconst zTezosLikeTransactionResponse = zCommonTransactionResponse\n .merge(zTezosLikeCoinFields)\n .describe(\"Tezos-like transaction\");\n\nexport const zTransactionResponse = z.discriminatedUnion(\"type\", [\n zBitcoinLikeTransactionResponse,\n zCardanoLikeTransactionResponse,\n zEthereumLikeTransferTransactionResponse,\n zEthereumLikeContractTransactionResponse,\n zGenericTransactionResponse,\n zPolkadotLikeTransactionResponse,\n zRippleLikeTransactionResponse,\n zSolanaLikeTransactionResponse,\n zStellarLikeTransactionResponse,\n zTezosLikeTransactionResponse,\n]);\n\nexport type TransactionResponse = z.infer<typeof zTransactionResponse>;\n\nexport const zTransactionWithMetaResponse = z.discriminatedUnion(\n zTransactionResponse.discriminator,\n ensureNonEmptyArray(\n zTransactionResponse.options.map((_) => _.extend({ note: zNote.nullable() })),\n ),\n);\n\nexport type TransactionWithMetaResponse = z.infer<typeof zTransactionWithMetaResponse>;\n","import { AccountType } from \"@prisma/client\";\nimport { z } from \"zod\";\n\nexport const zBitcoinLikeAssetFields = z\n .object({\n type: z.literal(AccountType.BITCOIN_LIKE).describe(\"Account type\"),\n xpub: z.string().describe(\"xpub (extended public key)\"),\n })\n .describe(\"Bitcoin-like\");\n\nexport const zCardanoLikeAssetFields = z\n .object({\n type: z.literal(AccountType.CARDANO_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n .describe(\"Cardano-like\");\n\nexport const zEthereumLikeAssetFields = z\n .object({\n type: z.literal(AccountType.ETHEREUM_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n .describe(\"Ethereum-like\");\n\nexport const zEthereumTokenLikeAssetFields = z\n .object({\n type: z\n .enum([AccountType.ERC20_LIKE, AccountType.BEP20_LIKE, AccountType.TRC20_LIKE])\n .describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n contractAddress: z.string().describe(\"Token contract address\"),\n })\n .describe(\"Ethereum-like token\");\n\nexport const zGenericLikeAssetFields = z\n .object({ type: z.literal(AccountType.GENERIC_LIKE).describe(\"Account type\") })\n .describe(\"Generic-like\");\n\nexport const zRawSigningAssetFields = z\n .object({ type: z.literal(AccountType.RAW_SIGNING).describe(\"Account type\") })\n .describe(\"Raw signing account\");\n\nexport const zPolkadotLikeAssetFields = z\n .object({\n type: z.literal(AccountType.POLKADOT_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n .describe(\"Polkadot-like\");\n\nexport const zRippleLikeAssetFields = z\n .object({\n type: z.literal(AccountType.RIPPLE_LIKE).describe(\"Account type\"),\n xpub: z.string().describe(\"xpub (extended public key)\"),\n })\n .describe(\"Ripple-like\");\n\nexport const zSolanaLikeAssetFields = z\n .object({\n type: z.literal(AccountType.SOLANA_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n contractAddress: z.string().describe(\"Token contract address\").nullable(),\n })\n .describe(\"Solana-like\");\n\nexport const zStellarLikeAssetFields = z\n .object({\n type: z.literal(AccountType.STELLAR_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n .describe(\"Stellar-like\");\n\nexport const zSuiLikeAssetFields = z\n .object({\n type: z.literal(AccountType.SUI_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n .describe(\"Sui-like\");\n\nexport const zTezosLikeAssetFields = z\n .object({\n type: z.literal(AccountType.TEZOS_LIKE).describe(\"Account type\"),\n address: z.string().describe(\"Account address\").nullable(),\n })\n .describe(\"Tezos-like\");\n\nexport type BitcoinLikeAssetFields = z.infer<typeof zBitcoinLikeAssetFields>;\nexport type CardanoLikeAssetFields = z.infer<typeof zCardanoLikeAssetFields>;\nexport type EthereumLikeAssetFields = z.infer<typeof zEthereumLikeAssetFields>;\nexport type EthereumTokenLikeAssetFields = z.infer<typeof zEthereumTokenLikeAssetFields>;\nexport type GenericLikeAssetFields = z.infer<typeof zGenericLikeAssetFields>;\nexport type RawSigningAssetFields = z.infer<typeof zRawSigningAssetFields>;\nexport type PolkadotLikeAssetFields = z.infer<typeof zPolkadotLikeAssetFields>;\nexport type RippleLikeAssetFields = z.infer<typeof zRippleLikeAssetFields>;\nexport type SolanaLikeAssetFields = z.infer<typeof zSolanaLikeAssetFields>;\nexport type StellarLikeAssetFields = z.infer<typeof zStellarLikeAssetFields>;\nexport type TezosLikeAssetFields = z.infer<typeof zTezosLikeAssetFields>;\nexport type SuiLikeAssetFields = z.infer<typeof zSuiLikeAssetFields>;\n\n/**\n * Asset fields.\n */\nexport const zAccountAssetStaticFields = z\n .discriminatedUnion(\"type\", [\n zBitcoinLikeAssetFields,\n zCardanoLikeAssetFields,\n zEthereumLikeAssetFields,\n zEthereumTokenLikeAssetFields,\n zGenericLikeAssetFields,\n zPolkadotLikeAssetFields,\n zRawSigningAssetFields,\n zRippleLikeAssetFields,\n zSolanaLikeAssetFields,\n zStellarLikeAssetFields,\n zTezosLikeAssetFields,\n zSuiLikeAssetFields,\n ])\n .describe(\"Account asset fields\");\n\nexport type AccountAssetStaticFields = z.infer<typeof zAccountAssetStaticFields>;\n","import type { ReviewConfig, User } from \"@prisma/client\";\nimport { isEqual, zip } from \"lodash\";\nimport { z } from \"zod\";\n\nimport type { GroupWithMembers } from \"@/groups\";\nimport { ensureNotNil, wrapToObjectsWithId } from \"@/utils\";\n\ntype UsersAndGroups = {\n users: User[];\n groups: GroupWithMembers[];\n};\n\nexport type ReviewConfigWithMembers = ReviewConfig & UsersAndGroups;\n\nexport const zReviewStepWithUsers = z\n .object({\n quorum: z.number().min(0).describe(\"Number of required approvals for the step\"),\n userIds: z.array(z.string().min(1)).describe(\"User ids in the step\"), // PKs to `User` model\n })\n .describe(\"Review step with users\");\n\nexport type ReviewStepWithUsers = z.infer<typeof zReviewStepWithUsers>;\n\nexport const zReviewStepWithUsersArray = z.array(zReviewStepWithUsers);\n\nexport const zReviewStepData = z.union([\n zReviewStepWithUsers,\n z\n .object({\n quorum: z.number().min(0).describe(\"Number of required approvals for the step\"),\n groupId: z.string().min(1).describe(\"Group id in the step\"), // PKs to `Group` model\n })\n .describe(\"Review step with group\"),\n]);\n\nexport type ReviewStepData = z.infer<typeof zReviewStepData>;\n\nexport const zReviewStepsArray = z.array(zReviewStepData).min(1).describe(\"Review steps\");\n\n/**\n * Compares two review steps arrays and return whether they are equivalent. They are equivalent\n * if they contain the same number of review steps, and for each review step, the quorum and\n * members (regardless of the order) are the same.\n */\nexport const reviewStepsAreEquivalent = (\n steps: ReviewStepData[],\n otherSteps: ReviewStepData[],\n): boolean => {\n if (steps.length !== otherSteps.length) {\n return false;\n }\n\n const isEquivalent = ([step, otherStep]: [\n ReviewStepData | undefined,\n ReviewStepData | undefined,\n ]): boolean => {\n // We should not see undefined as we should have already compared the length of the steps.\n /* v8 ignore start */\n if (step === undefined || otherStep === undefined) {\n return false;\n }\n /* v8 ignore stop */\n if (step.quorum !== otherStep.quorum) {\n return false;\n }\n if (\"userIds\" in step && \"userIds\" in otherStep) {\n // The ordering is not important.\n return isEqual(step.userIds.slice().sort(), otherStep.userIds.slice().sort());\n }\n if (\"groupId\" in step && \"groupId\" in otherStep) {\n return step.groupId === otherStep.groupId;\n }\n // One has `userIds` while the other has `groupId`...\n return false;\n };\n\n return zip(steps, otherSteps).every(isEquivalent);\n};\n\n// Connect `ReviewConfig` to its related users and groups.\ntype ReviewConfigConnections = {\n users: { connect: { id: string }[] };\n groups: { connect: { id: string }[] };\n};\n\n/**\n * Given a data containing review steps, connect the related users and groups.\n *\n * Note: This function does NOT check if referenced users or groups exist in DB. If any of them\n * does not exist, prisma will throw an error when creating or updating objects in DB.\n */\nexport const connectReviewConfigData = <T extends { steps: ReviewStepData[] }>(\n data: T,\n): Omit<T, \"users\" | \"groups\"> & ReviewConfigConnections => {\n const { steps } = data;\n const userIds = steps.flatMap((step) => (\"userIds\" in step ? step.userIds : []));\n const groupIds = steps.flatMap((step) => (\"groupId\" in step ? [step.groupId] : []));\n return {\n ...data,\n users: { connect: wrapToObjectsWithId(userIds) },\n groups: { connect: wrapToObjectsWithId(groupIds) },\n };\n};\n\nexport type EnrichedReviewConfig = Omit<ReviewConfigWithMembers, \"steps\"> & {\n steps: ReviewStepData[];\n};\n\nexport const enrichReviewConfig = (reviewConfig: ReviewConfigWithMembers): EnrichedReviewConfig => {\n const steps = zReviewStepsArray.parse(reviewConfig.steps);\n return {\n ...reviewConfig,\n steps,\n };\n};\n\n/** Return individual users or group (with members) in a given review step. */\nexport const getReviewStepUsersOrGroup = (\n reviewConfig: ReviewConfigWithMembers,\n stepIndex: number,\n): { users: User[]; group: GroupWithMembers | null } => {\n const step = enrichReviewConfig(reviewConfig).steps[stepIndex];\n if (step === undefined) {\n return { users: [], group: null };\n }\n\n let users: User[];\n let group: GroupWithMembers | null;\n if (\"userIds\" in step) {\n users = step.userIds.map((userId) =>\n ensureNotNil(reviewConfig.users.find((_) => _.id === userId)),\n );\n group = null;\n } else {\n users = [];\n group = ensureNotNil(reviewConfig.groups.find((_) => _.id === step.groupId));\n }\n return { users, group };\n};\n\n/**\n * Return all the members in a given review step. This includes individual users and group members.\n * If the step index is out of bound, return an empty array.\n */\nexport const getReviewStepMembers = (\n reviewConfig: ReviewConfigWithMembers,\n stepIndex: number,\n): User[] => {\n const { users, group } = getReviewStepUsersOrGroup(reviewConfig, stepIndex);\n return users.concat(group?.members ?? []);\n};\n","import type { Policy, Prisma } from \"@prisma/client\";\nimport { z } from \"zod\";\n\nimport { zOperationType } from \"@/types\";\nimport { zHsmObjectId, zUnsignedIntString } from \"@/zod-utils\";\n\nexport const zThreshold = z\n .object({\n min: zUnsignedIntString.nullable().describe(\"Minimum transaction amount\"),\n max: zUnsignedIntString.nullable().describe(\"Maximum transaction amount\"),\n })\n .describe(\"Threshold for the transaction value\");\n\nexport type Threshold = z.infer<typeof zThreshold>;\n\nexport const zWhitelistIds = z\n .array(z.string().min(1))\n .describe(\"IDs of whitelists for the recipient address\");\n\n// Shape of the policy model rulesJsonArray field\nexport const zGovRuleJsonObject = z\n .object({\n // Required.\n operationType: zOperationType.describe(\"Allowed operation type\"),\n // Optional threshold on transaction value: null `min` = 0, null `max` = +inf\n threshold: zThreshold,\n // Optional whitelist on transaction recipient: Empty list means no whitelist.\n whitelistIds: zWhitelistIds,\n reviewConfigId: z.string().min(1).describe(\"Id of ReviewConfig\"),\n // HSM id for the rule\n hsmId: zHsmObjectId,\n })\n .describe(\"INTERNAL: Governance rule JSON representation in DB\");\n\nexport type GovRuleJsonObject = z.infer<typeof zGovRuleJsonObject>;\n\nexport const zGovRulesJsonArray = z.array(zGovRuleJsonObject);\n\ntype PolicyJsonFields = { rulesJsonArray: Prisma.JsonValue };\n\nexport type ParsedPolicy<T extends PolicyJsonFields = Policy> = Omit<T, \"rulesJsonArray\"> & {\n rulesJsonArray: GovRuleJsonObject[];\n};\n\nexport const parseFields = <T extends PolicyJsonFields>(policy: T): ParsedPolicy<T> => {\n const rulesJsonArray = zGovRulesJsonArray.parse(policy.rulesJsonArray);\n return { ...policy, rulesJsonArray };\n};\n","export const INCLUDE_MEMBERS = {\n users: true,\n groups: {\n include: { members: true },\n },\n};\n","import z from \"zod\";\n\nexport const zUpdateQuorumRequestData = z.object({\n quorum: z.number().int().min(2).describe(\"Workspace quorum\"),\n});\n\nexport type UpdateQuorumRequestData = z.infer<typeof zUpdateQuorumRequestData>;\n","import { ActivationStatus, type PrismaClient, type Workspace } from \"@prisma/client\";\nimport z from \"zod\";\n\nexport const zWorkspaceName = z\n .string()\n .min(1)\n .max(20)\n .regex(/^[a-z0-9]+$/);\n\nexport const getActiveWorkspaceOrThrow = async (\n name: string,\n prisma: PrismaClient,\n): Promise<Workspace> => {\n return prisma.workspace.findUniqueOrThrow({\n where: { name, status: ActivationStatus.ACTIVE },\n });\n};\n","import z from \"zod\";\n\nimport { zWorkspaceName } from \"@/workspaces\";\nimport { zCurrency, zUnsignedIntString } from \"@/zod-utils\";\n\nexport const zTradelinkWhitelistAddress = z.object({\n name: z.string().min(1),\n currency: zCurrency,\n address: z.string().min(1),\n});\n\nexport type TradelinkWhitelistAddress = z.infer<typeof zTradelinkWhitelistAddress>;\n\nexport const zTradelinkWhitelist = z.array(zTradelinkWhitelistAddress);\n\nconst zTradelinkId = z.string().describe(\"Unique identifier in Tradelink service\");\n\nexport type TradelinkId = z.infer<typeof zTradelinkId>;\n\nexport const zTradelinkOrgEntityResponse = z.object({\n tradelinkId: zTradelinkId,\n name: z.string().describe(\"Name\"),\n code: z.string().describe(\"Code\"),\n logoUrl: z.string().describe(\"Logo URL\"),\n});\n\nexport type TradelinkOrgEntityResponse = z.infer<typeof zTradelinkOrgEntityResponse>;\n\nexport const zCreateTradelinkOrgEntityInput = zTradelinkOrgEntityResponse.omit({\n tradelinkId: true,\n});\n\nexport type CreateTradelinkOrgEntityInput = z.infer<typeof zCreateTradelinkOrgEntityInput>;\n\nexport const zDeleteTradelinkOrgEntityInput = z.object({\n tradelinkId: zTradelinkId,\n});\n\nexport type DeleteTradelinkExchangeInput = z.infer<typeof zDeleteTradelinkOrgEntityInput>;\n\nconst zTradelinkExchangeConfig = z.object({\n exchangeId: z.string().describe(\"Tradelink exchange id\"),\n repledgeAuthorized: z\n .boolean()\n .describe(\"Determines whether this exchange is authorized to repledge on this account\"),\n needsAssetManagerApprovalForSettlements: z\n .boolean()\n .describe(\n 'Determines whether asset manager will \"pre-approve\" the settlement requests on this account',\n ),\n});\n\nexport type TradelinkExchangeConfig = z.infer<typeof zTradelinkExchangeConfig>;\n\nexport const zTradelinkExchangeConfigs = z.array(zTradelinkExchangeConfig);\n\nexport type TradelinkExchangeConfigs = z.infer<typeof zTradelinkExchangeConfigs>;\n\nexport const zCreateTradelinkNetworkBlueprintInput = z.object({\n workspaceName: zWorkspaceName,\n custodian: z.object({ name: z.string() }),\n assetManagers: z.array(z.object({ name: z.string() })),\n exchanges: z.array(z.object({ name: z.string() })),\n});\nexport type CreateTradelinkNetworkBlueprintInput = z.infer<\n typeof zCreateTradelinkNetworkBlueprintInput\n>;\n\nexport const zTradelinkNetworkBlueprintResponse = z.object({\n tradelinkId: z.string(),\n workspaceName: zWorkspaceName,\n custodian: zTradelinkOrgEntityResponse,\n assetManagers: z.array(zTradelinkOrgEntityResponse),\n exchanges: z.array(zTradelinkOrgEntityResponse),\n});\nexport type TradelinkNetworkBlueprintResponse = z.infer<typeof zTradelinkNetworkBlueprintResponse>;\n\n// #region ---------- Pledge ----------------------------------------------------------------------\n\nconst zTradelinkAsset = z.object({\n name: z.string(),\n magnitude: z.number().int().nonnegative(),\n});\n\nexport type TradelinkAsset = z.infer<typeof zTradelinkAsset>;\n\nexport const zPledgeResponse = z.object({\n tradelinkId: zTradelinkId,\n asset: zTradelinkAsset,\n state: z.enum([\n \"PLEDGE_READY\",\n \"PLEDGE_INCREMENT_PENDING_APPROVAL\",\n \"PLEDGE_APPROVED\",\n \"PLEDGE_REJECTED\",\n \"UNPLEDGE_PENDING_APPROVAL\",\n \"UNPLEDGE_APPROVED\",\n \"UNPLEDGE_REJECTED\",\n \"REPLEDGE_PENDING_APPROVAL\",\n \"REPLEDGE_APPROVED\",\n \"REPLEDGE_REJECTED\",\n \"ASSIGNED_TO_SETTLEMENT\",\n \"OUTBOUND_TRANSACTION_CONFIRMED\",\n \"OUTBOUND_TRANSACTION_FAILED\",\n \"RECOVERING_FROM_FAILURE\",\n \"PLEDGE_CONSUMED\",\n ]),\n isLocked: z.boolean(),\n amount: z.string().describe(\"Currently pledged amount\"),\n pending: z.string().describe(\"Requested pledge increment, not yet approved\"),\n repledge: z.string().describe(\"TODO: describe this field\"),\n exchangeTradelinkId: z.string(),\n accountId: z.string(),\n});\n\nexport type PledgeResponse = z.infer<typeof zPledgeResponse>;\n\nexport const zCreatePledgeInput = z.object({\n workspaceName: z.string(),\n clientAccountId: z.string().describe(\"Account ID from the client side\"),\n exchangeTradelinkId: zTradelinkId,\n asset: zTradelinkAsset,\n});\n\nexport type CreatePledgeInput = z.infer<typeof zCreatePledgeInput>;\n\nexport const zPledgeAdjustmentInput = z.object({\n pledgeTradelinkId: zTradelinkId,\n amount: zUnsignedIntString,\n asset: zTradelinkAsset,\n});\n\nexport type PledgeAdjustmentInput = z.infer<typeof zPledgeAdjustmentInput>;\n\nexport const zSettlementResponse = z.object({\n tradelinkId: z.string(),\n pledgeTradelinkId: z.string(),\n state: z.enum([\n \"REGISTERED\",\n \"PENDING_REPLEDGE_CREATION_APPROVAL\",\n \"PENDING_REPLEDGE_APPROVAL\",\n \"PENDING_CREATION_APPROVAL\",\n \"PENDING_PRE_APPROVAL\",\n \"PRE_APPROVED\",\n \"APPROVED\",\n \"REJECTED\",\n \"CONFIRMED\",\n \"FAILED\",\n \"CANCELED\",\n ]),\n // For now we only consider the outbound settlement\n outboundTransactionHash: z.string().nullable(),\n});\n\nexport type SettlementResponse = z.infer<typeof zSettlementResponse>;\n\n// #endregion\n","import z from \"zod\";\n\nimport { zReviewStepWithUsersArray } from \"@/governance\";\nimport { zSendOnlyTransactionData } from \"@/transactions\";\nimport { zIntString } from \"@/zod-utils\";\n\nimport { zTradelinkWhitelistAddress } from \"./types\";\n\nexport const zCustodianRequestData = z.object({\n settlement: zReviewStepWithUsersArray.describe(\"List of settlement review steps\"),\n withdraw: zReviewStepWithUsersArray.describe(\"List of withdraw review steps\"),\n arbitration: zReviewStepWithUsersArray.describe(\"List of arbitration review steps\"),\n});\n\nexport type CustodianRequestData = z.infer<typeof zCustodianRequestData>;\n\nexport const zTradelinkEntityRequestData = z.object({\n tradelinkId: z.string().min(1),\n groups: zReviewStepWithUsersArray.describe(\"List of asset manager review groups\"),\n whitelist: z\n .array(zTradelinkWhitelistAddress)\n .describe(\"List of asset manager whitelisted addresses\"),\n});\n\nexport type TradelinkEntityRequestData = z.infer<typeof zTradelinkEntityRequestData>;\n\n// #region ---------- Tradelink operations --------------------------------------------------------\n\nexport const zAdjustPledgeRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n exchangeId: z.string().describe(\"Exchange id\"),\n amount: zIntString.describe(\"Amount to add to pledge\"),\n});\n\nexport type AdjustPledgeRequestData = z.infer<typeof zAdjustPledgeRequestData>;\n\nexport const zRepledgeRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n exchangeId: z.string().describe(\"Exchange id\"),\n amount: zIntString.describe(\"Amount to add to pledge\"),\n});\n\nexport type RepledgeRequestData = z.infer<typeof zRepledgeRequestData>;\n\nexport const zCreateSettlementRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n exchangeId: z.string().describe(\"Exchange id\"),\n transaction: zSendOnlyTransactionData,\n});\n\nexport type CreateSettlementRequestData = z.infer<typeof zCreateSettlementRequestData>;\n\nexport const zForceUnpledgeRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n exchangeId: z.string().describe(\"Exchange id\"),\n});\n\nexport type ForceUnpledgeRequestData = z.infer<typeof zForceUnpledgeRequestData>;\n\nexport const zTradelinkWithdrawRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n transaction: zSendOnlyTransactionData,\n});\n\nexport type TradelinkWithdrawRequestData = z.infer<typeof zTradelinkWithdrawRequestData>;\n\nexport const zTradelinkArbitrationRequestData = z.object({\n accountId: z.string().describe(\"Account id\"),\n transaction: zSendOnlyTransactionData,\n});\n\nexport type TradelinkArbitrationRequestData = z.infer<typeof zTradelinkArbitrationRequestData>;\n\n// #endregion\n","import { AccountGovernanceType } from \"@prisma/client\";\nimport { z } from \"zod\";\n\nimport { zTradelinkExchangeConfigs } from \"@/tradelink\";\n\nconst zClassicAccountGovernanceFields = z\n .object({\n type: z.literal(AccountGovernanceType.CLASSIC).describe(\"Classic account governance\"),\n policyId: z.string().describe(\"Identifier of corresponding governance policy\"),\n })\n .describe(\"Classic\");\n\nconst zTradelinkAccountGovernanceFields = z\n .object({\n type: z.literal(AccountGovernanceType.TRADELINK).describe(\"Tradelink account governance\"),\n assetManagerId: z.string().describe(\"Identifier of corresponding asset manager\"),\n exchangeConfigs: zTradelinkExchangeConfigs.describe(\"Tradelink exchange configurations\"),\n })\n .describe(\"Tradelink\");\n\nexport const zAccountGovernanceFields = z\n .discriminatedUnion(\"type\", [zClassicAccountGovernanceFields, zTradelinkAccountGovernanceFields])\n .describe(\"Governance fields\");\n\nexport type AccountGovernanceFields = z.infer<typeof zAccountGovernanceFields>;\n","import { AccountType } from \"@prisma/client\";\nimport z from \"zod\";\n\n// #region ---------- Cardano ---------------------------------------------------------------------\n\nexport const zCardanoLikeStakingData = z\n .object({\n staked: z.string().describe(\"Staked balance\"),\n })\n .nullable()\n .describe(\"Cardano-like staking data\");\n\nexport type CardanoLikeStakingData = z.infer<typeof zCardanoLikeStakingData>;\n\nexport const zCardanoLikeStakingFields = z.object({\n type: z.literal(AccountType.CARDANO_LIKE).describe(\"Account type\"),\n staking: zCardanoLikeStakingData.optional(),\n});\n\nexport type CardanoLikeStakingFields = z.infer<typeof zCardanoLikeStakingFields>;\n\n// #endregion\n\n// #region ---------- Ethereum --------------------------------------------------------------------\n\nexport const zEthereumLikeStakingData = z\n .object({\n totalStaking: z.string().describe(\"Total staked amount\"),\n totalRewards: z.string().describe(\"Total of rewards\"),\n availableRewards: z.string().describe(\"Available rewards\"),\n networkApy: z.number().describe(\"Network APY\"),\n })\n .nullable()\n .describe(\"Ethereum-like staking data\");\n\nexport type EthereumLikeStakingData = z.infer<typeof zEthereumLikeStakingData>;\n\nexport const zEthereumLikeStakingFields = z.object({\n type: z.literal(AccountType.ETHEREUM_LIKE).describe(\"Account type\"),\n staking: zEthereumLikeStakingData.optional(),\n});\n\nexport type EthereumLikeStakingFields = z.infer<typeof zEthereumLikeStakingFields>;\n\n// #endregion\n\n// #region ---------- Polkadot --------------------------------------------------------------------\n\nexport const zPolkadotUnbondingAmount = z.object({\n amount: z.string().describe(\"Amount\"),\n waiting_time: z.string().describe(\"Waiting time\"),\n});\n\nexport const zPolkadotLikeStakingData = z\n .object({\n info: z.object({\n controllerAddress: z.string().nullable().describe(\"Controller address\"),\n rewardsDestination: z.string().nullable().describe(\"Rewards destination\"),\n proxies: z.array(z.string()).describe(\"Proxies\"),\n legacyStaking: z.boolean().describe(\"True if account uses legacy staking\"),\n isNominator: z.boolean().describe(\"True if is nominator\"),\n }),\n balances: z.object({\n free: z.string().describe(\"Free balance\"),\n reserved: z.string().describe(\"Reserved balance\"),\n frozen: z.string().describe(\"Frozen balance\"),\n bonded: z.string().describe(\"Bonded balance\"),\n available: z.string().describe(\"Available balance\"),\n unbonding: z.array(zPolkadotUnbondingAmount).describe(\"Unbonding balances\"),\n unbonded: z.array(zPolkadotUnbondingAmount).describe(\"Unbonded balances\"),\n totalUnbonding: z.string().describe(\"Total unbonding\"),\n totalUnbonded: z.string().describe(\"Total unbonded\"),\n }),\n anonymousProxy: z\n .object({\n address: z.string().describe(\"Address\"),\n createdAt: z.string().describe(\"Creation date\"),\n isController: z.boolean().describe(\"True if is controller\"),\n isMain: z.boolean().describe(\"True if is main\"),\n balances: z\n .object({\n free: z.string().describe(\"Anonymous proxy free balance\"),\n reserved: z.string().describe(\"Anonymous proxy reserved balance\"),\n frozen: z.string().describe(\"Anonymous proxy frozen balance\"),\n bonded: z.string().describe(\"Anonymous proxy bonded balance\"),\n available: z.string().describe(\"Anonymous proxy available balance\"),\n total: z.string().describe(\"Anonymous proxy total balance\"),\n })\n .nullable(),\n blockHeight: z.string().describe(\"Anonymous proxy block height\"),\n extIndex: z.string().describe(\"Ext index\"),\n index: z.string().describe(\"Index\"),\n kind: z.string().describe(\"Kind\"),\n })\n .nullable()\n .describe(\"Anonymous proxy\"),\n })\n .nullable()\n .describe(\"Polkadot-like staking data\");\n\nexport type PolkadotLikeStakingData = z.infer<typeof zPolkadotLikeStakingData>;\n\nexport const zPolkadotLikeStakingFields = z.object({\n type: z.literal(AccountType.POLKADOT_LIKE).describe(\"Account type\"),\n staking: zPolkadotLikeStakingData.optional(),\n});\n\nexport type PolkadotLikeStakingFields = z.infer<typeof zPolkadotLikeStakingFields>;\n\n// #endregion\n\n// #region ---------- Solana ----------------------------------------------------------------------\n\nexport const zSolanaStakingAccountStatus = z\n .enum([\"not_sync\", \"activating\", \"activated\", \"deactivating\", \"deactivated\", \"deleted\"])\n .describe(\"Staking account status\");\n\nexport const zSolanaLikeStakingData = z\n .object({\n staked: z.string().describe(\"Staked balance\"),\n rewards: z.object({\n total: z.string().describe(\"Total rewards\"),\n last7: z.string().describe(\"Rewards on last 7 days\"),\n last30: z.string().describe(\"Rewards on last 30 days\"),\n }),\n stakes: z.array(\n z.object({\n uid: z.string(),\n baseAccountUid: z.string(),\n pubKey: z.string().describe(\"Public key\"),\n validatorPubKey: z.string().nullable().describe(\"Validator public key\"),\n initialAmount: z.string().describe(\"Initial amount\"),\n activeAmount: z.string().describe(\"Active amount\"),\n inactiveAmount: z.string().describe(\"Inactive amount\"),\n totalBalance: z.string().describe(\"Total balance\"),\n creationDate: z.string().describe(\"Creation date\"),\n activationEpoch: z.string().nullable().describe(\"Activation epoch\"),\n activationDate: z.string().nullable().describe(\"Activation date\"),\n deactivationEpoch: z.string().nullable().describe(\"Deactivation epoch\"),\n deactivationDate: z.string().nullable().describe(\"Deactivation date\"),\n status: zSolanaStakingAccountStatus,\n rentExemptReserve: z.string().describe(\"Rent exempt reserve\"),\n withdrawableAmount: z.string().describe(\"Withdrawable amount\"),\n totalRewards: z.string().describe(\"Total rewards\"),\n creationTxHash: z.string().nullable().describe(\"Creation transaction hash\"),\n actionsTxHashes: z.array(z.string()).describe(\"Actions transactions hashes\"),\n }),\n ),\n })\n .nullable()\n .describe(\"Solana-like staking data\");\n\nexport type SolanaLikeStakingData = z.infer<typeof zSolanaLikeStakingData>;\n\nexport const zSolanaLikeStakingFields = z.object({\n type: z.literal(AccountType.SOLANA_LIKE).describe(\"Account type\"),\n staking: zSolanaLikeStakingData.optional(),\n});\n\nexport type SolanaLikeStakingFields = z.infer<typeof zSolanaLikeStakingFields>;\n\n// #endregion\n\n// #region ---------- Tezos -----------------------------------------------------------------------\n\nexport const zTezosLikeStakingData = z\n .object({\n delegations: z.array(\n z.object({\n address: z.string(),\n }),\n ),\n })\n .nullable()\n .describe(\"Tezos-like staking data\");\n\nexport type TezosLikeStakingData = z.infer<typeof zTezosLikeStakingData>;\n\nexport const zTezosLikeStakingFields = z.object({\n type: z.literal(AccountType.TEZOS_LIKE).describe(\"Account type\"),\n staking: zTezosLikeStakingData.optional(),\n});\n\nexport type TezosLikeStakingFields = z.infer<typeof zTezosLikeStakingFields>;\n\n// #endregion\n\nexport const zAccountStakingFields = z.discriminatedUnion(\"type\", [\n zCardanoLikeStakingFields,\n zEthereumLikeStakingFields,\n zPolkadotLikeStakingFields,\n zSolanaLikeStakingFields,\n zTezosLikeStakingFields,\n]);\n\nexport type AccountStakingFields = z.infer<typeof zAccountStakingFields>;\n","import { AccountType, ActivationStatus } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport { zCurrency } from \"@/zod-utils\";\n\nimport { zAccountAssetStaticFields } from \"./account-asset-fields\";\nimport { zAccountGovernanceFields } from \"./account-governance-fields\";\nimport {\n zCardanoLikeStakingFields,\n zEthereumLikeStakingFields,\n zPolkadotLikeStakingFields,\n zSolanaLikeStakingFields,\n zTezosLikeStakingFields,\n} from \"./account-staking-fields\";\n\nexport const zAccountCommonFields = z.object({\n id: z.string().describe(\"Internal unique identifier\"),\n legacyId: z.number().describe(\"Legacy internal unique identifier (for retro-compatibility)\"),\n name: z.string().describe(\"Name\"),\n currency: zCurrency,\n index: z.number().gte(0).describe(\"BIP44 account index\"),\n derivationPath: z.string().describe(\"Derivation path\"),\n status: z.nativeEnum(ActivationStatus).describe(\"Status\"),\n createdAt: z.coerce.date().describe(\"Creation timestamp\"),\n updatedAt: z.coerce.date().describe(\"Last modification timestamp\"),\n});\n\nexport const zAccountBalanceFields = z\n .object({\n total: z.string().describe(\"Total balance\"),\n pending: z.string().describe(\"Pending balance\"),\n })\n .describe(\"Balance fields\");\n\nexport type AccountBalanceFields = z.infer<typeof zAccountBalanceFields>;\n\nexport const zAccountResponse = zAccountCommonFields.extend({\n asset: zAccountAssetStaticFields,\n governance: zAccountGovernanceFields,\n});\n\nexport type AccountResponse = z.infer<typeof zAccountResponse>;\n\nexport const zAccountSortBy = z\n .enum([\n \"name\",\n \"currency\",\n \"index\",\n \"createdAt\",\n \"updatedAt\",\n ] as const satisfies (keyof AccountResponse)[])\n .default(\"createdAt\");\n\nexport type AccountSortBy = z.infer<typeof zAccountSortBy>;\n\nconst zCommonLiveData = z.object({\n id: z.string().describe(\"Account internal unique identifier\"),\n balance: zAccountBalanceFields,\n});\n\nconst zBitcoinLikeLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.BITCOIN_LIKE).describe(\"Account type\"),\n })\n .describe(\"Bitcoin-like\");\n\nconst zCardanoLikeLiveData = zCommonLiveData\n .merge(zCardanoLikeStakingFields)\n .describe(\"Cardano-like\");\n\nconst zEthereumLikeLiveData = zCommonLiveData\n .merge(zEthereumLikeStakingFields)\n .describe(\"Ethereum-like\");\n\nconst zEthereumTokenLikeLiveData = zCommonLiveData\n .extend({\n type: z\n .enum([AccountType.ERC20_LIKE, AccountType.BEP20_LIKE, AccountType.TRC20_LIKE])\n .describe(\"Account type\"),\n })\n .describe(\"Ethereum-like token\");\n\nconst zGenericLikeLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.GENERIC_LIKE).describe(\"Account type\"),\n })\n .describe(\"Generic-like\");\n\nconst zPolkadotLikeLiveData = zCommonLiveData\n .merge(zPolkadotLikeStakingFields)\n .describe(\"Polkadot-like\");\n\nconst zRawSigningLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.RAW_SIGNING).describe(\"Account type\"),\n })\n .describe(\"Raw signing account\");\n\nconst zRippleLikeLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.RIPPLE_LIKE).describe(\"Account type\"),\n })\n .describe(\"Ripple-like\");\n\nconst zSolanaLikeLiveData = zCommonLiveData.merge(zSolanaLikeStakingFields).describe(\"Solana-like\");\n\nconst zStellarLikeLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.STELLAR_LIKE).describe(\"Account type\"),\n })\n .describe(\"Stellar-like\");\n\nconst zSuiLikeLiveData = zCommonLiveData\n .extend({\n type: z.literal(AccountType.SUI_LIKE).describe(\"Account type\"),\n })\n .describe(\"Sui-like\");\n\nconst zTezosLikeLiveData = zCommonLiveData.merge(zTezosLikeStakingFields).describe(\"Tezos-like\");\n\nexport const zAccountLiveData = z.discriminatedUnion(\"type\", [\n zBitcoinLikeLiveData,\n zCardanoLikeLiveData,\n zEthereumLikeLiveData,\n zEthereumTokenLikeLiveData,\n zGenericLikeLiveData,\n zPolkadotLikeLiveData,\n zRawSigningLiveData,\n zRippleLikeLiveData,\n zSolanaLikeLiveData,\n zStellarLikeLiveData,\n zSuiLikeLiveData,\n zTezosLikeLiveData,\n]);\n\nexport type AccountLiveData = z.infer<typeof zAccountLiveData>;\n","import z from \"zod\";\n\nimport { zNote } from \"@/types\";\nimport { ensureNonEmptyArray } from \"@/utils\";\n\nimport { zTransactionResponse } from \"./clients/types\";\n\nexport {\n type AccountResponse,\n type AccountSortBy,\n zAccountResponse,\n zAccountSortBy,\n} from \"./types\";\n\nexport { zOperationType } from \"@/types\";\n\n// re-export TransactionResponse from clients\nexport type { TransactionResponse } from \"./clients/types\";\n\nexport const zTransactionWithMetaResponse = z.discriminatedUnion(\n zTransactionResponse.discriminator,\n ensureNonEmptyArray(\n zTransactionResponse.options.map((_) =>\n _.extend({\n note: zNote.nullable().describe(\"Optional transaction note\"),\n }),\n ),\n ),\n);\n\nexport type TransactionWithMetaResponse = z.infer<typeof zTransactionWithMetaResponse>;\n\nexport { zEstimatedFees as zEstimateFeesResponse } from \"@/transactions\";\nexport { zAccountLiveData } from \"./types\";\n","import type { Whitelist } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport { zCurrency } from \"@/zod-utils\";\n\nexport const zWhitelistAddress = z.object({\n name: z.string().min(1).max(50),\n currency: zCurrency,\n address: z.string().min(1).max(200),\n // Destination tags are numeric-only or alpha-numeric.\n // Empty array (or undefined) means no check on destination tag.\n destinationTags: z.array(z.string().min(1).regex(/^\\w+$/)).optional(),\n});\n\nexport const zWhitelistAddresses = z.array(zWhitelistAddress);\n\nexport type WhitelistAddress = z.infer<typeof zWhitelistAddress>;\n\nexport type Destination = {\n currency: string;\n recipient: string;\n destinationTag?: string;\n};\n\nexport const isWhitelisted = (destination: Destination, whitelist: Whitelist): boolean => {\n const addresses = zWhitelistAddresses.parse(whitelist.addresses);\n return addresses.some(\n (whitelisted) =>\n whitelisted.currency === destination.currency &&\n whitelisted.address === destination.recipient &&\n // If no destination tags, it means all tags are allowed.\n (!whitelisted.destinationTags ||\n whitelisted.destinationTags.length === 0 ||\n whitelisted.destinationTags.includes(destination.destinationTag ?? \"\")),\n );\n};\n","import { WhitelistType } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport { zWhitelistAddresses } from \"./db-types\";\n\n// FIXME unify the different max length of object names\n// there is some inconsistencies right now between front<>gate and what is actually\n// possible on a real device screen\n//\n// for now, putting 45 to unlock Gate sync\n// see https://ledger.slack.com/archives/C05RD1RKUSV/p1719320103721699\n//\nexport const zWhitelistName = z.string().min(1).max(45).describe(\"Whitelist name\");\n\nexport const zCreateWhitelistRequestData = z.object({\n name: zWhitelistName,\n description: z.string().nullable(),\n addresses: zWhitelistAddresses,\n type: z.nativeEnum(WhitelistType),\n});\n\nexport type CreateWhitelistRequestData = z.infer<typeof zCreateWhitelistRequestData>;\n\n// FIXME should we allow edit of description? probably yes\nexport const zEditWhitelistRequestData = z.object({\n name: zWhitelistName,\n addresses: zWhitelistAddresses,\n});\n\nexport type EditWhitelistRequestData = z.infer<typeof zEditWhitelistRequestData>;\n","import type { Policy, PrismaClient, User, Whitelist } from \"@prisma/client\";\nimport { ReviewConfigType } from \"@prisma/client\";\nimport invariant from \"invariant\";\nimport { uniq } from \"lodash\";\nimport z from \"zod\";\n\nimport type { EnrichedReviewConfig, ReviewConfigWithMembers } from \"@/governance\";\nimport {\n connectReviewConfigData,\n enrichReviewConfig,\n getReviewStepMembers,\n zReviewStepsArray,\n} from \"@/governance\";\nimport type { GroupWithMembers } from \"@/groups\";\nimport { type HsmObjectId } from \"@/hsm\";\nimport { PolicyModel, ReviewConfigModel } from \"@/prisma-utils\";\nimport type { Operation } from \"@/types\";\nimport { isValueTransaction, zClassicOperationType, zOperationType } from \"@/types\";\nimport { ensureNotNil, uniqById } from \"@/utils\";\nimport { isWhitelisted } from \"@/whitelists\";\n\n// #region ---------- Public schema for governance rules ------------------------------------------\n\nconst zBaseGovRuleData = z.object({\n // Steps of users that will need to review operations\n reviewSteps: zReviewStepsArray,\n // Optional threshold on transaction value: null `min` = 0, null `max` = +inf\n threshold: PolicyModel.zThreshold.optional(),\n // Optional whitelist on transaction recipient: Empty list means no whitelist.\n whitelistIds: PolicyModel.zWhitelistIds.optional(),\n});\n\n// Used when creating/editing classic governance rules (non digest signing)\nexport const zClassicGovRuleData = zBaseGovRuleData\n .extend({\n operationType: zClassicOperationType.describe(\"Allowed operation type\"),\n })\n .describe(\"Account governance rule\");\n\nexport type ClassicGovRuleData = z.infer<typeof zClassicGovRuleData>;\n\n/**\n * Public facing governance rule response shape, facing clients and used in API.\n */\n\nexport const zGovRuleData = zBaseGovRuleData\n .extend({\n operationType: zOperationType.describe(\"Allowed operation type\"),\n })\n .describe(\"Governance rule\");\n\nexport type GovRuleData = z.infer<typeof zGovRuleData>;\n\n// #endregion\n\n// #region ---------- Utilities -------------------------------------------------------------------\n\n// TODO: Should be set with no duplicates!\nexport type PolicyRelatedObjects = {\n whitelists: Whitelist[];\n reviewConfigs: ReviewConfigWithMembers[];\n};\n\n/** Constant to be used with `prisma.policy` to include all the related objects of a policy. */\nexport const INCLUDE_POLICY_RELATED_OBJECTS = {\n whitelists: true,\n reviewConfigs: { include: ReviewConfigModel.INCLUDE_MEMBERS },\n};\n\n/** `Policy` with related objects. */\nexport type PolicyWithRelatedObjects = Policy & PolicyRelatedObjects;\n\n/** Extract individual users and groups (with members) from a policy. */\nexport const getPolicyUsersAndGroups = (\n policy: Omit<PolicyWithRelatedObjects, \"whitelists\">,\n): {\n users: User[];\n groups: GroupWithMembers[];\n} => {\n const users = uniqById(policy.reviewConfigs.flatMap((_) => _.users));\n const groups = uniqById(policy.reviewConfigs.flatMap((_) => _.groups));\n return { users, groups };\n};\n\n/** Extract members (individual users and group members) from a policy. */\nexport const getPolicyMembers = (policy: Omit<PolicyWithRelatedObjects, \"whitelists\">): User[] => {\n const { users, groups } = getPolicyUsersAndGroups(policy);\n return uniqById(users.concat(groups.flatMap((_) => _.members)));\n};\n\nexport const createGovRule = async (\n workspaceName: string,\n rule: GovRuleData,\n hsmId: string,\n prisma: PrismaClient,\n): Promise<PolicyModel.GovRuleJsonObject> => {\n const { operationType, reviewSteps, threshold, whitelistIds } = {\n threshold: { min: null, max: null },\n whitelistIds: [],\n ...rule,\n };\n const reviewConfig = await prisma.reviewConfig.create({\n data: connectReviewConfigData({\n workspaceName,\n type: ReviewConfigType.OPERATOR_REVIEW_CONFIG,\n steps: reviewSteps,\n ownerPolicyId: null,\n }),\n include: ReviewConfigModel.INCLUDE_MEMBERS,\n });\n const reviewConfigId = reviewConfig.id;\n return {\n operationType,\n threshold,\n whitelistIds,\n reviewConfigId,\n hsmId,\n };\n};\n\n/**\n * Create governance rules JSON array from the rules data. For each governance rule, it will create\n * review configs owned by the rule. It returns an object with:\n *\n * - `rulesJsonArray`: A JSON array suitable for the `Policy.rulesJsonArray` field.\n * - `whitelistIds`: IDs of related whitelists, to be connected to the `Policy` object.\n * - `reviewConfigIds`: IDs of related review configs, to be connected to the `Policy` object.\n */\nexport const createGovRules = async (\n workspaceName: string,\n rules: GovRuleData[],\n hsmRuleSetIds: string[],\n prisma: PrismaClient,\n): Promise<{\n rulesJsonArray: PolicyModel.GovRuleJsonObject[];\n whitelistIds: string[];\n reviewConfigIds: string[];\n}> => {\n invariant(\n rules.length === hsmRuleSetIds.length,\n `Rule and rule HSM id count mismatch ${rules.length} !== ${hsmRuleSetIds.length}`,\n );\n const rulesJsonArray = await Promise.all(\n rules.map(async (rule, index) =>\n createGovRule(workspaceName, rule, hsmRuleSetIds[index]!, prisma),\n ),\n );\n const whitelistIds = uniq(rulesJsonArray.flatMap((_) => _.whitelistIds));\n const reviewConfigIds = uniq(rulesJsonArray.map((_) => _.reviewConfigId));\n return { rulesJsonArray, whitelistIds, reviewConfigIds };\n};\n\nexport type GovRuleExpanded = Pick<PolicyModel.GovRuleJsonObject, \"operationType\" | \"threshold\"> & {\n whitelists: Whitelist[];\n reviewConfig: ReviewConfigWithMembers;\n hsmId: string;\n};\n\n/** Expand govRules of the given policy by dereferencing related objects from ID. */\nexport const expandGovRules = (policy: PolicyWithRelatedObjects): GovRuleExpanded[] =>\n PolicyModel.parseFields(policy).rulesJsonArray.map((ruleJsonObject) => {\n const { operationType, threshold, whitelistIds, reviewConfigId, hsmId } = ruleJsonObject;\n const whitelists = whitelistIds.map((whitelistId) =>\n ensureNotNil(policy.whitelists.find((_) => _.id === whitelistId)),\n );\n const reviewConfig = ensureNotNil(policy.reviewConfigs.find((_) => _.id === reviewConfigId));\n return {\n operationType,\n threshold,\n whitelists,\n reviewConfig,\n hsmId,\n };\n });\n\n/**\n * TODO: This function is only used by `app-routers` to convert `policy.rules` to JSON format\n * expected by `PolicyResponse`. Consider redefining the shape of `PolicyResponse`!\n */\nexport const jsonifyGovRules = (policy: PolicyWithRelatedObjects): GovRuleData[] =>\n expandGovRules(policy).map((rule) => {\n const { operationType, threshold, whitelists } = rule;\n const whitelistIds = whitelists.map((_) => _.id);\n const reviewSteps = zReviewStepsArray.parse(rule.reviewConfig.steps);\n return { operationType, whitelistIds, threshold, reviewSteps };\n });\n\nexport const checkPreconditions = (operation: Operation, govRule: GovRuleExpanded): boolean => {\n const { operationType, threshold, whitelists } = govRule;\n // Check if operation type is allowed.\n if (operationType !== operation.type) {\n return false;\n }\n\n if (isValueTransaction(operation)) {\n // Check if value is within the threshold.\n const { min, max } = threshold;\n const value = BigInt(operation.value);\n if ((min !== null && value < BigInt(min)) || (max !== null && value > BigInt(max))) {\n return false;\n }\n // If this govRule has whitelists: Check if the destination is whitelisted.\n if (whitelists.length > 0 && !whitelists.some((_) => isWhitelisted(operation, _))) {\n return false;\n }\n }\n\n // All checks passed!\n return true;\n};\n\n/**\n * Check the operation and find the first matching govRule for it. Then return the matching gov rule's\n * reviewConfig, hsm id, and whitelist hsm id.\n * If no govRule matches the operation, return undefined.\n */\nexport const findMatchingRule = (\n operation: Operation,\n currentUser: User,\n policy: PolicyWithRelatedObjects,\n):\n | { reviewConfig: EnrichedReviewConfig; govRuleHsmId: HsmObjectId; whitelistHsmId?: HsmObjectId }\n | undefined => {\n const matchingRule = expandGovRules(policy)\n .filter((rule) => checkPreconditions(operation, rule))\n .find((rule) => {\n const members = getReviewStepMembers(rule.reviewConfig, 0);\n return members.some((_) => _.id === currentUser.id);\n });\n\n if (matchingRule === undefined) {\n return undefined;\n }\n\n const matchingWhitelist = isValueTransaction(operation)\n ? matchingRule.whitelists.find((_) => isWhitelisted(operation, _))\n : undefined;\n\n return {\n reviewConfig: enrichReviewConfig(matchingRule.reviewConfig),\n govRuleHsmId: matchingRule.hsmId,\n whitelistHsmId: matchingWhitelist?.hsmId,\n };\n};\n\n// #endregion\n","import z from \"zod\";\n\nimport { zClassicGovRuleData } from \"./db-utils\";\n\nconst zPolicyName = z.string().min(1).max(19).describe(\"Policy name\");\nconst zCurrency = z.string().min(1).max(40).regex(/^\\w+$/).describe(\"Currency\");\n\nexport const zCreatePublicPolicyRequestData = z.object({\n name: zPolicyName,\n description: z.string().nullable().describe(\"Description\"),\n currency: zCurrency.nullable(),\n govRules: z.array(zClassicGovRuleData).describe(\"Governance rules\"),\n});\n\nexport type CreatePublicPolicyRequestData = z.infer<typeof zCreatePublicPolicyRequestData>;\n\nexport const zEditPublicPolicyRequestData = z.object({\n name: zPolicyName,\n description: z.string().nullable().describe(\"Description\"),\n govRules: z.array(zClassicGovRuleData).describe(\"Governance rules\"),\n});\n\nexport type EditPublicPolicyRequestData = z.infer<typeof zEditPublicPolicyRequestData>;\n","import { AccountGovernanceType, AccountType } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport { zReviewStepWithUsersArray } from \"@/governance\";\nimport { zClassicGovRuleData } from \"@/policies\";\nimport { zTradelinkExchangeConfigs } from \"@/tradelink\";\nimport { zCurrency } from \"@/zod-utils\";\n\nconst zAccountName = z.string().min(1).max(40).describe(\"Account name\");\n\nconst zSignDigestsGovRuleData = z\n .object({\n operationType: z.literal(\"SIGN_DIGESTS\"),\n reviewSteps: zReviewStepWithUsersArray, // we need to control for API users only\n })\n .describe(\"Digest signing rule\");\n\nexport type SignDigestGovRuleData = z.infer<typeof zSignDigestsGovRuleData>;\n\nexport const zAccountPolicyRequestData = z\n .union([\n z.object({ policyId: z.string() }).describe(\"Account policy\"),\n z.object({ rules: z.array(zClassicGovRuleData) }).describe(\"Account governance rules\"),\n ])\n .describe(\"Account policy or governance rules\");\n\nexport type AccountPolicyRequestData = z.infer<typeof zAccountPolicyRequestData>;\n\nexport const zCreateAccountGovernanceData = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(AccountGovernanceType.CLASSIC),\n policy: zAccountPolicyRequestData,\n }),\n z.object({\n type: z.literal(AccountGovernanceType.TRADELINK),\n assetManagerId: z.string(),\n exchangeConfigs: zTradelinkExchangeConfigs,\n }),\n z.object({\n type: z.literal(AccountGovernanceType.RAW_SIGNING),\n policy: z.object({ rules: z.array(zSignDigestsGovRuleData) }),\n }),\n]);\n\nexport type CreateAccountGovernanceData = z.infer<typeof zCreateAccountGovernanceData>;\n\nexport const zCreateAccountUserInputData = z.object({\n name: zAccountName,\n currency: zCurrency, // \"bitcoin\"\n index: z.number().nonnegative().optional().describe(\"Account index\"),\n contractAddress: z.string().min(1).optional().describe(\"Account contract address\"),\n governance: zCreateAccountGovernanceData,\n});\n\nexport type CreateAccountUserInputData = z.infer<typeof zCreateAccountUserInputData>;\n\n// CreateAccountUserInputData is exposed to the outside world, but we will resolve the\n// account index and derivation path before storing the request data in DB\nexport const zCreateAccountRequestData = zCreateAccountUserInputData.omit({ index: true }).extend({\n index: z.number().nonnegative().describe(\"Account index\"),\n derivationPath: z.string().describe(\"Account bip44 derivation path\"),\n type: z.nativeEnum(AccountType), // \"BITCOIN_LIKE\"\n});\n\nexport type CreateAccountRequestData = z.infer<typeof zCreateAccountRequestData>;\n\nexport const zEditAccountGovernanceData = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(AccountGovernanceType.CLASSIC),\n policy: zAccountPolicyRequestData,\n }),\n z.object({\n type: z.literal(AccountGovernanceType.TRADELINK),\n exchangeConfigs: zTradelinkExchangeConfigs,\n }),\n z.object({\n type: z.literal(AccountGovernanceType.RAW_SIGNING),\n policy: z.object({ rules: z.array(zSignDigestsGovRuleData) }),\n }),\n]);\n\nexport type EditAccountGovernanceData = z.infer<typeof zEditAccountGovernanceData>;\n\nexport const zEditAccountRequestData = z.object({\n name: zAccountName,\n governance: zEditAccountGovernanceData,\n});\n\nexport type EditAccountRequestData = z.infer<typeof zEditAccountRequestData>;\n\n// There is no request data, but putting z.null() breaks typechecking when implementing the workflow\nexport const zActivateAccountRequestData = z.object({});\n\nexport type ActivateAccountRequestData = z.infer<typeof zActivateAccountRequestData>;\n\nexport const zEditTokenRuleRequestData = z.object({\n parentAccountId: z.string().min(1).describe(\"Parent account unique ID\"),\n contractAddress: z.string().min(1).describe(\"Token contract address\"),\n rules: z.array(zClassicGovRuleData).describe(\"Account governance rules\"),\n});\nexport type EditTokenRuleRequestData = z.infer<typeof zEditTokenRuleRequestData>;\n","import type { Account, PrismaClient } from \"@prisma/client\";\nimport { AccountGovernanceType, AccountType } from \"@prisma/client\";\nimport { keyBy } from \"lodash\";\n\nimport { zTradelinkExchangeConfigs } from \"@/tradelink\";\nimport { zNote } from \"@/types\";\nimport { unreachable } from \"@/utils\";\n\nimport { type AccountAssetStaticFields } from \"./account-asset-fields\";\nimport { type AccountGovernanceFields } from \"./account-governance-fields\";\nimport { type AccountStakingFields } from \"./account-staking-fields\";\nimport type { TransactionResponse, TransactionWithMetaResponse } from \"./app-types\";\nimport type {\n LamaCardanoClient,\n LamaEthereumClient,\n LamaSolanaClient,\n PolkadotAccountClient,\n WdTezosClient,\n} from \"./clients\";\nimport { getAccountClient } from \"./clients\";\nimport type { AccountWithGovernanceMixins } from \"./db-types\";\nimport type { AccountBalanceFields, AccountLiveData, AccountResponse } from \"./types\";\nimport { zAccountResponse } from \"./types\";\nimport { getAccountBalance } from \"./utils\";\n\nconst loadBalanceFields = async (\n account: Account,\n prisma: PrismaClient,\n): Promise<AccountBalanceFields> => {\n const { total, pending } = await getAccountBalance(account, prisma);\n return {\n total: total.toString(),\n pending: pending.toString(),\n };\n};\n\nconst loadStakingFields = async (account: Account): Promise<AccountStakingFields | null> => {\n const client = getAccountClient(account);\n switch (account.type) {\n case AccountType.ETHEREUM_LIKE:\n return {\n type: account.type,\n staking: await (client as LamaEthereumClient).getAccountStakingData(account),\n };\n case AccountType.CARDANO_LIKE:\n return {\n type: account.type,\n staking: await (client as LamaCardanoClient).getAccountStakingData(account),\n };\n case AccountType.SOLANA_LIKE:\n if (account.contractAddress) {\n // No staking for Solana SPL tokens\n return {\n type: account.type,\n staking: null,\n };\n }\n return {\n type: account.type,\n staking: await (client as LamaSolanaClient).getAccountStakingData(account),\n };\n case AccountType.TEZOS_LIKE:\n return {\n type: account.type,\n staking: await (client as WdTezosClient).getAccountStakingData(account),\n };\n case AccountType.POLKADOT_LIKE:\n return {\n type: account.type,\n staking: await (client as PolkadotAccountClient).getAccountStakingData(account),\n };\n }\n return null;\n};\n\nexport const getAccountLiveData = async (\n account: Account,\n prisma: PrismaClient,\n): Promise<AccountLiveData> => {\n const result = await Promise.all([\n loadBalanceFields(account, prisma),\n loadStakingFields(account),\n ]);\n const balance: AccountBalanceFields = result[0];\n const staking: AccountStakingFields | null = result[1];\n return {\n id: account.id,\n balance,\n ...(staking ?? { type: account.type }),\n };\n};\n\nconst getAccountAssetStaticFields = (\n account: AccountWithGovernanceMixins,\n): AccountAssetStaticFields => {\n switch (account.type) {\n case AccountType.BITCOIN_LIKE:\n return {\n type: account.type,\n xpub: account.xpub!,\n };\n case AccountType.ETHEREUM_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.ERC20_LIKE:\n case AccountType.BEP20_LIKE:\n case AccountType.TRC20_LIKE:\n return {\n type: account.type,\n address: account.address,\n contractAddress: account.contractAddress!,\n };\n case AccountType.CARDANO_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.SOLANA_LIKE:\n return {\n type: account.type,\n address: account.address,\n contractAddress: account.contractAddress,\n };\n case AccountType.TEZOS_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.STELLAR_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.SUI_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.RIPPLE_LIKE:\n return {\n type: account.type,\n xpub: account.xpub!,\n };\n case AccountType.POLKADOT_LIKE:\n return {\n type: account.type,\n address: account.address,\n };\n case AccountType.GENERIC_LIKE:\n case AccountType.RAW_SIGNING:\n return {\n type: account.type,\n };\n /* v8 ignore start */\n default:\n unreachable(account.type);\n /* v8 ignore stop */\n }\n};\n\nconst getAccountGovernanceFields = (\n account: AccountWithGovernanceMixins,\n): AccountGovernanceFields => {\n switch (account.governanceType) {\n case AccountGovernanceType.CLASSIC:\n case AccountGovernanceType.RAW_SIGNING:\n return {\n type: AccountGovernanceType.CLASSIC,\n policyId: account.classicGovernanceMixin!.policyId,\n };\n case AccountGovernanceType.TRADELINK:\n return {\n type: AccountGovernanceType.TRADELINK,\n assetManagerId: account.tradelinkGovernanceMixin!.assetManagerId,\n exchangeConfigs: zTradelinkExchangeConfigs.parse(\n account.tradelinkGovernanceMixin!.exchangeConfigs,\n ),\n };\n /* v8 ignore start */\n default:\n unreachable(account.governanceType);\n /* v8 ignore stop */\n }\n};\n\nexport const serializeAccount = (account: AccountWithGovernanceMixins): AccountResponse => {\n const asset = getAccountAssetStaticFields(account);\n const governance = getAccountGovernanceFields(account);\n\n const response: AccountResponse = {\n ...account,\n legacyId: account.gateId,\n governance,\n asset,\n };\n\n // Parse to strip off fields that are not defined in the schema.\n return zAccountResponse.parse(response);\n};\n\n/**\n * For each transaction, check if there is an associated TransactionMeta object, and retrieve\n * the corresponding data on the corresponding request\n *\n * @param transactions - TransactionResponse[] - transactions from account client\n * @param prisma - PrismaClient - prisma client\n *\n * @returns TransactionWithMetaResponse[]\n */\nexport const fetchTransactionMetas = async (\n workspaceName: string,\n transactions: TransactionResponse[],\n prisma: PrismaClient,\n): Promise<TransactionWithMetaResponse[]> => {\n const txHashes = transactions.map((tx) => tx.hash);\n const metas = await prisma.transactionMeta.findMany({\n where: { workspaceName, hash: { in: txHashes } },\n });\n const metasByHash = keyBy(metas, \"hash\");\n return transactions.map((t) => {\n const note = metasByHash[t.hash]?.note ? zNote.parse(metasByHash[t.hash]?.note) : null;\n return { ...t, note };\n });\n};\n","import z from \"zod\";\n\nexport const zSciConfigData = z.object({\n dapps: z.array(z.string()).nullable().describe(\"Allowed DApps, null allows all\"),\n customContractCallEnabled: z.boolean().describe(\"Allow non-DApp SCI\"),\n});\n\nexport const zCreateSciConfigRequestData = z.object({\n account: z.string().describe(\"Account UUID\"),\n config: zSciConfigData,\n});\n\nexport type CreateSciConfigRequestData = z.infer<typeof zCreateSciConfigRequestData>;\n\nexport const zEditSciConfigRequestData = z.object({\n config: zSciConfigData,\n});\n\nexport type EditSciConfigRequestData = z.infer<typeof zEditSciConfigRequestData>;\n","import type {\n ChallengeType,\n PrismaClient,\n User,\n VaultRequest,\n VaultRequestReview,\n Workspace,\n} from \"@prisma/client\";\nimport { z } from \"zod\";\n\nimport type { HsmChallengeStage } from \"@/hsm\";\n\nexport type WorkflowContext = {\n prisma: PrismaClient;\n workspace: Workspace;\n};\n\n/** The base type of `VaultRequest.data`. */\nexport type RequestData = Record<string, unknown>;\n\nexport type RequestWithData<T extends RequestData> = Omit<VaultRequest, \"data\"> & { data: T };\n\n/** Resolved review step that participates in the review process of a request. */\nexport type ResolvedReviewStep = {\n stageName: string;\n users: User[];\n quorum: number;\n};\n\nexport type ValidationResult<T extends RequestData> = {\n resolvedReviewSteps: ResolvedReviewStep[];\n requestData: T;\n managedData?: Record<string, unknown>;\n};\n\n/**\n * All approved review stages so far, where key is the stage name, and value is an array of\n * reviews with `APPROVED` status in the stage.\n */\nexport type ApprovedReviewStages = Record<string, VaultRequestReview[]>;\n\n/** Challenge response (signature) that user provides as proof to approve or reject a request. */\nexport type Proof =\n | {\n challengeType: ChallengeType;\n signature: string;\n }\n | {\n challengeType: null; // soft approval with no challenge to sign\n signature: \"!\";\n };\n\nexport type TargetObject = { id: string };\n\nexport type WorkflowEvent =\n | {\n type: \"TRANSACTION_SUBMITTED\";\n requestId: string;\n txHash: string;\n }\n | {\n type: \"TRANSACTION_FAILED\" | \"TRANSACTION_ONCHAIN\" | \"TRANSACTION_CONFIRMED\";\n requestId: string;\n }\n | {\n // Dummy event type just for testing\n type: \"DUMMY\";\n foobar: \"foo\" | \"bar\";\n };\n\n// #region ---------- VaultRequest.reviewSteps ----------------------------------------------------\n\n/** Item in `VaultRequest.reviewSteps` array representing one review step. */\nexport const zRequestReviewStep = z.object({\n stageName: z.string().regex(/^\\w+$/).describe(\"The review stage name\"),\n quorum: z.number().int().min(1).describe(\"Quorum for the review step\"),\n});\n\nexport const zRequestReviewSteps = z.array(zRequestReviewStep);\n\nexport type RequestReviewStep = z.infer<typeof zRequestReviewStep>;\n\n// #endregion\n\n// #region ---------- Multi-stage HSM challenges --------------------------------------------------\n\nexport type MultiStageHsmChallenges = {\n targetHsmId: string;\n stages: HsmChallengeStage[];\n};\n\n// #endregion\n","import { PsdModel, UserRegistrationState, UserRole } from \"@prisma/client\";\nimport { z } from \"zod\";\n\nexport const zUserName = z.string().min(1).max(19).describe(\"User name\");\n\nexport const zUserRegistrationCreateInput = z.object({\n name: zUserName,\n role: z.enum([UserRole.ADMIN, UserRole.OPERATOR]).describe(\"User role\"),\n psdModel: z.nativeEnum(PsdModel).describe(\"PSD model\"),\n deviceUserId: z.string().describe(\"Device user ID\"),\n});\n\nexport type UserRegistrationCreateInput = z.infer<typeof zUserRegistrationCreateInput>;\n\nexport const zUserRegistrationResponse = zUserRegistrationCreateInput.extend({\n id: z.string().describe(\"User registration ID\"),\n workspaceName: z.string().describe(\"Workspace name\"),\n state: z.nativeEnum(UserRegistrationState).describe(\"User registration state\"),\n isLocked: z.boolean().describe(\"Whether the registration is locked by a request\"),\n});\n\nexport type UserRegistrationResponse = z.infer<typeof zUserRegistrationResponse>;\n","import z from \"zod\";\n\nimport { zUserName } from \"./types\";\n\nexport const zCreatePsdUserRequestData = z.object({\n registrationId: z.string().describe(\"User registration ID\"),\n});\n\nexport type CreatePsdUserRequestData = z.infer<typeof zCreatePsdUserRequestData>;\n\nexport const zCreateApiUserRequestData = z\n .object({\n name: zUserName,\n pubKey: z.string().describe(\"Public key\"),\n role: z.enum([\"ADMIN\", \"OPERATOR\"]).describe(\"User role\"),\n viewAll: z.boolean().describe(\"View all data\").default(false).optional(),\n })\n .describe(\"Create API user request data\");\n\nexport type CreateApiUserRequestData = z.infer<typeof zCreateApiUserRequestData>;\n\nexport const zCreateApiUserAccessRequestData = z\n .object({\n name: zUserName,\n })\n .describe(\"Create API user credential request data\");\n\nexport type CreateApiUserAccessRequestData = z.infer<typeof zCreateApiUserAccessRequestData>;\n\nexport const zCreateApiUserManagedData = z\n .object({\n authUserId: z.string().describe(\"Authentication broker ID\"),\n })\n .describe(\"Managed data for API user\");\n\n// #endregion\n","import z from \"zod\";\n\nconst zGroupName = z.string().min(1).max(19).describe(\"Group name\");\n\nexport const zCreateGroupRequestData = z.object({\n name: zGroupName,\n description: z.string().nullable().describe(\"Group description\"),\n members: z.array(z.string()).describe(\"List of group members ids\"),\n});\n\nexport type CreateGroupRequestData = z.infer<typeof zCreateGroupRequestData>;\n\nexport const zEditGroupRequestData = z.object({\n name: zGroupName,\n description: z.string().nullable().describe(\"Group description\"),\n members: z.array(z.string()).describe(\"List of group members ids\"),\n});\n\nexport type EditGroupRequestData = z.infer<typeof zEditGroupRequestData>;\n","import z from \"zod\";\n\nexport const zApiKeyName = z.string().min(1).max(19).describe(\"API key name\");\n\nexport const zCreateApiKeyRequestData = z\n .object({\n name: zApiKeyName,\n entities: z.array(z.string()).describe(\"List of related entities ids\"),\n scopes: z.object({}).describe(\"FIXME to be precised\"),\n })\n .describe(\"Create read-only API key request data\");\n\nexport type CreateApiKeyRequestData = z.infer<typeof zCreateApiKeyRequestData>;\n\nexport const zEditApiKeyRequestData = zCreateApiKeyRequestData.describe(\n \"Edit read-only API key request data\",\n);\n\nexport type EditApiKeyRequestData = z.infer<typeof zEditApiKeyRequestData>;\n","import z from \"zod\";\n\nexport const zEntityName = z.string().min(1).max(19).describe(\"Entity name\");\n\nexport const zCreateEntityRequestData = z.object({\n name: zEntityName,\n accounts: z.array(z.string()),\n});\n\nexport type CreateEntityRequestData = z.infer<typeof zCreateEntityRequestData>;\n\nexport const zEditEntityRequestData = z.object({\n name: zEntityName,\n accounts: z.array(z.string()),\n});\n\nexport type EditEntityRequestData = z.infer<typeof zEditEntityRequestData>;\n","import { AdminPermission } from \"@prisma/client\";\nimport { omit } from \"lodash\";\nimport z from \"zod\";\n\nimport { zReviewStepWithUsersArray } from \"./review-config\";\n\nconst NonRootAdminPermission = omit(AdminPermission, \"ROOT\");\n\n// A non-root admin gov rule is uniquely identified by its permission\nexport const zWorkspaceRuleRequestData = z.object({\n permission: z.nativeEnum(NonRootAdminPermission).describe(\"Granted permissions\"),\n reviewConfig: zReviewStepWithUsersArray.describe(\"List of admin review steps\"),\n});\n\nexport type WorkspaceRuleRequestData = z.infer<typeof zWorkspaceRuleRequestData>;\n","/**\n * All zod schemas for `VaultRequest.data` are registered here.\n */\nimport { RequestType } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport {\n zActivateAccountRequestData,\n zCreateAccountRequestData,\n zCreateSciConfigRequestData,\n zEditAccountRequestData,\n zEditSciConfigRequestData,\n zEditTokenRuleRequestData,\n} from \"@/accounts\";\nimport { zCreateApiKeyRequestData, zEditApiKeyRequestData } from \"@/api-keys/api-key-requests\";\nimport { zCreateEntityRequestData, zEditEntityRequestData } from \"@/entities/entity-requests\";\nimport { zUpdateQuorumRequestData } from \"@/governance\";\nimport { zWorkspaceRuleRequestData } from \"@/governance/workspace-rule-requests\";\nimport { zCreateGroupRequestData, zEditGroupRequestData } from \"@/groups\";\nimport { zCreatePublicPolicyRequestData, zEditPublicPolicyRequestData } from \"@/policies\";\nimport {\n zAdjustPledgeRequestData,\n zCreateSettlementRequestData,\n zCustodianRequestData,\n zForceUnpledgeRequestData,\n zRepledgeRequestData,\n zTradelinkArbitrationRequestData,\n zTradelinkEntityRequestData,\n zTradelinkWithdrawRequestData,\n} from \"@/tradelink\";\nimport {\n zCreateTransactionRequestData,\n zSignDigestsRequestData,\n zSignMessageRequestData,\n} from \"@/transactions\";\nimport {\n zCreateApiUserAccessRequestData,\n zCreateApiUserRequestData,\n zCreatePsdUserRequestData,\n} from \"@/users\";\nimport {\n zCreateWhitelistRequestData,\n zEditWhitelistRequestData,\n} from \"@/whitelists/whitelist-requests\";\n\nexport const zVaultRequestMixinsByType = {\n // Workspaces\n [RequestType.UPDATE_QUORUM]: z.object({\n type: z.literal(RequestType.UPDATE_QUORUM),\n data: zUpdateQuorumRequestData,\n }),\n // Operator requests\n [RequestType.CREATE_TRANSACTION]: z.object({\n type: z.literal(RequestType.CREATE_TRANSACTION),\n data: zCreateTransactionRequestData,\n meta: z\n .object({\n hash: z.string().nullable(),\n })\n .optional()\n .nullable(),\n }),\n [RequestType.SIGN_MESSAGE]: z.object({\n type: z.literal(RequestType.SIGN_MESSAGE),\n data: zSignMessageRequestData,\n }),\n [RequestType.SIGN_DIGESTS]: z.object({\n type: z.literal(RequestType.SIGN_DIGESTS),\n data: zSignDigestsRequestData,\n }),\n // Accounts\n [RequestType.CREATE_ACCOUNT]: z.object({\n type: z.literal(RequestType.CREATE_ACCOUNT),\n data: zCreateAccountRequestData,\n }),\n [RequestType.EDIT_ACCOUNT]: z.object({\n type: z.literal(RequestType.EDIT_ACCOUNT),\n targetId: z.string(),\n data: zEditAccountRequestData,\n }),\n [RequestType.ACTIVATE_TRADELINK_ACCOUNT]: z.object({\n type: z.literal(RequestType.ACTIVATE_TRADELINK_ACCOUNT),\n targetId: z.string(),\n data: zActivateAccountRequestData,\n }),\n [RequestType.EDIT_TOKEN_RULE]: z.object({\n type: z.literal(RequestType.EDIT_TOKEN_RULE),\n targetId: z.string(),\n data: zEditTokenRuleRequestData,\n }),\n // Groups\n [RequestType.CREATE_GROUP]: z.object({\n type: z.literal(RequestType.CREATE_GROUP),\n data: zCreateGroupRequestData,\n }),\n [RequestType.EDIT_GROUP]: z.object({\n type: z.literal(RequestType.EDIT_GROUP),\n targetId: z.string(),\n data: zEditGroupRequestData,\n }),\n [RequestType.REVOKE_GROUP]: z.object({\n type: z.literal(RequestType.REVOKE_GROUP),\n data: z.object({}),\n }),\n // Whitelists\n [RequestType.CREATE_WHITELIST]: z.object({\n type: z.literal(RequestType.CREATE_WHITELIST),\n data: zCreateWhitelistRequestData,\n }),\n [RequestType.EDIT_WHITELIST]: z.object({\n type: z.literal(RequestType.EDIT_WHITELIST),\n targetId: z.string(),\n data: zEditWhitelistRequestData,\n }),\n // Entities\n [RequestType.CREATE_ENTITY]: z.object({\n type: z.literal(RequestType.CREATE_ENTITY),\n data: zCreateEntityRequestData,\n }),\n [RequestType.EDIT_ENTITY]: z.object({\n type: z.literal(RequestType.EDIT_ENTITY),\n data: zEditEntityRequestData,\n }),\n [RequestType.REVOKE_ENTITY]: z.object({\n type: z.literal(RequestType.REVOKE_ENTITY),\n data: z.object({}),\n }),\n // Users\n [RequestType.CREATE_PSD_USER]: z.object({\n type: z.literal(RequestType.CREATE_PSD_USER),\n data: zCreatePsdUserRequestData,\n }),\n [RequestType.CREATE_API_USER]: z.object({\n type: z.literal(RequestType.CREATE_API_USER),\n data: zCreateApiUserRequestData,\n }),\n [RequestType.CREATE_API_USER_ACCESS]: z.object({\n type: z.literal(RequestType.CREATE_API_USER_ACCESS),\n data: zCreateApiUserAccessRequestData,\n }),\n [RequestType.REVOKE_USER]: z.object({\n type: z.literal(RequestType.REVOKE_USER),\n data: z.object({}),\n }),\n // Admin gov rules\n [RequestType.CREATE_WORKSPACE_RULE]: z.object({\n type: z.literal(RequestType.CREATE_WORKSPACE_RULE),\n data: zWorkspaceRuleRequestData,\n }),\n [RequestType.EDIT_WORKSPACE_RULE]: z.object({\n type: z.literal(RequestType.EDIT_WORKSPACE_RULE),\n data: zWorkspaceRuleRequestData,\n }),\n // SCI configs\n [RequestType.CREATE_SCICONFIG]: z.object({\n type: z.literal(RequestType.CREATE_SCICONFIG),\n data: zCreateSciConfigRequestData,\n }),\n [RequestType.EDIT_SCICONFIG]: z.object({\n type: z.literal(RequestType.EDIT_SCICONFIG),\n data: zEditSciConfigRequestData,\n }),\n // API keys\n [RequestType.CREATE_API_KEY]: z.object({\n type: z.literal(RequestType.CREATE_API_KEY),\n data: zCreateApiKeyRequestData,\n }),\n [RequestType.EDIT_API_KEY]: z.object({\n type: z.literal(RequestType.EDIT_API_KEY),\n data: zEditApiKeyRequestData,\n }),\n [RequestType.REVOKE_API_KEY]: z.object({\n type: z.literal(RequestType.REVOKE_API_KEY),\n data: z.object({}),\n }),\n // Policies\n [RequestType.CREATE_POLICY]: z.object({\n type: z.literal(RequestType.CREATE_POLICY),\n data: zCreatePublicPolicyRequestData,\n }),\n [RequestType.EDIT_POLICY]: z.object({\n type: z.literal(RequestType.EDIT_POLICY),\n targetId: z.string(),\n data: zEditPublicPolicyRequestData,\n }),\n // Tradelink\n [RequestType.CREATE_TRADELINK_CUSTODIAN]: z.object({\n type: z.literal(RequestType.CREATE_TRADELINK_CUSTODIAN),\n data: zCustodianRequestData,\n }),\n [RequestType.EDIT_TRADELINK_CUSTODIAN]: z.object({\n type: z.literal(RequestType.EDIT_TRADELINK_CUSTODIAN),\n targetId: z.string(),\n data: zCustodianRequestData,\n }),\n [RequestType.CREATE_TRADELINK_EXCHANGE]: z.object({\n type: z.literal(RequestType.CREATE_TRADELINK_EXCHANGE),\n data: zTradelinkEntityRequestData,\n }),\n [RequestType.EDIT_TRADELINK_EXCHANGE]: z.object({\n type: z.literal(RequestType.EDIT_TRADELINK_EXCHANGE),\n targetId: z.string(),\n data: zTradelinkEntityRequestData,\n }),\n [RequestType.CREATE_TRADELINK_ASSET_MANAGER]: z.object({\n type: z.literal(RequestType.CREATE_TRADELINK_ASSET_MANAGER),\n data: zTradelinkEntityRequestData,\n }),\n [RequestType.EDIT_TRADELINK_ASSET_MANAGER]: z.object({\n type: z.literal(RequestType.EDIT_TRADELINK_ASSET_MANAGER),\n targetId: z.string(),\n data: zTradelinkEntityRequestData,\n }),\n [RequestType.ADJUST_PLEDGE]: z.object({\n type: z.literal(RequestType.ADJUST_PLEDGE),\n data: zAdjustPledgeRequestData,\n }),\n [RequestType.TRADELINK_REPLEDGE]: z.object({\n type: z.literal(RequestType.TRADELINK_REPLEDGE),\n data: zRepledgeRequestData,\n }),\n [RequestType.CREATE_SETTLEMENT]: z.object({\n type: z.literal(RequestType.CREATE_SETTLEMENT),\n data: zCreateSettlementRequestData,\n meta: z\n .object({\n hash: z.string().nullable(),\n })\n .optional()\n .nullable(),\n }),\n [RequestType.FORCE_UNPLEDGE]: z.object({\n type: z.literal(RequestType.FORCE_UNPLEDGE),\n data: zForceUnpledgeRequestData,\n }),\n [RequestType.TRADELINK_WITHDRAW]: z.object({\n type: z.literal(RequestType.TRADELINK_WITHDRAW),\n data: zTradelinkWithdrawRequestData,\n meta: z\n .object({\n hash: z.string().nullable(),\n })\n .optional()\n .nullable(),\n }),\n [RequestType.TRADELINK_ARBITRATE]: z.object({\n type: z.literal(RequestType.TRADELINK_ARBITRATE),\n data: zTradelinkArbitrationRequestData,\n meta: z\n .object({\n hash: z.string().nullable(),\n })\n .optional()\n .nullable(),\n }),\n} as const satisfies Record<RequestType, unknown>;\n","import { RequestReviewStatus, RequestState, RequestType } from \"@prisma/client\";\nimport z from \"zod\";\n\nimport { zCreateAccountUserInputData } from \"@/accounts\";\nimport { zUserChallenge } from \"@/hsm\";\nimport { zSignMessageUserInputData } from \"@/transactions\";\nimport { zNote } from \"@/types\";\nimport { ensureNonEmptyArray } from \"@/utils\";\nimport { zRequestReviewSteps } from \"@/workflows\";\n\nimport { zVaultRequestMixinsByType } from \"./request-data\";\n\nconst zRequestReviewResponse = z.object({\n // Note: Do NOT include `quorum` as it is already available in the request's `reviewSteps` field.\n stepIndex: z.number().int().describe(\"Index of the governance step in the request workflow\"),\n userId: z.string().describe(\"Reviewer id\"),\n status: z.nativeEnum(RequestReviewStatus).describe(\"Review status\"),\n createdAt: z.coerce.date().describe(\"Created date\"),\n updatedAt: z.coerce.date().describe(\"Updated date\"),\n});\n\nconst zVaultRequestCommonMixin = z.object({\n id: z.string().describe(\"Request unique identifier\"),\n legacyId: z.number().describe(\"Legacy internal unique identifier (for retro-compatibility)\"),\n state: z.nativeEnum(RequestState).describe(\"Request state\"),\n reviewSteps: zRequestReviewSteps.describe(\"Request review steps\"),\n currentStepIndex: z.number().int().min(0).describe(\"Index of the current approval step\"),\n expiresAt: z.coerce.date().describe(\"Request expiration date\"),\n targetId: z.string().nullable().describe(\"Optional ID of the target object\"),\n note: zNote.nullable().describe(\"Optional request note\"),\n reviews: z.array(zRequestReviewResponse).describe(\"Requests reviews\"),\n // `type` and `data` are correlated -- See `zVaultRequestMixinsByType`\n createdAt: z.coerce.date().describe(\"Creation timestamp\"),\n updatedAt: z.coerce.date().describe(\"Last modification timestamp\"),\n createdById: z.string().describe(\"ID of the user who created the request\"),\n // `inflight` is fetched from ONGOING RequestSaga\n inflight: z\n .object({\n lastError: z.string().describe(\"Error message from the last failure\"),\n numFailed: z.number().int().describe(\"Number of failures so far\"),\n retryAfter: z.coerce.date().describe(\"Date after which next retry is scheduled\"),\n })\n .optional()\n .describe(\"Extra information if the request is currently being processed\"),\n});\n\n/**\n * Maps from request type to request creation input schema.\n *\n * Most of the time, the user input data shape for request creation is the same as `request.data`.\n * But there are some exceptions. In such case, we redefine the shape for input data.\n */\nconst allowedRequestCreationInputByType = {\n [RequestType.UPDATE_QUORUM]: zVaultRequestMixinsByType[RequestType.UPDATE_QUORUM],\n [RequestType.CREATE_PSD_USER]: zVaultRequestMixinsByType[RequestType.CREATE_PSD_USER],\n [RequestType.CREATE_API_USER]: zVaultRequestMixinsByType[RequestType.CREATE_API_USER],\n [RequestType.CREATE_GROUP]: zVaultRequestMixinsByType[RequestType.CREATE_GROUP],\n [RequestType.EDIT_GROUP]: zVaultRequestMixinsByType[RequestType.EDIT_GROUP],\n [RequestType.CREATE_WHITELIST]: zVaultRequestMixinsByType[RequestType.CREATE_WHITELIST],\n [RequestType.EDIT_WHITELIST]: zVaultRequestMixinsByType[RequestType.EDIT_WHITELIST],\n [RequestType.CREATE_TRANSACTION]: zVaultRequestMixinsByType[RequestType.CREATE_TRANSACTION],\n [RequestType.SIGN_MESSAGE]: z.object({\n type: z.literal(RequestType.SIGN_MESSAGE),\n data: zSignMessageUserInputData,\n }),\n [RequestType.CREATE_POLICY]: zVaultRequestMixinsByType[RequestType.CREATE_POLICY],\n [RequestType.EDIT_POLICY]: zVaultRequestMixinsByType[RequestType.EDIT_POLICY],\n [RequestType.CREATE_ACCOUNT]: z.object({\n type: z.literal(RequestType.CREATE_ACCOUNT),\n data: zCreateAccountUserInputData,\n }),\n [RequestType.EDIT_ACCOUNT]: zVaultRequestMixinsByType[RequestType.EDIT_ACCOUNT],\n [RequestType.ACTIVATE_TRADELINK_ACCOUNT]:\n zVaultRequestMixinsByType[RequestType.ACTIVATE_TRADELINK_ACCOUNT],\n [RequestType.CREATE_TRADELINK_CUSTODIAN]:\n zVaultRequestMixinsByType[RequestType.CREATE_TRADELINK_CUSTODIAN],\n [RequestType.EDIT_TRADELINK_CUSTODIAN]:\n zVaultRequestMixinsByType[RequestType.EDIT_TRADELINK_CUSTODIAN],\n [RequestType.CREATE_TRADELINK_EXCHANGE]:\n zVaultRequestMixinsByType[RequestType.CREATE_TRADELINK_EXCHANGE],\n [RequestType.EDIT_TRADELINK_EXCHANGE]:\n zVaultRequestMixinsByType[RequestType.EDIT_TRADELINK_EXCHANGE],\n [RequestType.CREATE_TRADELINK_ASSET_MANAGER]:\n zVaultRequestMixinsByType[RequestType.CREATE_TRADELINK_ASSET_MANAGER],\n [RequestType.EDIT_TRADELINK_ASSET_MANAGER]:\n zVaultRequestMixinsByType[RequestType.EDIT_TRADELINK_ASSET_MANAGER],\n [RequestType.ADJUST_PLEDGE]: zVaultRequestMixinsByType[RequestType.ADJUST_PLEDGE],\n [RequestType.TRADELINK_REPLEDGE]: zVaultRequestMixinsByType[RequestType.TRADELINK_REPLEDGE],\n [RequestType.FORCE_UNPLEDGE]: zVaultRequestMixinsByType[RequestType.FORCE_UNPLEDGE],\n [RequestType.CREATE_SETTLEMENT]: zVaultRequestMixinsByType[RequestType.CREATE_SETTLEMENT],\n [RequestType.TRADELINK_WITHDRAW]: zVaultRequestMixinsByType[RequestType.TRADELINK_WITHDRAW],\n [RequestType.TRADELINK_ARBITRATE]: zVaultRequestMixinsByType[RequestType.TRADELINK_ARBITRATE],\n};\n\nconst zRequestCreationInputCommonMixin = z.object({\n note: zNote.optional().describe(\"Optional request note\"),\n});\n\n// To generate the OpenAPI schema with trpc-openapi, we need the input to be a zod object.\n// See: https://github.com/jlalmes/trpc-openapi?tab=readme-ov-file#requirements\nexport const zVaultRequestCreateInput = z.object({\n request: z.discriminatedUnion(\n \"type\",\n ensureNonEmptyArray(\n Object.values(allowedRequestCreationInputByType).map((_) => {\n // properly extract request type for documentation generation\n const requestType = _.shape.type._def.value;\n return _.merge(zRequestCreationInputCommonMixin).describe(`${requestType} request data`);\n }),\n ),\n ),\n});\n\nexport type VaultRequestCreateInput = z.infer<typeof zVaultRequestCreateInput>;\n\nexport const zVaultRequestResponse = z.discriminatedUnion(\n \"type\",\n ensureNonEmptyArray(\n Object.values(zVaultRequestMixinsByType).map((_) => {\n // properly extract request type for documentation generation\n const requestType = _.shape.type._def.value;\n return _.merge(zVaultRequestCommonMixin).describe(`${requestType} request`);\n }),\n ),\n);\n\nexport type VaultRequestResponse = z.infer<typeof zVaultRequestResponse>;\n\nexport const zRequestSortBy = z\n .enum([\n \"state\",\n \"expiresAt\",\n \"createdAt\",\n \"updatedAt\",\n ] as const satisfies (keyof VaultRequestResponse)[])\n .default(\"createdAt\");\n\nexport type RequestSortBy = z.infer<typeof zRequestSortBy>;\n\nexport const zUserChallengeResponse = z.object({\n pubKey: z.string().describe(\"Public key of the current user\"),\n challenge: zUserChallenge.describe(\"Challenge data to sign with the user's private key\"),\n});\n\nexport type UserChallengeResponse = z.infer<typeof zUserChallengeResponse>;\n","import type { VaultRequest } from \"@prisma/client\";\nimport { RequestState, RequestType } from \"@prisma/client\";\n\n/** Return whether a request with the given type and state should have a non-null `targetHsmId`. */\nexport const shouldHaveTargetHsmId = (\n request: Pick<VaultRequest, \"type\" | \"state\">,\n): boolean | undefined => {\n switch (request.type) {\n case RequestType.CREATE_ENTITY:\n case RequestType.EDIT_ENTITY:\n case RequestType.REVOKE_ENTITY:\n case RequestType.CREATE_SCICONFIG:\n case RequestType.EDIT_SCICONFIG:\n case RequestType.CREATE_API_KEY:\n case RequestType.EDIT_API_KEY:\n case RequestType.REVOKE_API_KEY:\n case RequestType.CREATE_WORKSPACE_RULE:\n case RequestType.EDIT_WORKSPACE_RULE:\n case RequestType.UPDATE_QUORUM:\n return false;\n case RequestType.CREATE_PSD_USER:\n case RequestType.CREATE_API_USER:\n case RequestType.CREATE_API_USER_ACCESS: // targeting / editing an existing `User`\n case RequestType.REVOKE_USER:\n case RequestType.CREATE_TRANSACTION:\n case RequestType.SIGN_MESSAGE:\n case RequestType.SIGN_DIGESTS:\n case RequestType.CREATE_ACCOUNT:\n case RequestType.EDIT_ACCOUNT:\n case RequestType.ACTIVATE_TRADELINK_ACCOUNT:\n case RequestType.CREATE_GROUP:\n case RequestType.EDIT_GROUP:\n case RequestType.REVOKE_GROUP:\n case RequestType.CREATE_WHITELIST:\n case RequestType.EDIT_WHITELIST:\n case RequestType.CREATE_POLICY:\n case RequestType.EDIT_POLICY:\n case RequestType.CREATE_TRADELINK_CUSTODIAN:\n case RequestType.EDIT_TRADELINK_CUSTODIAN:\n case RequestType.CREATE_TRADELINK_EXCHANGE:\n case RequestType.EDIT_TRADELINK_EXCHANGE:\n case RequestType.CREATE_TRADELINK_ASSET_MANAGER:\n case RequestType.EDIT_TRADELINK_ASSET_MANAGER:\n return request.state !== RequestState.INITIAL;\n case RequestType.EDIT_TOKEN_RULE:\n return true;\n }\n};\n\n/** Return whether a request with the given type and state should have a non-null `targetId`. */\nexport const shouldHaveTargetId = (request: Pick<VaultRequest, \"type\" | \"state\">): boolean => {\n switch (request.type) {\n case RequestType.CREATE_API_KEY:\n case RequestType.EDIT_API_KEY:\n case RequestType.REVOKE_API_KEY:\n // We don't wire read-only API keys for now on revault (and we may never will, as it is not\n // sure if we will synchronize those models and implement read-only API key auth)\n return false;\n case RequestType.CREATE_TRANSACTION:\n case RequestType.SIGN_MESSAGE:\n case RequestType.SIGN_DIGESTS:\n // TODO: We don't know how to wire, so just return the request unchanged.\n return false;\n case RequestType.UPDATE_QUORUM:\n case RequestType.CREATE_PSD_USER:\n case RequestType.CREATE_API_USER:\n case RequestType.CREATE_WORKSPACE_RULE:\n case RequestType.CREATE_ACCOUNT:\n case RequestType.CREATE_GROUP:\n case RequestType.CREATE_WHITELIST:\n case RequestType.CREATE_ENTITY:\n case RequestType.CREATE_SCICONFIG:\n case RequestType.CREATE_POLICY:\n case RequestType.CREATE_TRADELINK_CUSTODIAN:\n case RequestType.CREATE_TRADELINK_EXCHANGE:\n case RequestType.CREATE_TRADELINK_ASSET_MANAGER:\n // The request is to create the target object. The target object will exist only when\n // the request is executed.\n return request.state === RequestState.EXECUTED;\n case RequestType.EDIT_WORKSPACE_RULE:\n case RequestType.EDIT_ACCOUNT:\n case RequestType.ACTIVATE_TRADELINK_ACCOUNT:\n case RequestType.EDIT_TOKEN_RULE: // EDIT_TOKEN_RULE targetId is the parent account which must always exist, even when creating new token rule.\n case RequestType.EDIT_GROUP:\n case RequestType.REVOKE_GROUP:\n case RequestType.EDIT_WHITELIST:\n case RequestType.EDIT_ENTITY:\n case RequestType.REVOKE_ENTITY:\n case RequestType.CREATE_API_USER_ACCESS:\n case RequestType.REVOKE_USER:\n case RequestType.EDIT_SCICONFIG:\n case RequestType.EDIT_POLICY:\n case RequestType.EDIT_TRADELINK_CUSTODIAN:\n case RequestType.EDIT_TRADELINK_EXCHANGE:\n case RequestType.EDIT_TRADELINK_ASSET_MANAGER:\n case RequestType.ADJUST_PLEDGE:\n case RequestType.TRADELINK_REPLEDGE:\n case RequestType.CREATE_SETTLEMENT:\n case RequestType.FORCE_UNPLEDGE:\n case RequestType.TRADELINK_WITHDRAW:\n case RequestType.TRADELINK_ARBITRATE:\n return true;\n }\n};\n","import type { RequestSagaWithFailures } from \"@/workflows\";\n\nimport { type VaultRequestResponse, zVaultRequestResponse } from \"../app-types\";\nimport { type VaultRequestWithRelatedObjects } from \"../db-types\";\n\nexport { GateRequestService } from \"./gate-service\";\n\nexport function serializeVaultRequest(\n request: VaultRequestWithRelatedObjects,\n): VaultRequestResponse {\n const serialized = {\n ...request,\n legacyId: request.gateId,\n } satisfies Omit<VaultRequestResponse, \"type\" | \"data\" | \"reviewSteps\" | \"note\">;\n /* v8 ignore start */\n switch (request.type) {\n case \"CREATE_TRANSACTION\":\n case \"TRADELINK_WITHDRAW\":\n case \"TRADELINK_ARBITRATE\":\n case \"CREATE_SETTLEMENT\":\n Object.assign(serialized, {\n meta: {\n hash: request.transactionMeta?.hash ?? null,\n },\n });\n break;\n default:\n break;\n }\n /* v8 ignore stop */\n return zVaultRequestResponse.parse(serialized);\n}\n\nexport function serializeVaultRequestWithOngoingSaga(\n request: VaultRequestWithRelatedObjects,\n ongoingSaga: RequestSagaWithFailures | null,\n): VaultRequestResponse {\n let inflightField;\n if (ongoingSaga !== null) {\n const { retryAfter, failures } = ongoingSaga;\n const lastError = failures[failures.length - 1]!.message;\n const numFailed = failures.length;\n inflightField = {\n inflight: { lastError, numFailed, retryAfter },\n };\n } else {\n inflightField = {};\n }\n return {\n ...serializeVaultRequest(request),\n ...inflightField,\n };\n}\n","import { faker } from \"@faker-js/faker\";\nimport { ChallengeType } from \"@prisma/client\";\nimport { times } from \"lodash\";\n\nimport type { ApiChallenge, HsmCertificate, HsmChallengeSteps, PsdChallenge } from \"@/hsm\";\nimport { base64urlEncode } from \"@/utils\";\nimport type { Proof } from \"@/workflows\";\n\nexport const fakeHexString = (length: number, casing: \"lower\" | \"upper\" = \"upper\"): string =>\n faker.string.hexadecimal({ prefix: \"\", casing, length });\n\nexport const fakePubKey = (): string => fakeHexString(130);\n\nexport const fakeBlob = (length?: number): string => fakeHexString(length ?? 100);\n\nexport const fakeDeviceUserId = (): string =>\n faker.string.hexadecimal({ prefix: \"\", casing: \"upper\", length: 16 });\n\n/**\n * Generate a fake integer ID for postgres. For postgres, max value of an integer is 2147483647.\n * See: https://www.postgresql.org/docs/current/datatype-numeric.html\n */\nexport const fakeIntegerId = (): number => faker.number.int({ min: 1, max: 2000000000 });\n\n/** Generate a fake Gate ID, which is an integer primary key in postgres. */\nexport const fakeGateId = fakeIntegerId;\n\nexport const fakeBase64String = (length?: number): string => btoa(faker.string.sample(length));\n\nexport const fakePsdSignature = (): string => fakeBase64String(100);\n\nexport const fakeJws = (): string =>\n times(3, () => faker.string.hexadecimal({ prefix: \"\", length: 100 })).join(\".\");\n\nexport const fakeHsmObjectId = (): string => faker.string.uuid();\n\nexport const fakeHsmCertificate = (): HsmCertificate => ({\n codeHash: fakeBase64String(10),\n attestationPub: fakeBase64String(20),\n certificate: fakeBase64String(20),\n signature: fakeBase64String(20),\n});\n\nexport const fakePsdChallenge = (): PsdChallenge => ({\n challengeType: \"PSD\",\n wActions: [fakeBase64String(50), fakeBase64String(50), fakeBase64String(50)],\n handshake: fakeBase64String(100),\n handshakeAttestation: fakeHsmCertificate(),\n partitionId: fakeBase64String(20),\n});\n\nexport const fakeApiChallenge = (): ApiChallenge => ({\n challengeType: \"API\",\n payload: {\n approve: base64urlEncode({ randomHex: fakeHexString(20), action: \"approve\" }),\n reject: base64urlEncode({ randomHex: fakeHexString(20), action: \"reject\" }),\n },\n});\n\nexport const fakePsdProof = (): Proof => ({\n signature: fakeBase64String(100),\n challengeType: ChallengeType.PSD,\n});\n\n/**\n * HSM challenges are an array of record indexed by user's public key\n */\nexport const fakeHsmChallenges = (type: ChallengeType, pubKeys?: string[]): HsmChallengeSteps => {\n const challengeKeys = pubKeys ?? times(3, () => fakePubKey());\n const fakeChallengeFunctions = {\n [ChallengeType.PSD]: fakePsdChallenge,\n [ChallengeType.API]: fakeApiChallenge,\n } as const;\n const fakeChallenge = fakeChallengeFunctions[type];\n return [Object.fromEntries(challengeKeys.map((pubKey) => [pubKey, fakeChallenge()]))];\n};\n\nexport const fakeWorkspaceName = (): string => faker.string.alpha({ length: 8, casing: \"lower\" });\n\n// Compartment id is stored as a integer in the prisma schema, which are signed 32bits on postgres\n// Hence, pick a number between 0 and 2^31 - 1 (0x7fffffff)\nexport const fakeCompartmentId = (): number => faker.number.int({ max: 0x7fffffff });\n\nexport const fakeRootCaHex = (): string => fakeHexString(260);\nexport const fakeRootCaBase64 = (): string =>\n Buffer.from(fakeRootCaHex(), \"hex\").toString(\"base64\");\n","import { faker } from \"@faker-js/faker\";\n\nimport type { GateType } from \"@/sync-utils\";\nimport { buildGateSyncId } from \"@/sync-utils\";\n\nexport type MaybeFromGate = {\n workspaceName: string;\n gateType: GateType | null;\n gateId: number;\n syncId?: string; // If provided, do not overwrite.\n};\n\nexport const injectSyncId = <T extends MaybeFromGate>(obj: T): T & { syncId: string } => {\n let { syncId } = obj;\n if (syncId === undefined) {\n if (obj.gateType !== null && obj.gateId !== 0) {\n syncId = buildGateSyncId(obj.workspaceName, obj.gateType, obj.gateId);\n } else if (obj.gateType === null && obj.gateId === 0) {\n syncId = faker.string.uuid();\n } else {\n throw new Error(`Invalid gateType and gateId: ${obj.gateType}, ${obj.gateId}`);\n }\n }\n return { ...obj, syncId };\n};\n","import { faker } from \"@faker-js/faker\";\nimport type { Account, ClassicGovernanceMixin, TradelinkGovernanceMixin } from \"@prisma/client\";\nimport {\n AccountGovernanceType,\n AccountType,\n ActivationStatus,\n GateAccountType,\n} from \"@prisma/client\";\n\nimport { type AccountWithGovernanceMixins } from \"@/accounts\";\n\nimport { fakeGateId, fakeHsmObjectId, fakeWorkspaceName } from \"../faker-utils\";\nimport { injectSyncId } from \"./sync-id-utils\";\n\nconst genAssetFieldsForType = (\n type: AccountType,\n): Pick<\n Account,\n | \"type\"\n | \"currency\"\n | \"derivationPath\"\n | \"address\"\n | \"contractAddress\"\n | \"xpub\"\n | \"hsmXpub\"\n | \"hsmChainCode\"\n> => {\n const hsmXpub = faker.string.hexadecimal({ prefix: \"\", casing: \"upper\", length: 66 });\n const hsmChainCode = faker.string.hexadecimal({ prefix: \"\", casing: \"upper\", length: 64 });\n switch (type) {\n case \"BITCOIN_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"bitcoin\", \"bitcoin_testnet\"]),\n derivationPath: \"84'/0'/0'\",\n address: null,\n contractAddress: null,\n xpub: faker.string.hexadecimal({ prefix: \"\", length: 120 }),\n hsmXpub,\n hsmChainCode,\n };\n case \"ETHEREUM_LIKE\": // fall-through...\n case \"ERC20_LIKE\":\n case \"BEP20_LIKE\":\n return {\n type,\n currency:\n type === \"BEP20_LIKE\"\n ? \"bsc\"\n : faker.helpers.arrayElement([\"ethereum\", \"ethereum_goerli\"]),\n derivationPath: \"44'/60'/0'\",\n address: faker.finance.ethereumAddress(),\n contractAddress: type === \"ETHEREUM_LIKE\" ? null : faker.finance.ethereumAddress(),\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"CARDANO_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"cardano\"]),\n derivationPath: \"1852'/1815'/0'\",\n address: `addr${faker.string.alphanumeric({ length: 100, casing: \"lower\" })}`,\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"SOLANA_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"solana\"]),\n derivationPath: \"44'/501'/0'\",\n address: faker.string.alphanumeric({ length: 44, casing: \"lower\" }),\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode: null,\n };\n case \"TEZOS_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"tezos\"]),\n derivationPath: \"44'/1729'/0'\",\n address: `tz${faker.string.alphanumeric({ length: 34, casing: \"mixed\" })}`,\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"STELLAR_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"stellar\"]),\n derivationPath: \"44'/148'/0'\",\n address: faker.string.alphanumeric({ length: 56, casing: \"upper\" }),\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"RIPPLE_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"ripple\"]),\n derivationPath: \"44'/144'/0'\",\n address: faker.string.alphanumeric({ length: 34, casing: \"mixed\" }),\n contractAddress: null,\n xpub: `xpub${faker.string.alphanumeric({ length: 107, casing: \"mixed\" })}`,\n hsmXpub,\n hsmChainCode,\n };\n case \"POLKADOT_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"polkadot\"]),\n derivationPath: \"44'/354'/0'\",\n address: faker.string.alphanumeric({ length: 48, casing: \"mixed\" }),\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode: null,\n };\n case \"TRC20_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"tron\"]),\n derivationPath: \"44'/195'/0'\",\n address: faker.string.alphanumeric({ length: 34, casing: \"mixed\" }),\n contractAddress: faker.string.alphanumeric({ length: 34, casing: \"mixed\" }),\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"SUI_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"sui\"]),\n derivationPath: \"44'/784'/0'\",\n address: faker.string.alphanumeric({ length: 34, casing: \"mixed\" }),\n contractAddress: faker.string.alphanumeric({ length: 34, casing: \"mixed\" }),\n xpub: null,\n hsmXpub,\n hsmChainCode: null,\n };\n case \"GENERIC_LIKE\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"cosmos\"]),\n derivationPath: \"44'/118'/0'\",\n address: faker.string.alphanumeric({ length: 34, casing: \"mixed\" }),\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n case \"RAW_SIGNING\":\n return {\n type,\n currency: faker.helpers.arrayElement([\"ethereum\", \"bitcoin\"]),\n derivationPath: \"44'/118'/0'\",\n address: null,\n contractAddress: null,\n xpub: null,\n hsmXpub,\n hsmChainCode,\n };\n }\n};\n\nconst genGovernanceFieldsForType = (\n governanceType: AccountGovernanceType,\n {\n accountId,\n policyId,\n assetManagerId,\n }: { accountId: string; policyId?: string; assetManagerId?: string },\n):\n | {\n governanceType: typeof AccountGovernanceType.CLASSIC;\n classicGovernanceMixin: ClassicGovernanceMixin;\n tradelinkGovernanceMixin: null;\n }\n | {\n governanceType: typeof AccountGovernanceType.TRADELINK;\n classicGovernanceMixin: null;\n tradelinkGovernanceMixin: TradelinkGovernanceMixin;\n }\n | {\n governanceType: typeof AccountGovernanceType.RAW_SIGNING;\n classicGovernanceMixin: ClassicGovernanceMixin;\n tradelinkGovernanceMixin: null;\n } => {\n switch (governanceType) {\n case AccountGovernanceType.CLASSIC:\n case AccountGovernanceType.RAW_SIGNING:\n return {\n governanceType,\n classicGovernanceMixin: {\n id: faker.number.int(),\n policyId: policyId ?? faker.string.uuid(),\n accountId: accountId,\n },\n tradelinkGovernanceMixin: null,\n };\n case AccountGovernanceType.TRADELINK:\n return {\n governanceType,\n classicGovernanceMixin: null,\n tradelinkGovernanceMixin: {\n id: faker.number.int(),\n assetManagerId: assetManagerId ?? faker.string.uuid(),\n accountId: accountId,\n exchangeConfigs: [],\n status: ActivationStatus.ACTIVE,\n },\n };\n }\n};\n\nexport const genAccount = (\n opts?: Partial<Account> & { policyId?: string; assetManagerId?: string },\n): AccountWithGovernanceMixins => {\n const { policyId, assetManagerId, ...rest } = opts ?? {};\n const commonFields = {\n id: faker.string.uuid(),\n workspaceName: fakeWorkspaceName(),\n name: faker.finance.accountName(),\n hsmId: fakeHsmObjectId(),\n status: ActivationStatus.ACTIVE,\n index: faker.number.int({ min: 0, max: 10 }),\n gateId: fakeGateId(),\n gateType: GateAccountType.Account,\n createdAt: faker.date.past(),\n updatedAt: faker.date.past(),\n };\n const assetFields = genAssetFieldsForType(\n opts?.type ?? faker.helpers.arrayElement(Object.values(AccountType)),\n );\n const governanceFields = genGovernanceFieldsForType(\n opts?.governanceType ?? faker.helpers.arrayElement(Object.values(AccountGovernanceType)),\n { accountId: commonFields.id, policyId, assetManagerId },\n );\n return injectSyncId({\n ...commonFields,\n ...governanceFields,\n ...assetFields,\n ...rest,\n });\n};\n","import { faker } from \"@faker-js/faker\";\nimport type { VaultRequest, VaultRequestReview } from \"@prisma/client\";\nimport { ChallengeType, RequestReviewStatus, RequestState, RequestType } from \"@prisma/client\";\nimport { times } from \"lodash\";\n\nimport type {\n CreateAccountRequestData,\n CreateSciConfigRequestData,\n EditAccountRequestData,\n EditSciConfigRequestData,\n EditTokenRuleRequestData,\n} from \"@/accounts\";\nimport type { CreateApiKeyRequestData, EditApiKeyRequestData } from \"@/api-keys/api-key-requests\";\nimport type { CreateEntityRequestData, EditEntityRequestData } from \"@/entities/entity-requests\";\nimport type { UpdateQuorumRequestData } from \"@/governance\";\nimport type { WorkspaceRuleRequestData } from \"@/governance/workspace-rule-requests\";\nimport type { CreateGroupRequestData, EditGroupRequestData } from \"@/groups\";\nimport type { UserChallenge } from \"@/hsm\";\nimport type { CreatePublicPolicyRequestData, EditPublicPolicyRequestData } from \"@/policies\";\nimport { shouldHaveTargetHsmId, shouldHaveTargetId } from \"@/requests/utils\";\nimport type {\n AdjustPledgeRequestData,\n CreateSettlementRequestData,\n ForceUnpledgeRequestData,\n RepledgeRequestData,\n TradelinkArbitrationRequestData,\n TradelinkWithdrawRequestData,\n} from \"@/tradelink\";\nimport type {\n CreateTransactionRequestData,\n SignDigestsRequestData,\n SignMessageRequestData,\n} from \"@/transactions\";\nimport type {\n CreateApiUserAccessRequestData,\n CreateApiUserRequestData,\n CreatePsdUserRequestData,\n} from \"@/users\";\nimport type {\n CreateWhitelistRequestData,\n EditWhitelistRequestData,\n} from \"@/whitelists/whitelist-requests\";\nimport type { RequestReviewStep } from \"@/workflows\";\n\nimport {\n fakeGateId,\n fakeHsmObjectId,\n fakeJws,\n fakePsdChallenge,\n fakePsdSignature,\n fakePubKey,\n fakeWorkspaceName,\n} from \"../../faker-utils\";\nimport { injectSyncId } from \"../sync-id-utils\";\nimport {\n genCreateAccountData,\n genEditAccountData,\n genEditTokenRuleData,\n} from \"./request-for-account\";\nimport { genCreateApiKeyData, genEditApiKeyData } from \"./request-for-api-key\";\nimport { genSignDigestsData } from \"./request-for-digests-signature\";\nimport { genCreateEntityData, genEditEntityData } from \"./request-for-entity\";\nimport { genCreateGroupData, genEditGroupData } from \"./request-for-group\";\nimport { genSignMessageData } from \"./request-for-message-signature\";\nimport { genCreatePolicyData, genEditPolicyData } from \"./request-for-policy\";\nimport { genCreateSciConfigData, genEditSciConfigData } from \"./request-for-sciconfig\";\nimport {\n genCreatePledgeIncrementData,\n genCreateSettlementData,\n genForceUnpledgeData,\n genRepledgeRequestData,\n genTradelinkArbitrationData,\n genTradelinkWithdrawData,\n} from \"./request-for-tradelink\";\nimport { genCreateTransactionData } from \"./request-for-transaction\";\nimport {\n genCreateApiUserAccessData,\n genCreateApiUserData,\n genCreatePsdUserData,\n} from \"./request-for-user\";\nimport { genCreateWhitelistData, genEditWhitelistData } from \"./request-for-whitelist\";\nimport { genWorkspaceRuleData } from \"./request-for-workspace-rule\";\n\nexport type RequestDataTypes = {\n // Workspace...\n [RequestType.UPDATE_QUORUM]: UpdateQuorumRequestData;\n // User...\n [RequestType.CREATE_PSD_USER]: CreatePsdUserRequestData;\n [RequestType.CREATE_API_USER]: CreateApiUserRequestData;\n [RequestType.CREATE_API_USER_ACCESS]: CreateApiUserAccessRequestData;\n [RequestType.REVOKE_USER]: Record<string, never>;\n // Admin gov rule...\n [RequestType.CREATE_WORKSPACE_RULE]: WorkspaceRuleRequestData;\n [RequestType.EDIT_WORKSPACE_RULE]: WorkspaceRuleRequestData;\n // Group...\n [RequestType.CREATE_GROUP]: CreateGroupRequestData;\n [RequestType.EDIT_GROUP]: EditGroupRequestData;\n [RequestType.REVOKE_GROUP]: Record<string, never>;\n // API key...\n [RequestType.CREATE_API_KEY]: CreateApiKeyRequestData;\n [RequestType.EDIT_API_KEY]: EditApiKeyRequestData;\n [RequestType.REVOKE_API_KEY]: Record<string, never>;\n // Whitelist...\n [RequestType.CREATE_WHITELIST]: CreateWhitelistRequestData;\n [RequestType.EDIT_WHITELIST]: EditWhitelistRequestData;\n // Entity...\n [RequestType.CREATE_ENTITY]: CreateEntityRequestData;\n [RequestType.EDIT_ENTITY]: EditEntityRequestData;\n [RequestType.REVOKE_ENTITY]: Record<string, never>;\n // Account...\n [RequestType.CREATE_ACCOUNT]: CreateAccountRequestData;\n [RequestType.EDIT_ACCOUNT]: EditAccountRequestData;\n [RequestType.EDIT_TOKEN_RULE]: EditTokenRuleRequestData;\n // Operator requests...\n [RequestType.CREATE_TRANSACTION]: CreateTransactionRequestData;\n [RequestType.SIGN_MESSAGE]: SignMessageRequestData;\n [RequestType.SIGN_DIGESTS]: SignDigestsRequestData;\n // SCI config ...\n [RequestType.CREATE_SCICONFIG]: CreateSciConfigRequestData;\n [RequestType.EDIT_SCICONFIG]: EditSciConfigRequestData;\n // Policy\n [RequestType.CREATE_POLICY]: CreatePublicPolicyRequestData;\n [RequestType.EDIT_POLICY]: EditPublicPolicyRequestData;\n // Tradelink...\n [RequestType.ADJUST_PLEDGE]: AdjustPledgeRequestData;\n [RequestType.TRADELINK_REPLEDGE]: RepledgeRequestData;\n [RequestType.CREATE_SETTLEMENT]: CreateSettlementRequestData;\n [RequestType.FORCE_UNPLEDGE]: ForceUnpledgeRequestData;\n [RequestType.TRADELINK_WITHDRAW]: TradelinkWithdrawRequestData;\n [RequestType.TRADELINK_ARBITRATE]: TradelinkArbitrationRequestData;\n};\n\n/**\n * A more strict subtype of `VaultRequest`: The `data` field should be a `Prisma.JsonValue`\n * (in this case, a `Prisma.JsonObject`) __AND__ also of type `D`.\n */\nexport type RequestWith<D> = VaultRequest & { data: D };\n\nexport const genRequestData = <T extends keyof RequestDataTypes>(\n type: T,\n opts?: Partial<RequestDataTypes[T]>,\n): RequestDataTypes[T] => {\n switch (type) {\n // Workspace...\n case RequestType.UPDATE_QUORUM:\n return { quorum: 3, ...opts } as RequestDataTypes[T];\n\n // User...\n case RequestType.CREATE_PSD_USER:\n return genCreatePsdUserData(opts) as RequestDataTypes[T];\n case RequestType.CREATE_API_USER:\n return genCreateApiUserData(opts) as RequestDataTypes[T];\n case RequestType.CREATE_API_USER_ACCESS:\n return genCreateApiUserAccessData(opts) as RequestDataTypes[T];\n case RequestType.REVOKE_USER:\n return {} as RequestDataTypes[T];\n\n // Admin gov rule...\n case RequestType.CREATE_WORKSPACE_RULE:\n return genWorkspaceRuleData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_WORKSPACE_RULE:\n return genWorkspaceRuleData(opts) as RequestDataTypes[T];\n\n // Group...\n case RequestType.CREATE_GROUP:\n return genCreateGroupData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_GROUP:\n return genEditGroupData(opts) as RequestDataTypes[T];\n case RequestType.REVOKE_GROUP:\n return {} as RequestDataTypes[T];\n\n // ApiKey...\n case RequestType.CREATE_API_KEY:\n return genCreateApiKeyData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_API_KEY:\n return genEditApiKeyData(opts) as RequestDataTypes[T];\n case RequestType.REVOKE_API_KEY:\n return {} as RequestDataTypes[T];\n\n // Whitelist...\n case RequestType.CREATE_WHITELIST:\n return genCreateWhitelistData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_WHITELIST:\n return genEditWhitelistData(opts) as RequestDataTypes[T];\n\n // Entity...\n case RequestType.CREATE_ENTITY:\n return genCreateEntityData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_ENTITY:\n return genEditEntityData(opts) as RequestDataTypes[T];\n case RequestType.REVOKE_ENTITY:\n return {} as RequestDataTypes[T];\n\n // Account...\n case RequestType.CREATE_ACCOUNT:\n return genCreateAccountData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_ACCOUNT:\n return genEditAccountData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_TOKEN_RULE:\n return genEditTokenRuleData(opts) as RequestDataTypes[T];\n\n // Operator requests...\n case RequestType.CREATE_TRANSACTION:\n return genCreateTransactionData(opts) as RequestDataTypes[T];\n case RequestType.SIGN_MESSAGE:\n return genSignMessageData(opts) as RequestDataTypes[T];\n case RequestType.SIGN_DIGESTS:\n return genSignDigestsData(opts) as RequestDataTypes[T];\n\n // SCI config...\n case RequestType.CREATE_SCICONFIG:\n return genCreateSciConfigData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_SCICONFIG:\n return genEditSciConfigData(opts) as RequestDataTypes[T];\n\n // Policy\n case RequestType.CREATE_POLICY:\n return genCreatePolicyData(opts) as RequestDataTypes[T];\n case RequestType.EDIT_POLICY:\n return genEditPolicyData(opts) as RequestDataTypes[T];\n\n // Tradelink...\n case RequestType.ADJUST_PLEDGE:\n return genCreatePledgeIncrementData(opts) as RequestDataTypes[T];\n case RequestType.CREATE_SETTLEMENT:\n return genCreateSettlementData(opts) as RequestDataTypes[T];\n case RequestType.FORCE_UNPLEDGE:\n return genForceUnpledgeData(opts) as RequestDataTypes[T];\n case RequestType.TRADELINK_WITHDRAW:\n return genTradelinkWithdrawData(opts) as RequestDataTypes[T];\n case RequestType.TRADELINK_REPLEDGE:\n return genRepledgeRequestData(opts) as RequestDataTypes[T];\n case RequestType.TRADELINK_ARBITRATE:\n return genTradelinkArbitrationData(opts) as RequestDataTypes[T];\n\n default: {\n const unknownType: never = type;\n throw new Error(`Unknown request type: ${unknownType}`);\n }\n }\n};\n\nexport const genRequestReviewSteps = (numSteps?: number): RequestReviewStep[] =>\n times(numSteps ?? 1, () => ({ stageName: \"default\", quorum: 2 }));\n\nexport type VaultRequestOpts<T extends keyof RequestDataTypes> = {\n type: T;\n data: RequestDataTypes[T];\n} & Partial<Omit<VaultRequest, \"type\" | \"data\">>;\n\nexport const genVaultRequest = <T extends keyof RequestDataTypes>(\n opts: VaultRequestOpts<T>,\n): RequestWith<RequestDataTypes[T]> => {\n const { type, state = RequestState.PENDING_APPROVAL, data, ...custom } = opts;\n const targetHsmId = shouldHaveTargetHsmId({ type, state })\n ? type === RequestType.CREATE_PSD_USER\n ? fakePubKey()\n : fakeHsmObjectId()\n : null;\n const targetId = shouldHaveTargetId({ type, state }) ? faker.string.uuid() : null;\n return injectSyncId({\n id: faker.string.uuid(),\n workspaceName: fakeWorkspaceName(),\n type,\n state,\n reviewSteps: genRequestReviewSteps(),\n currentStepIndex: 0,\n expiresAt: faker.date.future(),\n targetHsmId,\n createdById: faker.string.uuid(),\n createdAt: faker.date.past(),\n updatedAt: faker.date.past(),\n note: null,\n managedData: null,\n data,\n targetId,\n gateTargetType: \"Whatsoever\",\n gateTargetId: 0,\n gateType: \"Request\",\n gateId: fakeGateId(),\n // Note: Custom properties will overwrite the default ones. It is still possible for caller\n // to overwrite `targetId`. Thus it is not guaranteed that these values will always be\n // consistent with `type` and `state`.\n ...custom,\n });\n};\n\nexport const genVaultRequestReview = (\n opts?: Partial<VaultRequestReview & { challenge: UserChallenge }>,\n): VaultRequestReview => {\n const status = opts?.status ?? RequestReviewStatus.PENDING;\n const challenge = opts?.challenge ?? fakePsdChallenge();\n const { challengeType } = challenge;\n let signature;\n if (status !== RequestReviewStatus.APPROVED) {\n signature = null;\n } else {\n switch (challengeType) {\n case ChallengeType.PSD:\n signature = fakePsdSignature();\n break;\n case ChallengeType.API:\n signature = fakeJws();\n break;\n }\n }\n return {\n id: faker.number.int(),\n requestId: faker.string.uuid(),\n stageName: \"default\", // assume the simple case where there is one single stage\n stepIndex: 0,\n userId: faker.string.uuid(),\n pubKey: fakePubKey(),\n challengeType,\n challenge,\n signature,\n status,\n createdAt: faker.date.past(),\n updatedAt: faker.date.past(),\n ...opts,\n };\n};\n","import { faker } from \"@faker-js/faker\";\nimport type { Account, VaultRequestReview } from \"@prisma/client\";\nimport { AccountType } from \"@prisma/client\";\n\nimport { type AccountStakingFields } from \"@/accounts/account-staking-fields\";\nimport { type AccountResponse, zAccountResponse } from \"@/accounts/app-types\";\nimport { serializeAccount } from \"@/accounts/app-utils\";\nimport { type VaultRequestResponse } from \"@/requests/app-types\";\nimport { serializeVaultRequest } from \"@/requests/app-utils\";\n\nimport { genAccount, genVaultRequest } from \"./models\";\nimport { type RequestDataTypes } from \"./models/requests/requests-and-reviews\";\n\nexport const genStakingFields = (account: Account): AccountStakingFields | null => {\n switch (account.type) {\n case AccountType.BEP20_LIKE:\n return null;\n case AccountType.BITCOIN_LIKE:\n return null;\n case AccountType.CARDANO_LIKE:\n return {\n type: \"CARDANO_LIKE\",\n staking: {\n staked: faker.number.int().toString(),\n },\n };\n case AccountType.ERC20_LIKE:\n return null;\n case AccountType.ETHEREUM_LIKE:\n return {\n type: \"ETHEREUM_LIKE\",\n staking: {\n totalStaking: faker.number.int().toString(),\n totalRewards: faker.number.int().toString(),\n availableRewards: faker.number.int().toString(),\n networkApy: faker.number.float({ min: 0, max: 1 }),\n },\n };\n case AccountType.GENERIC_LIKE:\n return null;\n case AccountType.RAW_SIGNING:\n return null;\n case AccountType.POLKADOT_LIKE:\n return {\n type: \"POLKADOT_LIKE\",\n staking: {\n info: {\n controllerAddress: \"<fake-controller-address>\",\n rewardsDestination: \"<fake-rewards-destination>\",\n proxies: [\"<fake-proxy>\"],\n legacyStaking: false,\n isNominator: false,\n },\n balances: {\n free: faker.number.int().toString(),\n reserved: faker.number.int().toString(),\n frozen: faker.number.int().toString(),\n bonded: faker.number.int().toString(),\n available: faker.number.int().toString(),\n unbonding: [\n { amount: faker.number.int().toString(), waiting_time: \"<fake-waiting-time>\" },\n ],\n unbonded: [\n { amount: faker.number.int().toString(), waiting_time: \"<fake-waiting-time>\" },\n ],\n totalUnbonding: faker.number.int().toString(),\n totalUnbonded: faker.number.int().toString(),\n },\n anonymousProxy: {\n address: \"<fake-anonymous-proxy-address>\",\n createdAt: faker.date.past().toISOString(),\n isController: false,\n isMain: false,\n balances: {\n free: faker.number.int().toString(),\n reserved: faker.number.int().toString(),\n frozen: faker.number.int().toString(),\n bonded: faker.number.int().toString(),\n available: faker.number.int().toString(),\n total: faker.number.int().toString(),\n },\n blockHeight: faker.number.int().toString(),\n extIndex: faker.number.int().toString(),\n index: faker.number.int().toString(),\n kind: \"<fake-kind>\",\n },\n },\n };\n case AccountType.RIPPLE_LIKE:\n return null;\n case AccountType.SOLANA_LIKE:\n if (account.contractAddress) {\n return {\n type: \"SOLANA_LIKE\",\n staking: null,\n };\n }\n return {\n type: \"SOLANA_LIKE\",\n staking: {\n staked: faker.number.int().toString(),\n rewards: {\n total: faker.number.int().toString(),\n last7: faker.number.int().toString(),\n last30: faker.number.int().toString(),\n },\n stakes: [\n {\n uid: \"<fake-stake-uid>\",\n baseAccountUid: \"<fake-base-account-uid>\",\n pubKey: \"<fake-pub-key>\",\n validatorPubKey: \"<fake-validator-pub-key>\",\n initialAmount: faker.number.int().toString(),\n activeAmount: faker.number.int().toString(),\n inactiveAmount: faker.number.int().toString(),\n totalBalance: faker.number.int().toString(),\n creationDate: faker.date.past().toISOString(),\n activationEpoch: faker.date.past().toISOString(),\n activationDate: faker.date.past().toISOString(),\n deactivationEpoch: \"<fake-deactivation-epoch>\",\n deactivationDate: faker.date.past().toISOString(),\n status: \"activated\",\n rentExemptReserve: faker.number.int().toString(),\n withdrawableAmount: faker.number.int().toString(),\n totalRewards: faker.number.int().toString(),\n creationTxHash: \"<fake-creation-tx-hash>\",\n actionsTxHashes: [\"<fake-action-tx-hash>\"],\n },\n ],\n },\n };\n case AccountType.STELLAR_LIKE:\n return null;\n case AccountType.SUI_LIKE:\n return null;\n case AccountType.TEZOS_LIKE:\n return {\n type: \"TEZOS_LIKE\",\n staking: {\n delegations: [{ address: faker.string.alpha({ length: 10 }) }],\n },\n };\n case AccountType.TRC20_LIKE:\n return null;\n }\n};\n\nexport function genVaultRequestResponse<T extends keyof RequestDataTypes>(\n opts: Parameters<typeof genVaultRequest<T>>[0],\n reviews: VaultRequestReview[] = [],\n): VaultRequestResponse {\n const request = genVaultRequest(opts);\n const requestWithReviews = { ...request, reviews };\n return serializeVaultRequest(requestWithReviews);\n}\n\nexport function genAccountResponse(overrides?: Partial<Account>): AccountResponse {\n const dbAccount = genAccount(overrides);\n const account = serializeAccount(dbAccount);\n return zAccountResponse.parse(account);\n}\n"]}