区块链和元宇宙,一个象征极简自由的去中心化技术,一个代表互联网未来的新概念,两者会有什么联系呢?
我们现在所看到的元宇宙,并不仅仅只是包含了区块链技术,还包含了VR/AR技术、人工智能技术等诸多技术门类。
从本质上来看,元宇宙是一种新的数据传输方式的开始。它实现了现实世界和虚拟世界之间数据传输的双向自由流动,构建了一个不完全相同于物理现实的虚拟世界。
数据传输的自由流动是虚拟世界与现实世界融合、实物资产与数字资产对接的前提和基础。
swapExactTokensForETH
代码速浏览
function swapExactTokensForETH(uint amountIn,uint amountOutMin,address[]calldata path,address to,uint deadline)
external
virtual
override
ensure(deadline)
returns(uint[]memory amounts)
{
require(path[path.length-1]==WETH,'UniswapV2Router:INVALID_PATH');
amounts=UniswapV2Library.getAmountsOut(factory,amountIn,path);
require(amounts[amounts.length-1]>=amountOutMin,'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT');
TransferHelper.safeTransferFrom(
path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]
);
_swap(amounts,path,address(this));
IWETH(WETH).withdraw(amounts[amounts.length-1]);
TransferHelper.safeTransferETH(to,amounts[amounts.length-1]);
参数分析
函数swapExactTokensForETH的入参有5个,出参有1个,对应的解释如下:
function swapExactTokensForETH(
uint amountIn,//交易支付代币数量
uint amountOutMin,//交易获得代币最小值
address[]calldata path,//交易路径列表
address to,//交易获得的token发送到的地址
uint deadline//过期时间
)external virtual override ensure(deadline)returns(
uint[]memory amounts//交易期望数量列表
){
函数swapExactTokensForETH和函数swapTokensForExactETH相比,是更换了输入精确数量代币的顺序。
实现分析
...
//检查交易是否过期
ensure(deadline)
{
//检查path[path.length-1]是否为WETH地址
require(path[path.length-1]==WETH,'UniswapV2Router:INVALID_PATH');
//获取path列表下,支付amountIn数量的path[0]代币,各个代币交易的预期数量
amounts=UniswapV2Library.getAmountsOut(factory,amountIn,path);
//如果最终获得的代币数量小于amountOutMin,则交易失败
require(amounts[amounts.length-1]>=amountOutMin,'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT');
//将amounts[0]数量的path[0]代币从用户账户中转移到path[0],path[1]的流动池
TransferHelper.safeTransferFrom(
path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]
);
//按path列表执行交易集合
_swap(amounts,path,address(this));
//将WETH换成ETH
IWETH(WETH).withdraw(amounts[amounts.length-1]);
//把ETH发送给to地址
TransferHelper.safeTransferETH(to,amounts[amounts.length-1]);
总结
此函数一般用于出售确定数量代币,获得不确定数量的ETH。
swapETHForExactTokens
代码速浏览
function swapETHForExactTokens(uint amountOut,address[]calldata path,address to,uint deadline)
external
virtual
override
payable
ensure(deadline)
returns(uint[]memory amounts)
{
require(path[0]==WETH,'UniswapV2Router:INVALID_PATH');
amounts=UniswapV2Library.getAmountsIn(factory,amountOut,path);
require(amounts[0]<=msg.value,'UniswapV2Router:EXCESSIVE_INPUT_AMOUNT');
IWETH(WETH).deposit{value:amounts[0]}();
assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]));
_swap(amounts,path,to);
if(msg.value>amounts[0])TransferHelper.safeTransferETH(msg.sender,msg.value-amounts[0]);
}
参数分析
函数swapETHForExactTokens的入参有4个,出参有1个,对应的解释如下:
function swapETHForExactTokens(
uint amountOut,//交易获得的代币数量
address[]calldata path,//交易路径列表
address to,//交易获得的token发送到的地址
uint deadline//过期时间
)external virtual override payable ensure(deadline)returns(
uint[]memory amounts//交易期望数量列表
){
函数swapETHForExactTokens和函数swapExactTokensForETH相比,更换了代币交易的顺序。
实现分析
...
//检查交易是否过期
ensure(deadline)
{
//检查path[0]是否为WETH地址
require(path[0]==WETH,'UniswapV2Router:INVALID_PATH');
//获取path列表下,获得amountOut数量的path[path.length-1]代币,各个代币交易的预期数量
amounts=UniswapV2Library.getAmountsIn(factory,amountOut,path);
//如果ETH数量小于amounts[0],交易失败
require(amounts[0]<=msg.value,'UniswapV2Router:EXCESSIVE_INPUT_AMOUNT');
//将WETH换成ETH
IWETH(WETH).deposit{value:amounts[0]}();
//将amounts[0]数量的path[0]代币从用户账户中转移到path[0],path[1]的流动池
assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]));
//按path列表执行交易集合
_swap(amounts,path,to);
//如果ETH数量大于amounts[0],返还多余的ETH
if(msg.value>amounts[0])TransferHelper.safeTransferETH(msg.sender,msg.value-amounts[0]);
}