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

Uniswap V2 swap函数中balance0与balance1的含义解析

Uniswap V2 Pair合约swap()函数中balance0/balance1的含义及流程解析

问题答案

选项C正确,以下是具体解释:

这两行代码:

balance0 = IERC20(_token0).balanceOf(address(this));
balance1 = IERC20(_token1).balanceOf(address(this));

获取的是当前Uniswap V2 Pair合约自身持有的token0和token1的实时余额,是执行到该代码行时的即时数值:

  • 不属于发起swap的用户,因此选项B错误;
  • 也不一定和上一次swap后的_reserve0/_reserve1一致(因为用户发起swap时已经将待交换的代币转入合约,此时合约余额已经发生变化),因此选项A错误。

swap()函数核心流程(简洁版)

  1. 用户触发交易:用户通过Uniswap Router调用Pair合约的swap(),Router会先将用户要交换的代币转入Pair合约。
  2. 获取实时余额:执行你提到的两行代码,查询合约当前持有的两种代币的实际余额。
  3. 计算用户转入量:通过balance0 - _reserve0或balance1 - _reserve1,算出用户实际转入的代币数量(_reserve0/_reserve1是合约上一次同步后存储的储备值)。
  4. 计算应转出量:基于Uniswap V2的恒定乘积公式x*y=k,结合0.3%的交易手续费(其中0.25%分配给流动性提供者,0.05%为协议费,默认关闭),计算需要给用户转出的另一种代币数量。
  5. 执行代币转出:调用ERC20的transfer()方法,将计算好的代币数量转到用户指定的接收地址。
  6. 同步储备值:更新合约存储的_reserve0和_reserve1为转出代币后的合约实时余额,完成swap流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:05:25