import {z} from 'zod' export type MoneyMovementsApproveTransferApprovalInput = {note?: string | undefined, quote_key?: string | undefined}; export type CreateApiMoneyTransferApprovalsIdApproveArgs = {id: string, 'Idempotency-Key'?: string | undefined, body: MoneyMovementsApproveTransferApprovalInput}; export type CreateApiMoneyTransferApprovalsIdApproveOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const moneyfmtFormattedMoneyAmountView = z.object({compact: z.string(), currency_sign: z.string(), currency_sign_position: z.string(), full: z.string()}); export const moneyfmtMoneyAmountView = z.object({float: z.number(), formatted: moneyfmtFormattedMoneyAmountView, precise: z.string(), symbol: z.string(), zero: z.boolean()}); export const moneyMovementsApprovalRequirementKind = z.enum(["ordinary_quorum", "additional_named", "selected_member"]); export const moneyMovementsApprovalRequirementSource = z.enum(["business", "member"]); export const moneyMovementsApprovalClauseView = z.object({approvals_received: z.number().int().gte(0).optional(), count: z.number().int().gte(1).optional(), excluded_individual_ids: z.array(z.string()).optional(), individual_id: z.string().optional(), individual_name: z.string().optional(), kind: moneyMovementsApprovalRequirementKind.optional(), progress_available: z.boolean().optional(), satisfied: z.boolean().optional(), source: moneyMovementsApprovalRequirementSource.optional()}); export const moneyMovementsApprovalValuationStatus = z.enum(["valued", "unavailable"]); export const moneyMovementsApprovalPolicyValuationView = z.object({amount_usd: z.string().nullable().optional(), amount_usd_view: z.union([moneyfmtMoneyAmountView, z.unknown()]).optional(), status: moneyMovementsApprovalValuationStatus.optional()}); export const moneyMovementsApprovalPolicyView = z.object({action_allowed: z.boolean().optional(), business_policy_revision: z.string().nullable().optional(), permission_allowed: z.boolean().optional(), requirements: z.array(moneyMovementsApprovalClauseView).nullable().optional(), revision: z.string().optional(), valuation: moneyMovementsApprovalPolicyValuationView.optional()}); export const withdrawaltraceEvaluation = z.object({evaluated_ts: z.string(), result: z.enum(["passed", "waiting"]), type: z.enum(["rail_access", "agreements", "destination", "withdrawal_limit", "business_eligibility", "approval", "release_delay", "destination_cooloff", "destination_authorization"])}); export const moneyMovementsTransferApprovalAssetDisplay = z.object({amount: z.string().optional(), network: z.string().optional(), symbol: z.string().optional()}); export const moneyMovementsRampFeeDisclosure = z.object({bank_fee_usd: z.string(), platform_fee_usdc: z.string(), total_debit_usdc: z.string()}); export const moneyMovementsTransferApprovalDestination = z.object({account_id: z.string().optional(), masked_account: z.string().optional(), masked_address: z.string().optional()}); export const moneyMovementsTransferApprovalNetwork = z.enum(["ethereum", "stellar", "solana"]); export const moneyMovementsTransferApprovalFundRoute = z.object({pathway: z.enum(["standard", "express"]).optional(), pathway_defaulted: z.boolean().optional(), source: z.enum(["platform", "stellar", "solana"]).optional(), source_defaulted: z.boolean().optional(), source_network: moneyMovementsTransferApprovalNetwork.optional()}); export const moneyMovementsTransferApprovalInstructions = z.object({action: z.enum(["buy", "sell", "withdrawal"]).optional(), amount: moneyfmtMoneyAmountView.optional(), asset_symbol: z.string().optional(), destination: moneyMovementsTransferApprovalDestination.optional(), fund_route: moneyMovementsTransferApprovalFundRoute.optional()}); export const moneyMovementsTransferApprovalStatus = z.enum(["pending", "approved", "denied", "cancelled", "expired", "policy_changed", "failed"]); export const moneyenumTransferApprovalVoteDecision = z.enum(["approved", "denied"]); export const moneyMovementsTransferApprovalVoteView = z.object({approver: z.string().optional(), approver_name: z.string().optional(), decision: moneyenumTransferApprovalVoteDecision.optional(), note: z.string().max(500).optional(), voted_ts: z.string().optional()}); export const moneyMovementsTransferApprovalView = z.object({also_required_ind_id: z.string().nullable().optional(), also_required_name: z.string().optional(), also_required_satisfied: z.boolean().optional(), amount_usd: moneyfmtMoneyAmountView.optional(), approvals_received: z.number().int().optional(), composed_policy: moneyMovementsApprovalPolicyView.optional(), controls: z.array(withdrawaltraceEvaluation).optional(), current_approver_names: z.array(z.string()).nullable().optional(), decided_by: z.string().nullable().optional(), decided_ts: z.string().nullable().optional(), decider_name: z.string().optional(), decision_comment: z.string().max(500).optional(), decision_note: z.string().optional(), expires_ts: z.string().optional(), flow_label: z.string().optional(), group_id: z.string().optional(), human_approval: z.enum(["unknown", "none", "required"]), id: z.string().optional(), money_movement_id: z.string().nullable().optional(), native_asset: moneyMovementsTransferApprovalAssetDisplay.optional(), progress_available: z.boolean().optional(), rail: z.string().optional(), ramp_fees: moneyMovementsRampFeeDisclosure.optional(), release_ts: z.string().nullable().optional(), request_summary: moneyMovementsTransferApprovalInstructions.optional(), requested_by: z.string().optional(), requested_ts: z.string().optional(), requester_name: z.string().optional(), required_approvals: z.number().int().optional(), selected_approver_name: z.string().optional(), selected_approver_satisfied: z.boolean().optional(), status: moneyMovementsTransferApprovalStatus.optional(), valuation_unavailable: z.boolean().optional(), votes: z.array(moneyMovementsTransferApprovalVoteView).nullable().optional(), withdrawal_release_held: z.boolean(), withdrawals_paused: z.boolean().optional()}); export const moneyMovementsTransferApprovalOutput = z.object({transfer_approval: moneyMovementsTransferApprovalView.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 }; /** * Approve a pending transfer request * * POST /money/transfer_approvals/{id}/approve */ export const createApiMoneyTransferApprovalsIdApprove = async (args: CreateApiMoneyTransferApprovalsIdApproveArgs, options: CreateApiMoneyTransferApprovalsIdApproveOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['Idempotency-Key'] != null) headers.set("Idempotency-Key", String(args['Idempotency-Key'])) const url = `${baseUrl.replace(/\/+$/, '')}/money/transfer_approvals/${encodeURIComponent(String(args.id))}/approve${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(moneyMovementsTransferApprovalOutput, await res.json()) };