**背景:**SwapRouter02 是 PotatoSwap 的统一路由合约,同时支持 V2 和 V3 协议的代币交换。第三方 DApp、钱包、聚合器可通过 SwapRouter02 一站式完成 V2/V3 交换、流动性管理等操作。

部署网络

合约地址

**建议:**优先使用 SwapRouter02 完成代币交换(V2 或 V3)。成交、流动性与价格变动事件由 Pool 合约发出,而非 Router。

1 - V3 Swap 接口

SwapRouter02 继承了完整的 V3 交换功能,接口与标准 V3 Router 完全一致。

1.1 - exactInputSingle:精确输入单池(V3)

function exactInputSingle(ExactInputSingleParams calldata params)
  external
  payable
returns (uint256 amountOut);  // 最终发送给 recipient 的 tokenOut 数量

ExactInputSingleParams 入参数结构体:

struct ExactInputSingleParams {
  address tokenIn;            // 输入代币地址
  address tokenOut;           // 输出代币地址
  uint24  fee;                // 该池费率 (100/500/3000/10000)
  address recipient;          // 收款人地址
  uint256 amountIn;           // 精确输入数量
  uint256 amountOutMinimum;   // 可接受的最小输出 (防滑点)
  uint160 sqrtPriceLimitX96;  // 价格限制 (0 表示不限制)
}

amountIn 的精确输入,在指定 fee 的 V3 池中把 tokenIn → tokenOut,得到尽可能多的 amountOut,要求 amountOut ≥ amountOutMinimum。

1.2 - exactInput:精确输入多跳(V3)

function exactInput(ExactInputParams calldata params)
  external
  payable
returns (uint256 amountOut);  // 最终发给 recipient 的输出代币数量

ExactInputParams 入参数结构体:

struct ExactInputParams {
  bytes   path;               // 编码的多跳路径 (tokenA|fee|tokenB|fee|tokenC|...)
  address recipient;          // 收款人地址
  uint256 amountIn;           // 精确输入数量
  uint256 amountOutMinimum;   // 最小可接受输出
}

路径编码(重要):