智能合约是基于区块链的,同时其本质是一系列代码的合集,用于自动完成某些特定的功能。由于Web 3.0网络将通过去中心化协议运行,它们将通过智能合约实现互操作、无缝集成、自动化。
所谓的智能合约,简单来说就是已经设定好的一段计算机程序,当合约双方在区块链上进行交易时,满足条件即可触发程序自动执行合约内容。
智能合约具有去中心化、透明且不可违背、自动性、不可篡改、匿名性等特点
外部函数(仅供合约外部调用)
addLiquidity
代码速浏览
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
)external virtual override ensure(deadline)returns(uint amountA,uint amountB,uint liquidity){
(amountA,amountB)=_addLiquidity(tokenA,tokenB,amountADesired,amountBDesired,amountAMin,amountBMin);
address pair=UniswapV2Library.pairFor(factory,tokenA,tokenB);
TransferHelper.safeTransferFrom(tokenA,msg.sender,pair,amountA);
TransferHelper.safeTransferFrom(tokenB,msg.sender,pair,amountB);
liquidity=IUniswapV2Pair(pair).mint(to);
}
参数分析
函数addLiquidity的入参有8个,出参有3个,对应的解释如下:
function addLiquidity(
address tokenA,//添加流动性tokenA的地址
address tokenB,//添加流动性tokenB的地址
uint amountADesired,//期望添加tokenA的数量
uint amountBDesired,//期望添加tokenB的数量
uint amountAMin,//添加tokenA的最小数量
uint amountBMin//添加tokenB的最小数量
address to,//获得的LP发送到的地址
uint deadline//过期时间
)external virtual override ensure(deadline)returns(
uint amountA,//实际添加tokenA的数量
uint amountB//实际添加tokenB的数量
uint liquidity//获得LP的数量
){
...
}
相比于内部函数_addLiquidity,addLiquidity函数的入参多了to和deadline,to可以指定LP(流动性凭证)发送到哪个地址,而deadline则设置交易过期时间。出参则多了一个liquidity,指LP的数量。
实现分析:
...
//检查交易是否过期
ensure(deadline){
//计算实际添加的amountA,amountB
(amountA,amountB)=_addLiquidity(tokenA,tokenB,amountADesired,amountBDesired,amountAMin,amountBMin);
//获取tokenA,tokenB的流动池地址
address pair=UniswapV2Library.pairFor(factory,tokenA,tokenB);
//用户向流动池发送数量为amountA的tokenA,amountB的tokenB
TransferHelper.safeTransferFrom(tokenA,msg.sender,pair,amountA);
TransferHelper.safeTransferFrom(tokenB,msg.sender,pair,amountB);
//流动池向to地址发送数量为liquidity的LP
liquidity=IUniswapV2Pair(pair).mint(to);
}