import {z} from 'zod' export type TravelRuleFieldsEnum = Array<'all' | 'did' | 'name' | 'verificationStatus' | 'addressLine1' | 'addressLine2' | 'city' | 'country' | 'emailDomains' | 'website' | 'logo' | 'legalStructure' | 'legalName' | 'yearFounded' | 'incorporationCountry' | 'isRegulated' | 'otherNames' | 'identificationType' | 'identificationCountry' | 'businessNumber' | 'regulatoryAuthorities' | 'jurisdictions' | 'division' | 'street' | 'number' | 'unit' | 'postCode' | 'state' | 'otherLegalName' | 'gleifUpdatedAt' | 'leiNumber' | 'legalForm' | 'entityCategory' | 'entityStatus' | 'externalEntityConfig' | 'hqStreet' | 'hqNumber' | 'hqPostcode' | 'hqRegion' | 'hqCity' | 'hqCountry' | 'certificates' | 'description' | 'travelRule_OPENVASP' | 'travelRule_SYGNA' | 'travelRule_TRISA' | 'travelRule_TRLIGHT' | 'travelRule_EMAIL' | 'travelRule_TRP' | 'travelRule_SHYFT' | 'travelRule_USTRAVELRULEWG' | 'createdAt' | 'createdBy' | 'updatedAt' | 'updatedBy' | 'lastSentDate' | 'lastReceivedDate' | 'documents' | 'hasAdmin' | 'isNotifiable' | 'issuers' | 'regulatoryStatus' | 'supervisoryAuthority' | 'registrationLicenseId' | 'statusStartDate' | 'statusExpirationDate' | 'lastChecked' | 'additionalInformation' | 'subsidiaryOf' | 'pii_didkey' | 'compliancePhase' | 'compliancePhaseData' | 'vaspnetId' | 'vaspnetUpdatedAt' | 'vaspnetImmutableFields' | 'node_didkey' | 'ddq' | 'targetProtocol' | 'parentGateway' | 'isActiveSender' | 'isActiveReceiver' | 'subsidiaries'>; export type GetApiScreeningTravelRuleVaspArgs = {order?: ('ASC' | 'DESC') | undefined, pageSize?: number | undefined, fields?: TravelRuleFieldsEnum | undefined, search?: string | undefined, reviewValue: unknown, pageCursor?: string | undefined}; export type GetApiScreeningTravelRuleVaspOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const travelRuleVASPExternalEntity = z.object({legalName: z.string().nullable().optional(), otherLegalName: z.string().nullable().optional(), legalForm: z.string().nullable().optional(), legalStructure: z.string().nullable().optional(), entityCategory: z.string().nullable().optional(), entityStatus: z.string().nullable().optional(), businessNumber: z.string().nullable().optional(), yearFounded: z.string().nullable().optional(), jurisdictions: z.string().nullable().optional(), addressLine1: z.string().nullable().optional(), number: z.string().nullable().optional(), postCode: z.string().nullable().optional(), city: z.string().nullable().optional(), state: z.string().nullable().optional(), country: z.string().nullable().optional(), hqStreet: z.string().nullable().optional(), hqNumber: z.string().nullable().optional(), hqPostcode: z.string().nullable().optional(), hqCity: z.string().nullable().optional(), hqRegion: z.string().nullable().optional(), hqCountry: z.string().nullable().optional()}); export const travelRuleVASPExternalEntityRegistration = z.object({status: z.string().nullable().optional(), nextRenewalDate: z.string().nullable().optional(), corroborationLevel: z.string().nullable().optional()}); export const travelRuleVASPExternalEntityConfig = z.object({provider: z.string().optional(), externalId: z.string().nullable().optional(), updatedAt: z.string().nullable().optional(), resolvedAt: z.string().nullable().optional(), entity: travelRuleVASPExternalEntity.optional(), registration: travelRuleVASPExternalEntityRegistration.optional()}); export const travelRuleIssuer = z.object({issuerDid: z.string(), issuedDate: z.string().optional(), issuerName: z.string().optional()}); export const travelRuleIssuers = z.object({yearFounded: travelRuleIssuer, isRegulated: travelRuleIssuer, regulatoryAuthorities: travelRuleIssuer.optional(), name: travelRuleIssuer, logo: travelRuleIssuer.optional(), website: travelRuleIssuer, legalName: travelRuleIssuer, legalStructure: travelRuleIssuer, incorporationCountry: travelRuleIssuer, businessNumber: travelRuleIssuer, addressLine1: travelRuleIssuer, city: travelRuleIssuer, country: travelRuleIssuer, description: travelRuleIssuer.optional()}); export const travelRuleVASPCompliancePhaseData = z.record(z.string(), z.boolean()).nullable(); export const travelRuleVASP = z.object({did: z.string(), name: z.string(), verificationStatus: z.string(), addressLine1: z.string(), addressLine2: z.string().nullable().optional(), city: z.string(), country: z.string(), emailDomains: z.string(), website: z.string(), logo: z.string().nullable().optional(), legalStructure: z.string(), legalName: z.string(), yearFounded: z.string(), incorporationCountry: z.string(), isRegulated: z.string(), otherNames: z.string().nullable().optional(), identificationType: z.string().optional(), identificationCountry: z.string().nullable().optional(), businessNumber: z.string().optional(), regulatoryAuthorities: z.string().nullable().optional(), jurisdictions: z.string(), division: z.string().nullable().optional(), street: z.string().nullable().optional(), number: z.string().optional(), unit: z.string().nullable().optional(), postCode: z.string().optional(), state: z.string().optional(), otherLegalName: z.string().nullable().optional(), gleifUpdatedAt: z.string().nullable().optional(), leiNumber: z.string().nullable().optional(), legalForm: z.string().nullable().optional(), entityCategory: z.string().nullable().optional(), entityStatus: z.string().nullable().optional(), externalEntityConfig: z.array(travelRuleVASPExternalEntityConfig).nullable().optional(), hqStreet: z.string().nullable().optional(), hqNumber: z.string().nullable().optional(), hqPostcode: z.string().nullable().optional(), hqRegion: z.string().nullable().optional(), hqCity: z.string().nullable().optional(), hqCountry: z.string().nullable().optional(), certificates: z.string().nullable().optional(), description: z.string().nullable().optional(), travelRule_OPENVASP: z.string().nullable().optional(), travelRule_SYGNA: z.string().nullable().optional(), travelRule_TRISA: z.string().nullable().optional(), travelRule_TRLIGHT: z.string(), travelRule_EMAIL: z.string().nullable().optional(), travelRule_TRP: z.string().nullable().optional(), travelRule_SHYFT: z.string().nullable().optional(), travelRule_USTRAVELRULEWG: z.string().nullable().optional(), createdAt: z.string(), createdBy: z.string().nullable().optional(), updatedAt: z.string().optional(), updatedBy: z.string().optional(), lastSentDate: z.string().optional(), lastReceivedDate: z.string().optional(), documents: z.string().nullable().optional(), hasAdmin: z.boolean(), isNotifiable: z.boolean(), issuers: travelRuleIssuers, regulatoryStatus: z.string().nullable().optional(), supervisoryAuthority: z.string().nullable().optional(), registrationLicenseId: z.string().nullable().optional(), statusStartDate: z.string().nullable().optional(), statusExpirationDate: z.string().nullable().optional(), lastChecked: z.string().nullable().optional(), additionalInformation: z.string().nullable().optional(), subsidiaryOf: z.string().nullable().optional(), pii_didkey: z.string().nullable().optional(), compliancePhase: z.number().int().nullable().optional(), compliancePhaseData: travelRuleVASPCompliancePhaseData.optional(), vaspnetId: z.string().nullable().optional(), vaspnetUpdatedAt: z.string().nullable().optional(), vaspnetImmutableFields: z.array(z.string()).nullable().optional(), node_didkey: z.string().nullable().optional(), ddq: z.string().nullable().optional(), targetProtocol: z.string().nullable().optional(), parentGateway: z.string().nullable().optional(), isActiveSender: z.boolean().nullable().optional(), isActiveReceiver: z.boolean().nullable().optional(), subsidiaries: z.array(z.unknown()).nullable().optional()}); export const travelRuleGetAllVASPsResponse = z.object({data: z.array(travelRuleVASP), total: z.number().int().optional(), next: z.string().nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get All VASPs * * GET /screening/travel_rule/vasp */ export const getApiScreeningTravelRuleVasp = async (args: GetApiScreeningTravelRuleVaspArgs, options?: GetApiScreeningTravelRuleVaspOptions) => { const {baseUrl = "https://api.fireblocks.io/v1", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.order != null) query.append("order", String(args.order)) if (args.pageSize != null) query.append("pageSize", String(args.pageSize)) for (const item of args.fields ?? []) query.append("fields", String(item)) if (args.search != null) query.append("search", String(args.search)) if (args.reviewValue != null) query.append("reviewValue", String(args.reviewValue)) if (args.pageCursor != null) query.append("pageCursor", String(args.pageCursor)) const url = `${baseUrl.replace(/\/+$/, '')}/screening/travel_rule/vasp${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(travelRuleGetAllVASPsResponse, await res.json()) };