import {z} from 'zod' export type GetApiPublishedRequestsArgs = {term?: string | undefined, id?: string | undefined, orderId?: string | undefined, depositTxHash?: string | undefined, fillTxHash?: string | undefined, refundTxHash?: string | undefined, user?: string | undefined, recipient?: string | undefined, originChainId?: number | undefined, destinationChainId?: number | undefined, status?: ('success' | 'failure' | 'refund' | 'pending' | 'depositing') | undefined, currencyInChainId?: number | undefined, currencyOutChainId?: number | undefined, currencyInAddress?: string | undefined, currencyOutAddress?: string | undefined, currencyInSymbol?: string | undefined, currencyOutSymbol?: string | undefined, chainId?: number | undefined, privateChainsToInclude?: string | undefined, startTimestamp?: number | undefined, endTimestamp?: number | undefined, startBlock?: number | undefined, endBlock?: number | undefined, filters?: string | undefined, sortBy?: ('createdAt' | 'updatedAt') | undefined, sortDirection?: ('asc' | 'desc') | undefined, includeTotal?: boolean | undefined, limit?: number | undefined, continuation?: string | undefined, 'x-api-key'?: string | undefined}; export type GetApiPublishedRequestsOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiPublishedRequestsResponse = z.object({requests: z.array(z.object({id: z.string().optional(), status: z.enum(["success", "failure", "refund"]).optional(), user: z.string().optional(), recipient: z.string().nullable().optional(), sender: z.string().nullable().optional(), createdAt: z.string().optional(), updatedAt: z.string().optional(), data: z.object({inTxs: z.array(z.object({txHash: z.string().optional(), fee: z.string().optional(), block: z.number().optional(), type: z.string().optional(), chainId: z.number().optional(), timestamp: z.number().optional(), status: z.enum(["success", "failure"]).optional(), data: z.object({from: z.string().optional(), to: z.string().optional(), data: z.string().optional(), value: z.string().optional()}).nullable().optional(), stateChanges: z.array(z.object({address: z.string().optional(), change: z.object({kind: z.string().optional(), balanceDiff: z.string().optional(), data: z.object({tokenAddress: z.string().optional(), tokenKind: z.string().optional(), tokenId: z.string().optional()}).optional()}).optional()})).optional()})).optional(), outTxs: z.array(z.object({txHash: z.string().optional(), fee: z.string().optional(), block: z.number().optional(), type: z.string().optional(), chainId: z.number().optional(), timestamp: z.number().optional(), status: z.enum(["success", "failure"]).optional(), data: z.object({from: z.string().optional(), to: z.string().optional(), data: z.string().optional(), value: z.string().optional()}).nullable().optional(), stateChanges: z.array(z.object({address: z.string().optional(), change: z.object({kind: z.string().optional(), balanceDiff: z.string().optional(), data: z.object({tokenAddress: z.string().optional(), tokenKind: z.string().optional(), tokenId: z.string().optional()}).optional()}).optional()})).optional()})).optional(), route: z.object({actual: z.object({origin: z.object({inputCurrency: z.object({currency: z.object({chainId: z.number().optional(), address: z.string().optional(), symbol: z.string().optional(), name: z.string().optional(), decimals: z.number().optional()}).optional(), amount: z.string().optional(), amountFormatted: z.string().optional()}).nullable().optional(), outputCurrency: z.object({currency: z.object({chainId: z.number().optional(), address: z.string().optional(), symbol: z.string().optional(), name: z.string().optional(), decimals: z.number().optional()}).optional(), amount: z.string().optional(), amountFormatted: z.string().optional()}).nullable().optional()}).nullable().optional(), destination: z.object({inputCurrency: z.object({currency: z.object({chainId: z.number().optional(), address: z.string().optional(), symbol: z.string().optional(), name: z.string().optional(), decimals: z.number().optional()}).optional(), amount: z.string().optional(), amountFormatted: z.string().optional()}).nullable().optional(), outputCurrency: z.object({currency: z.object({chainId: z.number().optional(), address: z.string().optional(), symbol: z.string().optional(), name: z.string().optional(), decimals: z.number().optional()}).optional(), amount: z.string().optional(), amountFormatted: z.string().optional()}).nullable().optional()}).nullable().optional()}).nullable().optional()}).nullable().optional()}).optional(), protocol: z.object({orderId: z.string().optional(), solver: z.object({address: z.string().optional()}).optional(), deposit: z.object({origin: z.object({amount: z.string().optional(), chainId: z.number().optional(), currency: z.string().optional(), depositor: z.string().optional(), depository: z.string().optional(), onchainId: z.string().optional(), transactionId: z.string().optional()}).nullable().optional()}).optional(), settlement: z.object({destination: z.object({fills: z.array(z.object({chainId: z.number().optional(), transactionId: z.string().optional()})).optional(), refunds: z.array(z.object({chainId: z.number().optional(), transactionId: z.string().optional()})).optional()}).optional()}).optional()}).nullable().optional()})), continuation: z.string().optional(), total: z.number().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 }; /** * List published requests across integrators * * GET /published-requests */ export const getApiPublishedRequests = async (args: GetApiPublishedRequestsArgs, options?: GetApiPublishedRequestsOptions) => { const {baseUrl = "https://api.relay.link", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.term != null) query.append("term", String(args.term)) if (args.id != null) query.append("id", String(args.id)) if (args.orderId != null) query.append("orderId", String(args.orderId)) if (args.depositTxHash != null) query.append("depositTxHash", String(args.depositTxHash)) if (args.fillTxHash != null) query.append("fillTxHash", String(args.fillTxHash)) if (args.refundTxHash != null) query.append("refundTxHash", String(args.refundTxHash)) if (args.user != null) query.append("user", String(args.user)) if (args.recipient != null) query.append("recipient", String(args.recipient)) if (args.originChainId != null) query.append("originChainId", String(args.originChainId)) if (args.destinationChainId != null) query.append("destinationChainId", String(args.destinationChainId)) if (args.status != null) query.append("status", String(args.status)) if (args.currencyInChainId != null) query.append("currencyInChainId", String(args.currencyInChainId)) if (args.currencyOutChainId != null) query.append("currencyOutChainId", String(args.currencyOutChainId)) if (args.currencyInAddress != null) query.append("currencyInAddress", String(args.currencyInAddress)) if (args.currencyOutAddress != null) query.append("currencyOutAddress", String(args.currencyOutAddress)) if (args.currencyInSymbol != null) query.append("currencyInSymbol", String(args.currencyInSymbol)) if (args.currencyOutSymbol != null) query.append("currencyOutSymbol", String(args.currencyOutSymbol)) if (args.chainId != null) query.append("chainId", String(args.chainId)) if (args.privateChainsToInclude != null) query.append("privateChainsToInclude", String(args.privateChainsToInclude)) if (args.startTimestamp != null) query.append("startTimestamp", String(args.startTimestamp)) if (args.endTimestamp != null) query.append("endTimestamp", String(args.endTimestamp)) if (args.startBlock != null) query.append("startBlock", String(args.startBlock)) if (args.endBlock != null) query.append("endBlock", String(args.endBlock)) if (args.filters != null) query.append("filters", String(args.filters)) if (args.sortBy != null) query.append("sortBy", String(args.sortBy)) if (args.sortDirection != null) query.append("sortDirection", String(args.sortDirection)) if (args.includeTotal != null) query.append("includeTotal", String(args.includeTotal)) if (args.limit != null) query.append("limit", String(args.limit)) if (args.continuation != null) query.append("continuation", String(args.continuation)) if (args['x-api-key'] != null) headers.set("x-api-key", String(args['x-api-key'])) const url = `${baseUrl.replace(/\/+$/, '')}/published-requests${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(getApiPublishedRequestsResponse, await res.json()) };