跳转到主要内容

Universal Router

Universal Router 是一个单一的智能合约,可以跨 V2 和 V3 池执行交易。它是 Kroko DEX 所有交易操作的统一入口。

为什么需要 Universal Router?

如果没有它,通过 V2 和 V3 交易需要分别使用不同的合约和不同的交易。Universal Router:
  • 统一执行 — 一个合约处理 V2、V3 和混合协议交易
  • 支持复杂路由 — 跨 V2 和 V3 池的多跳交易
  • 降低 Gas — 在单笔交易中批量处理操作
  • 集成 Permit2 — 通过 Permit2 拉取代币以简化授权

工作原理

Universal Router 通过其 execute() 函数接收编码的命令输入
function execute(
    bytes calldata commands,
    bytes[] calldata inputs,
    uint256 deadline
) external payable;
  • commands:一个字节字符串,每个字节是一个命令代码(如 V2_SWAP_EXACT_IN、V3_SWAP_EXACT_IN、WRAP_ETH、UNWRAP_WETH 等)
  • inputs:每个命令的 ABI 编码参数
  • deadline:超过此 Unix 时间戳后交易将回滚

典型交易流程

1. Swap API 寻找最优路由
2. Swap API 将路由编码为 Universal Router 命令
3. 前端从 API 接收 { to, data, value }
4. 用户签名并发送交易
5. Universal Router 按顺序执行命令
开发者不需要手动编码命令 — Swap API 会处理这些。你只需转发响应:
const tx = await signer.sendTransaction({
  to: swapData.to,      // Universal Router 地址
  data: swapData.data,  // 编码的 execute() calldata
  value: swapData.value // 原生 KAS 金额(ERC-20 到 ERC-20 时为 0)
});

滑点保护

编码的 calldata 包含链上滑点检查:
交易类型保护机制描述
Exact InputminAmountOut如果输出低于最小值则回滚
Exact OutputmaxAmountIn如果输入超过最大值则回滚
这些检查由 Universal Router 在链上强制执行,而不仅仅是 API。

原生 KAS 处理

当交易涉及原生 KAS(非 WKAS)时,Universal Router 自动:
  • 卖出 KAS:在交易前将作为 msg.value 发送的 KAS 包装为 WKAS
  • 买入 KAS:在交易后将 WKAS 解包为 KAS 并发送给接收者
当原生 KAS 是输入代币时,Swap API 响应中的 value 字段非零。