You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用web3py实现Uniswap V2与V3跨池原子交易?

跨Uniswap V2/V3的原子交易实现方案

Uniswap官方确实没有提供跨版本的直接交易函数,但你可以通过以下两种方式实现这笔原子交易(确保两步兑换在同一个区块内完成,任意一步失败则整体回滚):

1. 自定义Solidity合约封装(最灵活可控)

你可以编写一个简单合约,在同一个函数内依次调用Uniswap V2和V3的兑换逻辑,天然保证原子性。

核心思路

  • 先调用Uniswap V2的swapExactTokensForTokens完成ELON到WETH的兑换
  • 再调用Uniswap V3的exactInputSingle完成WETH到USDC的兑换
  • 两步操作在同一个函数内执行,任何一步失败都会触发整个交易回滚

简化代码示例

// 导入必要接口
interface IUniswapV2Router {
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

interface IUniswapV3Router {
    function exactInputSingle(
        ExactInputSingleParams calldata params
    ) external returns (uint amountOut);

    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint deadline;
        uint amountIn;
        uint amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }
}

interface IERC20 {
    function transferFrom(address from, address to, uint value) external returns (bool);
    function approve(address spender, uint value) external returns (bool);
}

contract CrossVersionSwap {
    // 主网路由地址(测试网需替换对应地址)
    address public constant V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address public constant V3_ROUTER = 0xE592427A0AEce92De3Edee1F18E0157C05861564;
    
    // 替换为实际代币地址和池手续费
    address public constant ELON = 0x...;
    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
    uint24 public constant WETH_USDC_FEE = 3000; // 0.3%手续费池

    function swapELONtoUSDC(
        uint amountIn,
        uint minV2Out,
        uint minV3Out,
        uint deadline
    ) external {
        // 1. 用户授权合约转移ELON,执行V2兑换
        IERC20(ELON).transferFrom(msg.sender, address(this), amountIn);
        IERC20(ELON).approve(V2_ROUTER, amountIn);
        
        address[] memory v2Path = new address[](2);
        v2Path[0] = ELON;
        v2Path[1] = WETH;
        uint[] memory amounts = IUniswapV2Router(V2_ROUTER).swapExactTokensForTokens(
            amountIn,
            minV2Out,
            v2Path,
            address(this),
            deadline
        );
        uint wethAmount = amounts[1];

        // 2. 授权V3路由转移WETH,执行V3兑换
        IERC20(WETH).approve(V3_ROUTER, wethAmount);
        
        IUniswapV3Router.ExactInputSingleParams memory params = IUniswapV3Router.ExactInputSingleParams({
            tokenIn: WETH,
            tokenOut: USDC,
            fee: WETH_USDC_FEE,
            recipient: msg.sender,
            deadline: deadline,
            amountIn: wethAmount,
            amountOutMinimum: minV3Out,
            sqrtPriceLimitX96: 0 // 不限制价格滑点(可根据需求设置)
        });
        IUniswapV3Router(V3_ROUTER).exactInputSingle(params);
    }
}

注意事项

  • 用户需先给合约授权ELON的花费额度
  • 设置合理的minV2Out和minV3Out防止滑点损失过大
  • 合约部署前需确认各地址和参数对应目标链的正确值

2. 使用第三方聚合路由合约

诸如1inch、Paraswap等DEX聚合器的合约已封装跨Uniswap V2/V3的路由逻辑,你可以直接调用它们的聚合交易函数完成原子兑换。这种方式无需自行开发合约,但需注意第三方合约的安全性和手续费成本。

内容的提问来源于stack exchange,提问作者tinyhodler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:55:14