import {z} from 'zod' export type GetApiV10DlnOrderCreateTxArgs = {srcChainId: '1' | '10' | '56' | '137' | '8453' | '42161' | '43114' | '59144' | '7565164' | '100000001' | '100000002' | '100000008' | '100000009' | '100000013' | '100000014' | '100000017' | '100000019' | '100000020' | '100000021' | '100000022' | '100000023' | '100000025' | '100000026' | '100000027' | '100000028' | '100000029' | '100000030' | '100000031', srcChainTokenIn: string, srcChainTokenInAmount: string, dstChainId: '1' | '10' | '56' | '137' | '8453' | '42161' | '43114' | '59144' | '7565164' | '100000001' | '100000002' | '100000008' | '100000009' | '100000013' | '100000014' | '100000017' | '100000019' | '100000020' | '100000021' | '100000022' | '100000023' | '100000025' | '100000026' | '100000027' | '100000028' | '100000029' | '100000030' | '100000031', dstChainTokenOut: string, dstChainTokenOutAmount?: string | undefined, additionalTakerRewardBps?: number | undefined, srcIntermediaryTokenAddress?: string | undefined, dstIntermediaryTokenAddress?: string | undefined, dstIntermediaryTokenSpenderAddress?: string | undefined, intermediaryTokenUSDPrice?: number | undefined, dstChainTokenOutRecipient?: string | undefined, senderAddress?: string | undefined, srcChainOrderAuthorityAddress?: string | undefined, srcAllowedCancelBeneficiary?: string | undefined, referralCode?: number | undefined, affiliateFeePercent?: number | undefined, affiliateFeeRecipient?: string | undefined, srcChainTokenInSenderPermit?: string | undefined, dstChainOrderAuthorityAddress?: string | undefined, enableEstimate?: boolean | undefined, allowedTaker?: string | undefined, externalCall?: string | undefined, dlnHook?: string | undefined, prependOperatingExpenses?: boolean | undefined, metadata?: string | undefined, otc?: boolean | undefined, ptp?: boolean | undefined, skipSolanaRecipientValidation?: boolean | undefined, srcChainPriorityLevel?: ('normal' | 'aggressive') | undefined}; export type GetApiV10DlnOrderCreateTxOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const srcChainTokenInResponseType = z.object({address: z.string(), name: z.string(), symbol: z.string(), decimals: z.number().int(), amount: z.string(), chainId: z.number(), approximateOperatingExpense: z.string(), mutatedWithOperatingExpense: z.boolean(), approximateUsdValue: z.number(), originApproximateUsdValue: z.number()}); export const srcChainTokenOutResponseType = z.object({address: z.string(), name: z.string(), symbol: z.string(), decimals: z.number().int(), amount: z.string(), chainId: z.number(), maxRefundAmount: z.string(), approximateUsdValue: z.number()}); export const dstChainTokenOutResponseType = z.object({address: z.string(), name: z.string(), symbol: z.string(), decimals: z.number().int(), amount: z.string(), chainId: z.number(), recommendedAmount: z.string(), withoutAdditionalTakerRewardsAmount: z.string().optional(), withoutAdditionalTakerRewardsApproximateUsdValue: z.number().optional(), approximateUsdValue: z.number().optional(), recommendedApproximateUsdValue: z.number().optional(), maxTheoreticalAmount: z.string(), maxTheoreticalApproximateUsdValue: z.number().optional()}); export const payload = z.object({feeAmount: z.string().optional(), feeBps: z.string().optional(), amountOutBeforeCorrection: z.string().optional(), estimatedVolatilityBps: z.string().optional(), actualFeeAmount: z.string().optional(), actualFeeBps: z.string().optional(), subsidyAmount: z.string().optional(), feeApproximateUsdValue: z.string().optional(), additionalMarginAmount: z.string().optional(), additionalMarginBps: z.string().optional()}); export const costsDetailsProperty = z.object({chain: z.string(), tokenIn: z.string(), tokenOut: z.string(), amountIn: z.string(), amountOut: z.string(), type: z.string(), payload: payload.optional()}); export const dlnOrderEstimation = z.object({srcChainTokenIn: srcChainTokenInResponseType, srcChainTokenOut: srcChainTokenOutResponseType.optional(), dstChainTokenOut: dstChainTokenOutResponseType, recommendedSlippage: z.number().optional(), costsDetails: z.array(costsDetailsProperty)}); export const dlnTx = z.object({to: z.string(), data: z.string(), value: z.string(), gasLimit: z.number().optional()}); export const order = z.object({approximateFulfillmentDelay: z.number(), salt: z.number().optional(), metadata: z.string().optional()}); export const feeDetails = z.object({giveOrderState: z.string().optional(), giveOrderWallet: z.string().optional(), nonceMaster: z.string().optional(), txFee: z.string().optional(), priorityFee: z.string().optional(), gasLimit: z.string().optional(), gasPrice: z.string().optional(), baseFee: z.string().optional(), maxFeePerGas: z.string().optional(), maxPriorityFeePerGas: z.string().optional()}); export const feeInfo = z.object({total: z.string(), details: feeDetails, approximateUsdValue: z.number().optional()}); export const dlnOrderCreateTxResponse = z.object({estimation: dlnOrderEstimation, tx: dlnTx, orderId: z.string(), prependedOperatingExpenseCost: z.string().optional(), order: order, fixFee: z.string(), protocolFee: z.string().optional(), protocolFeeApproximateUsdValue: z.string().optional(), userPoints: z.number(), integratorPoints: z.number(), actualUserPoints: z.number().optional(), actualIntegratorPoints: z.number().optional(), estimatedTransactionFee: feeInfo.optional(), usdPriceImpact: z.object({}).optional()}); export const txQuote = z.object({allowanceTarget: z.string(), allowanceValue: z.string().optional()}); export const dlnOrderQuoteResponse = z.object({estimation: dlnOrderEstimation, prependedOperatingExpenseCost: z.string().optional(), tx: txQuote.optional(), order: order, fixFee: z.string(), protocolFee: z.string().optional(), protocolFeeApproximateUsdValue: z.string().optional(), userPoints: z.number(), integratorPoints: z.number(), actualUserPoints: z.number().optional(), actualIntegratorPoints: z.number().optional(), usdPriceImpact: z.object({}).optional()}); export const getApiV10DlnOrderCreateTxResponse = z.union([dlnOrderCreateTxResponse, dlnOrderQuoteResponse]); 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 }; /** * This endpoint returns the data for a transaction to place a cross-chain DLN order. * * GET /v1.0/dln/order/create-tx */ export const getApiV10DlnOrderCreateTx = async (args: GetApiV10DlnOrderCreateTxArgs, options?: GetApiV10DlnOrderCreateTxOptions) => { const {baseUrl = "https://dln.debridge.finance", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.srcChainId != null) query.append("srcChainId", String(args.srcChainId)) if (args.srcChainTokenIn != null) query.append("srcChainTokenIn", String(args.srcChainTokenIn)) if (args.srcChainTokenInAmount != null) query.append("srcChainTokenInAmount", String(args.srcChainTokenInAmount)) if (args.dstChainId != null) query.append("dstChainId", String(args.dstChainId)) if (args.dstChainTokenOut != null) query.append("dstChainTokenOut", String(args.dstChainTokenOut)) if (args.dstChainTokenOutAmount != null) query.append("dstChainTokenOutAmount", String(args.dstChainTokenOutAmount)) if (args.additionalTakerRewardBps != null) query.append("additionalTakerRewardBps", String(args.additionalTakerRewardBps)) if (args.srcIntermediaryTokenAddress != null) query.append("srcIntermediaryTokenAddress", String(args.srcIntermediaryTokenAddress)) if (args.dstIntermediaryTokenAddress != null) query.append("dstIntermediaryTokenAddress", String(args.dstIntermediaryTokenAddress)) if (args.dstIntermediaryTokenSpenderAddress != null) query.append("dstIntermediaryTokenSpenderAddress", String(args.dstIntermediaryTokenSpenderAddress)) if (args.intermediaryTokenUSDPrice != null) query.append("intermediaryTokenUSDPrice", String(args.intermediaryTokenUSDPrice)) if (args.dstChainTokenOutRecipient != null) query.append("dstChainTokenOutRecipient", String(args.dstChainTokenOutRecipient)) if (args.senderAddress != null) query.append("senderAddress", String(args.senderAddress)) if (args.srcChainOrderAuthorityAddress != null) query.append("srcChainOrderAuthorityAddress", String(args.srcChainOrderAuthorityAddress)) if (args.srcAllowedCancelBeneficiary != null) query.append("srcAllowedCancelBeneficiary", String(args.srcAllowedCancelBeneficiary)) if (args.referralCode != null) query.append("referralCode", String(args.referralCode)) if (args.affiliateFeePercent != null) query.append("affiliateFeePercent", String(args.affiliateFeePercent)) if (args.affiliateFeeRecipient != null) query.append("affiliateFeeRecipient", String(args.affiliateFeeRecipient)) if (args.srcChainTokenInSenderPermit != null) query.append("srcChainTokenInSenderPermit", String(args.srcChainTokenInSenderPermit)) if (args.dstChainOrderAuthorityAddress != null) query.append("dstChainOrderAuthorityAddress", String(args.dstChainOrderAuthorityAddress)) if (args.enableEstimate != null) query.append("enableEstimate", String(args.enableEstimate)) if (args.allowedTaker != null) query.append("allowedTaker", String(args.allowedTaker)) if (args.externalCall != null) query.append("externalCall", String(args.externalCall)) if (args.dlnHook != null) query.append("dlnHook", String(args.dlnHook)) if (args.prependOperatingExpenses != null) query.append("prependOperatingExpenses", String(args.prependOperatingExpenses)) if (args.metadata != null) query.append("metadata", String(args.metadata)) if (args.otc != null) query.append("otc", String(args.otc)) if (args.ptp != null) query.append("ptp", String(args.ptp)) if (args.skipSolanaRecipientValidation != null) query.append("skipSolanaRecipientValidation", String(args.skipSolanaRecipientValidation)) if (args.srcChainPriorityLevel != null) query.append("srcChainPriorityLevel", String(args.srcChainPriorityLevel)) const url = `${baseUrl.replace(/\/+$/, '')}/v1.0/dln/order/create-tx${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(getApiV10DlnOrderCreateTxResponse, await res.json()) };