import {z} from 'zod' export type GetApiApiPayinsPayinIdArgs = {id: string, 'on-behalf-of'?: string | undefined}; export type GetApiApiPayinsPayinIdOptions = {baseUrl?: string | undefined, bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const payinAchSenderMetadata = z.object({accountNumber: z.string().optional(), achRoutingNumber: z.string().optional(), description: z.string().optional(), senderName: z.string(), type: z.literal("ach")}); export const wireSenderMetadata = z.object({bankBeneficiaryName: z.string(), bankName: z.string(), imad: z.string(), senderName: z.string().optional(), type: z.literal("wire"), wireRoutingNumber: z.string()}); export const blockchainSenderMetadata = z.object({blockchain: z.literal("TRON"), senderAddress: z.string(), transactionHash: z.string(), type: z.literal("blockchain")}); export const cOPBreBSenderMetadata = z.object({senderAccountNumber: z.string().optional(), senderAccountType: z.string().optional(), senderBankCode: z.string().optional(), senderId: z.string().optional(), senderIdType: z.enum(["cc", "nit", "ce", "pa", "ppt", "ti", "rc", "te", "die"]).optional(), senderName: z.string().optional(), type: z.literal("cop-bre-b")}); export const aRSBankTransferSenderMetadata = z.object({senderAccountNumber: z.string().optional(), senderId: z.string().optional(), senderIdType: z.string().optional(), senderName: z.string().optional(), type: z.literal("ars-bank-transfer")}); export const unknownSenderMetadata = z.object({type: z.literal("unknown")}); export const payinAfterExpiryRefundInfo = z.object({expiredAt: z.string(), receivedAt: z.string(), type: z.literal("payinAfterExpiry")}); export const providerInitiatedRefundInfo = z.object({type: z.literal("providerInitiated")}); export const fiatAmount = z.object({type: z.literal("fiat"), currencySymbol: z.literal("USD"), exponent: z.number(), value: z.string()}); export const blockchainAmount = z.object({type: z.literal("blockchain"), tokenSymbol: z.enum(["USDC", "USDT"]), exponent: z.number(), value: z.string(), blockchain: z.enum(["ETHEREUM", "POLYGON", "BASE", "CELO", "PLASMA", "TRON"])}); export const payinFeeItemization = z.object({developerFee: fiatAmount, fixedTransactionFee: fiatAmount, variableFee: fiatAmount}); export const payinFees = z.object({feeTotal: fiatAmount, itemizedFees: payinFeeItemization}); export const payin = z.object({id: z.string(), destinationAccountId: z.string(), payinRail: z.enum(["ACH", "WIRE", "SEPA", "MXN_SPEI", "BRL_PIX", "ARS_CVU", "COP_PSE", "COP_BREB", "BLOCKCHAIN"]), payinStatus: z.union([z.object({type: z.literal("created")}), z.object({senderMetadata: z.union([payinAchSenderMetadata, wireSenderMetadata, blockchainSenderMetadata, cOPBreBSenderMetadata, aRSBankTransferSenderMetadata, unknownSenderMetadata]), type: z.literal("canceled")}), z.object({initiatedAt: z.string(), senderMetadata: z.union([payinAchSenderMetadata, wireSenderMetadata, blockchainSenderMetadata, cOPBreBSenderMetadata, aRSBankTransferSenderMetadata, unknownSenderMetadata]), type: z.literal("pending")}), z.object({initiatedAt: z.string(), senderMetadata: z.union([payinAchSenderMetadata, wireSenderMetadata, blockchainSenderMetadata, cOPBreBSenderMetadata, aRSBankTransferSenderMetadata, unknownSenderMetadata]), type: z.literal("on-hold")}), z.object({completedAt: z.string(), initiatedAt: z.string(), senderMetadata: z.union([payinAchSenderMetadata, wireSenderMetadata, blockchainSenderMetadata, cOPBreBSenderMetadata, aRSBankTransferSenderMetadata, unknownSenderMetadata]), type: z.literal("completed")}), z.object({initiatedAt: z.string(), reason: z.string(), senderMetadata: z.union([payinAchSenderMetadata, wireSenderMetadata, blockchainSenderMetadata, cOPBreBSenderMetadata, aRSBankTransferSenderMetadata, unknownSenderMetadata]), type: z.literal("failed")}), z.object({refundedAt: z.string(), refundInfo: z.union([payinAfterExpiryRefundInfo, providerInitiatedRefundInfo]), type: z.literal("refunded")})]), sourceAmount: z.union([z.object({type: z.literal("fiat"), currencySymbol: z.enum(["USD", "EUR", "MXN", "BRL", "COP", "ARS"]), exponent: z.number(), value: z.string()}), z.object({type: z.literal("blockchain"), tokenSymbol: z.enum(["USDC", "USDT"]), exponent: z.number(), value: z.string(), blockchain: z.literal("TRON")})]), settlementStrategy: z.union([z.object({type: z.literal("holdInFiat")}), z.object({type: z.literal("autoOnramp")})]), settlementDetails: z.union([z.object({amount: fiatAmount, type: z.literal("fiat")}), z.object({amount: blockchainAmount, transactionHash: z.string().optional(), type: z.literal("blockchain")})]), fees: payinFees, payinInstructions: z.union([z.object({depositUrl: z.string(), expiresAt: z.string(), type: z.literal("cop")}), z.object({descriptionToPayer: z.string().max(256), expiresAt: z.string(), keyValue: z.string(), type: z.literal("cop-bre-b")}), z.object({bankName: z.string(), cvu: z.string(), expiresAt: z.string(), type: z.literal("ars-bank-transfer")}), z.object({brCode: z.string(), expiresAt: z.string(), type: z.literal("brl-pix")}), z.object({bankAccountNumber: z.string(), bankName: z.string(), expiresAt: z.string(), type: z.literal("mxn-spei")})]).optional(), exchangeRate: z.number().optional(), createdAt: z.string(), updatedAt: z.string(), payinBatchId: 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 a Payin * * GET /api/payins/payin/{id} */ export const getApiApiPayinsPayinId = async (args: GetApiApiPayinsPayinIdArgs, options?: GetApiApiPayinsPayinIdOptions) => { const {baseUrl = "https://api.muralpay.com", fetch: fetchFn = fetch, bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['on-behalf-of'] != null) headers.set("on-behalf-of", String(args['on-behalf-of'])) if (bearer !== undefined) headers.set('authorization', `Bearer ${bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/payins/payin/${encodeURIComponent(String(args.id))}${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(payin, await res.json()) };