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

Sepolia链Uniswap V2添加流动性后,代币与ETH兑换失败求助

问题描述

我在Sepolia链部署了ERC20合约,并在Uniswap V2中添加了流动性,但尝试将该代币与ETH兑换时,代币价格无法计算,无法完成兑换。

合约代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract V2DummyToken is ERC20, Ownable {
    uint8 private _customDecimals;

    constructor(address initialOwner, uint8 decimals_)
        ERC20("V2Dummy", "V2D")
        Ownable(initialOwner)
    {
        _customDecimals = decimals_;
        _mint(msg.sender, 320_000_000 * 10 ** decimals());
    }

    // Override the decimals function
    function decimals() public view virtual override returns (uint8) {
        return _customDecimals;
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }
}
问题分析与解决方案

核心诱因

Uniswap V2的价格计算依赖ERC20代币的decimals()返回值做单位换算,你的问题大概率和小数位数不匹配或者流动性储备异常有关:

  • 要么是Uniswap前端未正确读取合约的自定义小数位数,导致金额换算错误;
  • 要么是添加流动性时的代币/ETH金额比例异常,甚至其中一项储备为0。

具体排查修复步骤

  1. 验证合约小数位数:通过区块浏览器调用合约的decimals()只读方法,确认返回值和你部署时传入的decimals_参数一致。若不一致,说明部署时参数传递错误,需重新部署合约。
  2. 重新同步Uniswap前端数据:删除Uniswap钱包中已添加的该代币,重新通过合约地址添加,确保前端正确拉取最新的decimals值。部分情况下前端会缓存旧数据,导致计算逻辑出错。
  3. 检查流动性添加交易:在Sepolia区块浏览器查看你添加流动性的交易记录,确认代币转账金额和ETH转账金额都不为0,且比例合理。若其中一项金额为0,Pair合约的储备会异常,直接导致价格无法计算。
  4. 查看Pair合约储备:找到你的代币与ETH的Uniswap Pair合约,调用getReserves()方法,确认返回的两个储备值都大于0。若任一储备为0,需重新添加流动性(确保代币和ETH都正常转入Pair合约)。
  5. 核对铸币量计算:构造函数中_mint的金额是320_000_000 * 10 ** decimals(),这里的decimals()会调用你重写后的方法,若部署时传入的decimals_是6,实际铸币量是320000000 * 1e6 wei,确认你添加流动性时转出的代币数量是基于这个小数位数的正确值(比如要转1000个代币,实际要转1000 * 1e6 wei)。

额外提示

Uniswap V2对非18位小数的代币兼容性没问题,但必须确保前端和合约的decimals值完全一致。如果手动添加代币时需要手动输入小数位数,一定要和合约中的_customDecimals严格匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:05:04