BSEX交易所开发稳定版丨BSEX交易所系统开发实现技术方案及详情丨源码功能
什么是DAp,pDApp应用需要满足那些条件
什么是Dapp?
DApp是Decentralized Application的缩写,译为:分散式的应用程序。App我们都知道,我们在智能手机上安装的应用程序也就是App。而DApp比App多了一个‘D’,‘D’的意思是分散式的。所以,它的意思是分散式的应用程序/去中心化的应用程序。
DApp是一种互联网应用程序,与传统的App最大的区别是:DApp运行在去中心化的网络上,也就是区块链网络中。网络中不存在中心化的节点可以完整的控制DApp。
Dapp(去中心化应用程序)是一种开源的应用程序,开发流程:I35需求7O98开发O7I8,自动运行,将其数据存储在区块链上,以密码令牌的形式激励,并以显示有价值证明的协议进行操作。
function addLiquidityETH(//添加流动性,其中一个币种是eth
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,//eth最小输入量;对应的Desired在msg.value
address to,
uint deadline
)external virtual override payable ensure(deadline)returns(uint amountToken,uint amountETH,uint liquidity){
//调用内部方法_addLiquidity获取到两个币实际所需要的数量
//eth使用weth代币替代
(amountToken,amountETH)=_addLiquidity(
token,
WETH,
amountTokenDesired,
msg.value,//ethDesired
amountTokenMin,
amountETHMin
);
address pair=UniswapV2Library.pairFor(factory,token,WETH);//获取到pair地址
TransferHelper.safeTransferFrom(token,msg.sender,pair,amountToken);//给pair转代币数量
IWETH(WETH).deposit{value:amountETH}();//调用weth的兑换方法,通过eth换weth
assert(IWETH(WETH).transfer(pair,amountETH));//给pair转weth数量
liquidity=IUniswapV2Pair(pair).mint(to);//调用pair的mint方法,会有添加的lp数量返回
//refund dust eth,if any
//如果传入的eth数量,大于实际所需的eth数量,将剩余的eth返还给用户
if(msg.value>amountETH)TransferHelper.safeTransferETH(msg.sender,msg.value-amountETH);
}
//****REMOVE LIQUIDITY****
function removeLiquidity(//移除流动性,该方法需要先将lp代币授权给路由合约,才能代扣lp
address tokenA,
address tokenB,
uint liquidity,//移除lp的数量,转入lp得另外两个币
uint amountAMin,//A的最小输出量
uint amountBMin,//B的最小输出量
address to,//接收两个币的地址
uint deadline
)public virtual override ensure(deadline)returns(uint amountA,uint amountB){
address pair=UniswapV2Library.pairFor(factory,tokenA,tokenB);//获取pair地址
IUniswapV2Pair(pair).transferFrom(msg.sender,pair,liquidity);//将lp转到pair地址
//send liquidity to pair
(uint amount0,uint amount1)=IUniswapV2Pair(pair).burn(to);//调用pair的burn方法,内部会将两个币的数量转给to,返回值就是两个代币的输出数量
(address token0,)=UniswapV2Library.sortTokens(tokenA,tokenB);//通过排序确认两个amountA/B
(amountA,amountB)=tokenA==token0?(amount0,amount1):(amount1,amount0);
//校验A/B的输出量需要小于参数中要求的最小量,否则交易失败
require(amountA>=amountAMin,'UniswapV2Router:INSUFFICIENT_A_AMOUNT');
require(amountB>=amountBMin,'UniswapV2Router:INSUFFICIENT_B_AMOUNT');
}
function removeLiquidityETH(//移除流动性(其中一个返还币是ETH),该方法需要先将lp代币授权给路由合约,才能代扣lp
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,//eth最小输出量
address to,
uint deadline
)public virtual override ensure(deadline)returns(uint amountToken,uint amountETH){
//调用上面的removeLiquidity方法,传入的是WETH
(amountToken,amountETH)=removeLiquidity(
token,
WETH,
liquidity,
amountTokenMin,
amountETHMin,
address(this),//注意!接收币的地址是路由
deadline
);
//将代币转给to
TransferHelper.safeTransfer(token,to,amountToken);
IWETH(WETH).withdraw(amountETH);//将weth转换成eth
TransferHelper.safeTransferETH(to,amountETH);//将eth转给to
}