swap交易所代币合约流动性质押挖矿系统开发(开发案例)丨swap交易所代币合约流动性质押挖矿现成源码案例

简介:  综合来看,技术方面,Web 3.0不仅是过往技术迭代,更是多项科技的集成,包括5G、VR、AR、区块链、云计算、芯片、边缘计算等。具体地来看,Web3.0技术可分为基础层技术、平台层技术、交互层技术。相较于Web2.0时代,Web3.0涉及细分技术类别更多、范围更广,其中区块链技术由于其去中心化的特征,成为Web3.0核心底层基础技术

  综合来看,技术方面,Web 3.0不仅是过往技术迭代,更是多项科技的集成,包括5G、VR、AR、区块链、云计算、芯片、边缘计算等。具体地来看,Web3.0技术可分为基础层技术、平台层技术、交互层技术。相较于Web2.0时代,Web3.0涉及细分技术类别更多、范围更广,其中区块链技术由于其去中心化的特征,成为Web3.0核心底层基础技术。

  swap是普通用户进行代币交易的操作。普通用户通过swap操作实现两种token之间的交易。

  function swapExactTokensForTokens(

  uint amountIn,

  uint amountOutMin,

  address[]calldata path,

  address to,

  uint deadline

  )external virtual override ensure(deadline)returns(uint[]memory amounts){

  Uniswap支持多种代币的交换。具体的含义是,Uniswap提供了多级交易池的路由功能。举个例子,已有两个交易对TokenA-TokenB,以及TokenB-TokenC,通过swap接口,可以实现TokenA-TokenC的交换,其中经过的TokenA-TokenB,TokenB-TokenC,称为路径(path)。amountIn是路径中的第一个代币的数量,amountOutMin是期望的交换后的最少的数量。

  amounts=UniswapV2Library.getAmountsOut(factory,amountIn,path);

  require(amounts[amounts.length-1]>=amountOutMin,‘UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT’);

  amounts是每个路径上的交换后的数量。amounts[amounts.length-1]也就是最后一条路径的输出数量。注意,UniswapV2Library.getAmountsOut的实现(在获取每个交易对的reserve信息后,调用getAmountOut函数):

  function getAmountOut(uint amountIn,uint reserveIn,uint reserveOut)internal pure returns(uint amountOut){

  require(amountIn>0,'UniswapV2Library:INSUFFICIENT_INPUT_AMOUNT');

  require(reserveIn>0&&reserveOut>0,'UniswapV2Library:INSUFFICIENT_LIQUIDITY');

  uint amountInWithFee=amountIn.mul(997);

  uint numerator=amountInWithFee.mul(reserveOut);

  uint denominator=reserveIn.mul(1000).add(amountInWithFee);

  amountOut=numerator/denominator;

  }

  注意,其中的997/1000的系数。在进入每个交易池之前,进入的金额先扣除了0.3%的本金。这个就是交易费。注意的是,路径上的交易池,每个池子都收。有点像高速收费站,一段段的收。

  TransferHelper.safeTransferFrom(

  path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amounts[0]

  );

  将代币path[0],转入到交易对,数量为amounts[0]。转入代币后,进行真正的swap操作:

  function _swap(uint[]memory amounts,address[]memory path,address _to)internal virtual{

  for(uint i;i<path.length-1;i++){

  (address input,address output)=(path<i>,path[i+1]);

  (address token0,)=UniswapV2Library.sortTokens(input,output);

  uint amountOut=amounts[i+1];

  (uint amount0Out,uint amount1Out)=input==token0?(uint(0),amountOut):(amountOut,uint(0));

  address to=i<path.length-2?UniswapV2Library.pairFor(factory,output,path[i+2]):_to;

  IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output)).swap(

  amount0Out,amount1Out,to,new bytes(0)

  );

  }

  }

  原理比较简单,针对每一条路径,调用交易对的swap操作。

  Core逻辑

  Core逻辑实现了单个交易对的逻辑。通过UniswapV2Factory可以创建一个个Pair(交易池)。每个具体实现逻辑在UniswapV2Pair中。

  mint

  每个交易对创建流动性。

  function mint(address to)external lock returns(uint liquidity){

  因为在调用mint函数之前,在addLiquidity函数已经完成了转账,所以,从这个函数的角度,两种代币数量的计算方式如下:

  uint balance0=IERC20(token0).balanceOf(address(this));

  uint balance1=IERC20(token1).balanceOf(address(this));

  uint amount0=balance0.sub(_reserve0);

  uint amount1=balance1.sub(_reserve1);

  当前的balance是当前的reserve加上注入的流动性的代币数量。

  uint _totalSupply=totalSupply;//gas savings,must be defined here since totalSupply can update in _mintFee

  if(_totalSupply==0){

  liquidity=Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);

  _mint(address(0),MINIMUM_LIQUIDITY);//permanently lock the first MINIMUM_LIQUIDITY tokens

  }else{

  liquidity=Math.min(amount0.mul(_totalSupply)/_reserve0,amount1.mul(_totalSupply)/_reserve1);

  }

  _mint(to,liquidity);

  流动性liquidity的计算方式在第一次提供流动性时和其他时候稍稍不同。第一次提供流动性的计算公式如下:

  liquidity=sqrt(x0*y0)-min

  其中min是10^3。也就是说,第一次提供流动性是有最小流动性要求的。其他提供流动性的计算公式如下:

  liquidity=min((x0/reserve0totalsupply),(y0/reserve1totalsupply))

  也就说,按照注入的流动性和当前的reserve的占比一致。

  burn

  burn函数用在抽取流动性。burn逻辑和mint逻辑类似。

  function burn(address to)external lock returns(uint amount0,uint amount1){

  3.swap

  swap函数实现两种代币的兑换。

  function swap(uint amount0Out,uint amount1Out,address to,bytes calldata data)external lock{

  一个交易池的swap操作支持两个方向的兑换,可以从TokenA换到TokenB,或者TokenB换到TokenA。

  if(amount0Out>0)_safeTransfer(_token0,to,amount0Out);//optimistically transfer tokens

  if(amount1Out>0)_safeTransfer(_token1,to,amount1Out);//optimistically transfer tokens

  因为在swapExactTokensForTokens的getAmountOut函数已经确定兑换处的金额。所以,先直接转账。

  在不做swap之前,balance应该和reserve相等的。通过balance和reserve的差值,可以反推出输入的代币数量:

  uint amount0In=balance0>_reserve0-amount0Out?balance0-(_reserve0-amount0Out):0;

  uint amount1In=balance1>_reserve1-amount1Out?balance1-(_reserve1-amount1Out):0;

  确保反推的输入代币数量不小于零。

  require(amount0In>0||amount1In>0,‘UniswapV2:INSUFFICIENT_INPUT_AMOUNT’);

相关文章
|
存储 安全 算法
Swap薄饼交易所dapp链上合约质押模式系统开发稳定版
区块链本质上是一个去中心化的分布式账本数据库,目的是解决交易信任问题。
|
6月前
|
存储 人工智能 安全
swap去中心化交易所质押代币分红系统开发模式
区块链技术是Web3.0的基础技术,它可以提供去中心化的信任和安全保障。
|
算法 区块链
Defi+NFT质押流动性挖矿系统开发/LP质押挖矿功能开发解析
Defi+NFT质押流动性挖矿系统开发/LP质押挖矿功能开发解析
|
JavaScript 前端开发 区块链
DAPP代币合约流动性质押分红挖矿系统开发丨技术分析
DAPP代币合约流动性质押分红挖矿系统开发丨技术分析
|
存储 区块链 数据安全/隐私保护
DEFi代币质押挖矿理财分红模式智能合约dapp开发-Solidity源代码示例
DEFi代币质押挖矿理财分红模式智能合约dapp开发-Solidity源代码示例
|
安全 区块链 Python
defi/dapp代币合约链上开发案例丨dapp/defi链上代币合约swap薄饼去中心交易所系统开发实现技术及源码
 区块链最重要的功能,就是建立一种价值共识,而这个“共识”,主要基于“价值量化的能力”和“价值安全的过程”两个方面。先是“价值量化能力”:把一件事通过数字化的方式描述清楚,就是一个价值量化的过程。
|
存储 人工智能 安全
区块链合约交易所源码新币币交易所USDT秒合约杠杆C2C法币交易
迄今为止,已经有相当多的服务提供加密货币兑换服务。虚拟货币的流行度只增不减,交易平台的需求量也越来越大。 并非所有知名交易所都是可靠和诚实的,因此利基市场仍然对新的和改进的公司开放。
区块链合约交易所源码新币币交易所USDT秒合约杠杆C2C法币交易
|
5G 区块链 vr&ar
DAPP智能合约流动性质押挖矿分红开发案例版丨DAPP智能合约流动性质押挖矿分红系统开发(开发案例及源码)
The metauniverse is an immersive digital world created by the combination of virtual reality,augmented reality and the Internet.The connotation and key technologies of the metauniverse require further breaking the space-time limit(5G and the Internet of Things),real immersion(VR),and value transmi
|
区块链
代币合约dapp开发丨代币合约dapp流动性质押挖矿分红系统开发实现技术案例及源码
 因为整个区块链系统是点对点的对等网络,没有统一的中心机构协调各个节点的行为,所以在生成区块时,各个节点的行为都是相互独立的,很有可能同时由多个矿工在同一区块高度生成出2个以上的区块来。这些区块打包的交易很可能是不一样的,同时满足条件的数字n不是唯一的,多个矿工之间生成的数字n是不一样的,但是同样是满足不等式的。在这种情况下,网络中的其他节点很可能同步到不同的区块数据,并且这些数据在数学上都是合法的、有效的。当不同的节点中的不同的区块作为当前最新区块时,就会存在分叉的情况,即不同的矿机对同一高度的区块生产了内存不一样的新区快,并且这些矿工都找到了满足不等式的数字n。
NFT流动性质押挖矿开发功能丨NFT流动性质押挖矿系统开发(开发详细)丨NFT流动性质押挖矿系统源码部署
  Liquidity mining is an incentive mechanism to promote the use of DeFi and a new decentralized token distribution mechanism.Most DeFi applications require users to lock tokens into the contract.The larger the amount of lock-in the contract has,the better financial services can be obtained.Liquidity