column1 | column2 | column3 |
---|---|---|
column1 | column2 | column3 |
column1 | column2 | column3 |
column1 | column2 | column3 |
现阶段,Web3.0处于早期发展阶段。由于web3.0具有“智能机器广泛参与到网络过程”的鲜明特征,所以Web3.0的发展将离不开云计算、大数据、人工智能、物联网、区块链等相关技术。而区块链技术是Web3.0最关键的技术。
区块链技术和NFT(数字凭证)技术是元宇宙经济体系的重要支撑。区块链是一个分布式的共享账本和数据库,具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。
Uniswap-v2 Router合约分析
Router合约是用户使用Uniswap-v2进行交换直接调用的合约,通过分析它可以深入了解Uniswap-v2的产品使用和运行逻辑。
增加流动性
function _addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin
)internal virtual returns(uint amountA,uint amountB){
if(IUniswapV2Factory(factory).getPair(tokenA,tokenB)==address(0)){
IUniswapV2Factory(factory).createPair(tokenA,tokenB);
}
(uint reserveA,uint reserveB)=UniswapV2Library.getReserves(factory,tokenA,tokenB);
if(reserveA==0&&reserveB==0){
(amountA,amountB)=(amountADesired,amountBDesired);
}else{
uint amountBOptimal=UniswapV2Library.quote(amountADesired,reserveA,reserveB);
if(amountBOptimal<=amountBDesired){
require(amountBOptimal>=amountBMin,'UniswapV2Router:INSUFFICIENT_B_AMOUNT');
(amountA,amountB)=(amountADesired,amountBOptimal);
}else{
uint amountAOptimal=UniswapV2Library.quote(amountBDesired,reserveB,reserveA);
assert(amountAOptimal<=amountADesired);
require(amountAOptimal>=amountAMin,'UniswapV2Router:INSUFFICIENT_A_AMOUNT');
(amountA,amountB)=(amountAOptimal,amountBDesired);
}
}
}
参数分析
函数_addLiquidity的入参有6个,出参有2个,对应的解释如下:
function _addLiquidity(
address tokenA,//添加流动性tokenA的地址
address tokenB,//添加流动性tokenB的地址
uint amountADesired,//期望添加tokenA的数量
uint amountBDesired,//期望添加tokenB的数量
uint amountAMin,//添加tokenA的最小数量
uint amountBMin//添加tokenB的最小数量
)internal virtual returns(
uint amountA,//实际添加tokenA的数量
uint amountB//实际添加tokenB的数量
){
...
}
function _addLiquidity(
address tokenA,//添加流动性tokenA的地址
address tokenB,//添加流动性tokenB的地址
uint amountADesired,//期望添加tokenA的数量
uint amountBDesired,//期望添加tokenB的数量
uint amountAMin,//添加tokenA的最小数量
uint amountBMin//添加tokenB的最小数量
)internal virtual returns(
uint amountA,//实际添加tokenA的数量
uint amountB//实际添加tokenB的数量
){
...
}
...
{
//如果tokenA,tokenB的流动池不存在,就创建流动池
if(IUniswapV2Factory(factory).getPair(tokenA,tokenB)==address(0)){
IUniswapV2Factory(factory).createPair(tokenA,tokenB);
}
//获取tokenA,tokenB的目前库存数量
(uint reserveA,uint reserveB)=UniswapV2Library.getReserves(factory,tokenA,tokenB);
if(reserveA==0&&reserveB==0){
//如果库存数量为0,也就是新建tokenA,tokenB的流动池,那么实际添加的amountA,amountB就是amountADesired和amountBDesired
(amountA,amountB)=(amountADesired,amountBDesired);
}else{
//reserveA*reserveB/amountADesired,算出实际要添加的tokenB数量amountBOptimal
uint amountBOptimal=UniswapV2Library.quote(amountADesired,reserveA,reserveB);
if(amountBOptimal<=amountBDesired){
//如果amountBMin<=amountBOptimal<=amountBDesired,amountA和amountB就是amountADesired和amountBOptimal
require(amountBOptimal>=amountBMin,'UniswapV2Router:INSUFFICIENT_B_AMOUNT');
(amountA,amountB)=(amountADesired,amountBOptimal);
}else{
//reserveA*reserveB/amountBDesired,算出实际要添加的tokenA数量amountAOptimal
uint amountAOptimal=UniswapV2Library.quote(amountBDesired,reserveB,reserveA);
//如果amountAMin<=amountAOptimal<=amountADesired,amountA和amountB就是amountAOptimal和amountBDesired
assert(amountAOptimal<=amountADesired);
require(amountAOptimal>=amountAMin,'UniswapV2Router:INSUFFICIENT_A_AMOUNT');
(amountA,amountB)=(amountAOptimal,amountBDesired); 作者:WV_yy625019 https://www.bilibili.com/read/cv21132277 出处:bilibili