[英]Uniswap v2 swap() function. What are balance0 & balance1?
我正在学习 Uniswapv2 合约是如何工作的,但我似乎无法全神贯注于swap()
function。
参考: https://github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Pair.sol#L173
第 173-174 行包含:
balance0 = IERC20(_token0).balanceOf(address(this));
balance1 = IERC20(_token1).balanceOf(address(this));
我的问题是,这些余额是什么时候和谁的?
A. 这些与最近交换后的_reserve0
和_reserve1
相同,将用于同步储备。
B. 这些是进行交换的用户当前拥有的每个令牌的数量。
C 以上都不是。 这是另一回事。 请解释一下这个function的流程。我在任何地方都找不到清晰简洁的定义。
答案是“C”:)
balanceOf
是ERC20
实现中的一个映射,用于返回给定地址持有的数量:
// address => holds uint amount
mapping(address => uint) public balanceOf;
由于当前合约继承自UniswapV2ERC20
:
contract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20{}
它可以访问UniswapV2ERC20.sol
由于映射balanceOf
是公共的,solidity 将 getters 分配给公共变量
在函数中:
balance0 = IERC20(_token0).balanceOf(address(this));
balance1 = IERC20(_token1).balanceOf(address(this));
address(this)
指的是当前合约UniswapV2Pair
。 所以balance0
是当前合约拥有_token0
而balance1
是当前合约地址拥有_token1
。 token0
和token1
是合约地址,每个ERC20
币合约都会跟踪地址及其余额。 所以你正在访问每个代币合约并获得当前合约的余额。
把ERC20
合约想象成银行。 你有token0
银行和token1
银行。 每家银行都会跟踪其用户的余额。 balancesOf
是ERC20
代币存储这些余额的地方。 您当前的合约也拥有其中一些代币,因此您只想获得当前合约持有的代币数量
swap
function 将被用户调用。 在执行掉期之前,合约检查它是否有足够的资金
uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
require(amount0In > 0 || amount1In > 0, 'UniswapV2: INSUFFICIENT_INPUT_AMOUNT');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.