Uniswap 是去中心化的,不仅跟传统的加密货币交易所不同,也跟普通的去中心化代币交易所不同。Uniswap 是一组部署到以太坊网络的合约,所有的交易都在链上进行。
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
(amountToken, amountETH) = _addLiquidity(
token,dapp流动性质押挖矿系统开发卫星:hkkf5566
WETH,
amountTokenDesired,
msg.value,
amountTokenMin,
amountETHMin
);
address pair = UniswapV2Library.pairFor(factory, token, WETH);
//把coin从合约调用者账户转到币对
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
//把发送的eth兑换成WETH到swap合约
IWETH(WETH).deposit{value: amountETH}();
//swap合约把上一步兑换的weth充值到币对
assert(IWETH(WETH).transfer(pair, amountETH));
//添加流动性
liquidity = IUniswapV2Pair(pair).mint(to);
// 把发送的多于的eth发回给调用者
if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
}
首先使用修改器做了一次时间戳校验,传入的时间戳必须大于当前区块的时间戳。
modifier ensure(uint deadline) {
require(deadline >= block.timestamp, 'UniswapV2Router: EXPIRED');
_;
}
然后调用了_addLiquidity
// **** ADD LIQUIDITY ****
function _addLiquidity(
address tokenA, //yp
address tokenB, // Weth
uint amountADesired, //yp amount
uint amountBDesired, // msg.value
uint amountAMin, //滑点后
uint amountBMin //滑点后
) internal virtual returns (uint amountA, uint amountB) {
// create the pair if it doesn't exist yet
//创建币对
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);
//计算出来的weth数量小于发送的eth数量
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);
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。