import type { HandleOpsResult, XLayerConfig } from './aa-types.js'; import type { BundleSwapParams } from './eoa-trade-types.js'; /** * 捆绑换手签名参数(仅签名 handleOps 交易;可选追加 route 尾交易) * - 返回 raw signed tx,可按“BSC 捆绑”模式交给后端/Builder 提交 */ export interface BundleSwapSignParams extends BundleSwapParams { /** Payer 私钥(用于签 handleOps 交易);默认 sellerPrivateKey */ payerPrivateKey?: string; /** beneficiary(默认 payer 地址) */ beneficiary?: string; /** 可选:指定 payer 起始 nonce(不传则用 pending nonce) */ payerStartNonce?: number; /** 可选:覆盖 handleOps gasLimit(不传则自动 estimate,失败回退) */ handleOpsGasLimit?: bigint; /** * 可选:routeAddress(如果你的后端要求“route 尾交易”,则传入) * - SDK 会自动构造 nonce+1 的空转账 tailTx */ routeAddress?: string; } /** * 捆绑换手签名结果 */ export interface BundleSwapSignResult { /** raw signed tx 列表(handleOps 在前;如果有 routeAddress 则 tailTx 在后) */ signedTransactions: string[]; /** 元数据(便于前端显示) */ metadata: { payer: string; beneficiary: string; sellerOwner: string; sellerSender: string; buyerOwner: string; buyerSender: string; sellAmountWei: string; buyAmountWei: string; hasApprove: boolean; routeAddress?: string; /** 是否提取利润 */ extractProfit?: boolean; /** 利润比例 bps */ profitBps?: number; /** 利润接收地址 */ profitRecipient?: string; /** 预估利润(OKB wei) */ profitWei?: string; /** 预估卖出输出(OKB wei) */ quotedSellOutWei?: string; /** ✅ AA:转账多跳数(仅 xlayer AA 使用;不影响 BSC) */ disperseHopCount?: string; }; } /** * 批量捆绑换手参数(一卖多买) */ export interface BundleBatchSwapParams { /** 交易类型:FLAP (内盘), V2 (外盘 V2), V3 (外盘 V3) */ tradeType?: 'FLAP' | 'V2' | 'V3'; /** DEX 标识(用于选择正确的 Router) */ dexKey?: string; /** 显式指定 Router 地址(若不传则由 SDK 根据 dexKey 自动决定) */ routerAddress?: string; /** LP 费率档位 (V3 专用): 0=STANDARD (0.25%), 1=LOW (0.01%), 2=HIGH (1%) */ lpFeeProfile?: number; /** 代币地址 */ tokenAddress: string; /** 卖方 Owner 私钥 */ sellerPrivateKey: string; /** 买方 Owner 私钥列表 */ buyerPrivateKeys: string[]; /** 每个买方的买入 OKB 数量(字符串,长度必须与 buyerPrivateKeys 一致) */ buyAmountsOkb: string[]; /** 卖出数量(人类可读字符串,按代币 decimals 解析);优先于 sellPercent */ sellAmount?: string; /** 卖出比例(0-100,默认 100) */ sellPercent?: number; /** ✅ ERC20 稳定币支持(对齐 BSC):输出代币地址(如 USDT/USDC/USDT0),不传则使用原生代币 OKB */ quoteToken?: string; /** ✅ ERC20 稳定币精度(默认 6,XLayer USDT/USDC/USDT0 都是 6 位精度) */ quoteTokenDecimals?: number; /** * ✅ 资金利用率模式(对齐 BSC) * - true(默认):卖出 → 分发 → 买入(资金来自卖出所得,对应 BSC flapQuickBatchSwapMerkle) * - false:卖出 → 买入(买方自带资金,对应 BSC flapBatchSwapMerkle) */ capitalMode?: boolean; /** * ✅ 转账多跳数(AA 专用,仅 capitalMode=true 时生效) * * 用途:卖出所得 OKB 需要在同一笔 handleOps 内分发给多个买方 AA(Sender)。 * - 0:卖方 AA(Sender) 直接分发给所有买方 AA(Sender) * - >0:按"多跳"方式分发(实现位于 xlayer/*,不会影响 BSC bundle/merkle) */ disperseHopCount?: number; /** * ✅ 前端传入的 gasPrice(Gwei) * - 如果不传,SDK 会调用 getFeeData 获取当前 gas 价格 * - 建议:前端获取当前 gas 价格后传入,确保 prefund 计算一致 */ gasPriceGwei?: number; /** * ✅ 买入操作的 callGasLimit * - DEX 买入默认 650,000 * - Portal 买入默认 450,000 * - 前端可根据实际情况调整 */ buyerCallGasLimit?: bigint; /** * ✅ 多跳转账的 callGasLimit * - 默认 150,000 * - 前端可根据实际情况调整 */ hopCallGasLimit?: bigint; /** * ✅ 买入模式(V3 交易专用) * - 'exactInput'(默认):花费固定 OKB,买尽可能多的代币(保证交易成功,但代币数量不确定) * - 'exactOutput':买固定数量代币,花尽可能少的 OKB(保证买到预期数量,但可能失败) * * 注意: * - exactOutput 需要配合 buyAmountsToken 使用 * - 如果 OKB 不足以买到预期数量,交易会失败 * - V2 交易不支持 exactOutput,会自动回退到 exactInput */ buyMode?: 'exactInput' | 'exactOutput'; /** * ✅ 每个买方要买入的代币数量(字符串,用于 exactOutput 模式) * - 长度必须与 buyerPrivateKeys 一致 * - 仅在 buyMode = 'exactOutput' 时使用 * - 代币数量会按代币的 decimals 解析 */ buyAmountsToken?: string[]; /** 配置覆盖 */ config?: Partial; } export interface BundleBatchSwapResult { swapResult: HandleOpsResult; metadata: { sellerOwner: string; sellerSender: string; buyerOwners: string[]; buyerSenders: string[]; sellAmountWei: string; buyAmountsWei: string[]; hasApprove: boolean; routeAddress?: string; /** 是否提取利润 */ extractProfit?: boolean; /** 利润比例 bps */ profitBps?: number; /** 利润接收地址 */ profitRecipient?: string; /** 预估利润(OKB wei) */ profitWei?: string; /** 预估卖出输出(OKB wei) */ quotedSellOutWei?: string; /** ✅ AA:转账多跳数(仅 xlayer AA 使用;不影响 BSC) */ disperseHopCount?: string; }; } export interface BundleBatchSwapSignParams extends BundleBatchSwapParams { payerPrivateKey?: string; beneficiary?: string; payerStartNonce?: number; handleOpsGasLimit?: bigint; routeAddress?: string; } export interface BundleBatchSwapSignResult { signedTransactions: string[]; /** ✅ 多跳中转钱包列表(用作资金中转的买方钱包,交易失败时可找回资金) */ hopWallets?: Array<{ address: string; privateKey: string; }>; metadata: { payer: string; beneficiary: string; sellerOwner: string; sellerSender: string; buyerOwners: string[]; buyerSenders: string[]; sellAmountWei: string; buyAmountsWei: string[]; hasApprove: boolean; routeAddress?: string; /** 是否提取利润 */ extractProfit?: boolean; /** 利润比例 bps */ profitBps?: number; /** 利润接收地址 */ profitRecipient?: string; /** 预估利润(OKB wei) */ profitWei?: string; /** 预估卖出输出(OKB wei) */ quotedSellOutWei?: string; /** ✅ AA:转账多跳数(仅 xlayer AA 使用;不影响 BSC) */ disperseHopCount?: string; /** ✅ 利润刮取模式:payer-eoa=由Payer EOA独立刮取,seller-aa=由Seller AA在分发中刮取 */ profitMode?: 'payer-eoa' | 'seller-aa'; }; } /** * 刷量参数 */ export interface VolumeParams { /** 代币地址 */ tokenAddress: string; /** Owner 私钥列表 */ privateKeys: string[]; /** 每轮买入金额(OKB) */ buyAmountPerRound: string; /** 刷量轮数 */ rounds: number; /** 每轮间隔时间(毫秒,默认 3000) */ intervalMs?: number; /** 每轮是否立即卖出(默认 true) */ sellImmediately?: boolean; /** 配置覆盖 */ config?: Partial; } /** * 捆绑买入结果 */ export interface BundleBuyResult { /** 买入交易结果 */ buyResult: HandleOpsResult; /** 转账交易结果(如果 transferBackToOwner) */ transferResult?: HandleOpsResult; /** 各 sender 的代币余额 */ tokenBalances: Map; } /** * 捆绑卖出结果 */ export interface BundleSellResult { /** 卖出交易结果 */ sellResult: HandleOpsResult; /** 归集交易结果(如果 withdrawToOwner) */ withdrawResult?: HandleOpsResult; /** * 利润汇总(如果 withdrawToOwner=true 且实际归集金额>0) * - 注意:AA 的 handleOps tx.value 永远是 0;利润是“从 AA Sender 余额里拆分转走”的金额 */ profit?: { extractProfit: boolean; profitBps: number; profitRecipient: string; totalProfitWei: string; }; } /** * 捆绑买卖结果 */ export interface BundleBuySellResult { /** 买入阶段结果 */ buyResult: HandleOpsResult; /** 卖出阶段结果 */ sellResult: HandleOpsResult; /** 归集阶段结果(如果 withdrawToOwner) */ withdrawResult?: HandleOpsResult; /** 各 sender 的最终 OKB 余额 */ finalBalances: Map; /** 利润汇总(如果 withdrawToOwner=true 且实际归集金额>0) */ profit?: { extractProfit: boolean; profitBps: number; profitRecipient: string; totalProfitWei: string; }; } /** * 刷量结果 */ export interface VolumeResult { /** 成功轮数 */ successRounds: number; /** 失败轮数 */ failedRounds: number; /** 每轮结果 */ roundResults: BundleBuySellResult[]; /** 总交易量(OKB) */ totalVolume: bigint; }