**背景:**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; // 最小可接受输出
}
路径编码(重要):
tokenX (20 bytes) | fee (3 bytes) | tokenY (20 bytes)token0|fee0|token1|fee1|token2|...