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链上合约质押模式系统开发稳定版
区块链本质上是一个去中心化的分布式账本数据库,目的是解决交易信任问题。
|
JavaScript 前端开发 区块链
DAPP代币合约流动性质押分红挖矿系统开发丨技术分析
DAPP代币合约流动性质押分红挖矿系统开发丨技术分析
|
安全 区块链 Python
defi/dapp代币合约链上开发案例丨dapp/defi链上代币合约swap薄饼去中心交易所系统开发实现技术及源码
 区块链最重要的功能,就是建立一种价值共识,而这个“共识”,主要基于“价值量化的能力”和“价值安全的过程”两个方面。先是“价值量化能力”:把一件事通过数字化的方式描述清楚,就是一个价值量化的过程。
|
区块链
defi/lp/nft/dapp代币预售合约流动性质押挖矿开发正式版,defi/lp/nft/dapp代币预售合约流动性质押挖矿系统开发(方案及详细)
 智能合约(Smart contract)是依托计算机在网络空间运行的合约,它以信息化方式传播、验证或执行合同,由计算机读取、执行,具备自助的特点。而区块链的去中心化,数据的防篡改,决定了智能合约更加适合于在区块链上来实现
|
区块链
代币合约dapp开发丨代币合约dapp流动性质押挖矿分红系统开发实现技术案例及源码
 因为整个区块链系统是点对点的对等网络,没有统一的中心机构协调各个节点的行为,所以在生成区块时,各个节点的行为都是相互独立的,很有可能同时由多个矿工在同一区块高度生成出2个以上的区块来。这些区块打包的交易很可能是不一样的,同时满足条件的数字n不是唯一的,多个矿工之间生成的数字n是不一样的,但是同样是满足不等式的。在这种情况下,网络中的其他节点很可能同步到不同的区块数据,并且这些数据在数学上都是合法的、有效的。当不同的节点中的不同的区块作为当前最新区块时,就会存在分叉的情况,即不同的矿机对同一高度的区块生产了内存不一样的新区快,并且这些矿工都找到了满足不等式的数字n。
|
区块链 索引
DAPP/LP代币智能合约流动性质押挖矿互助公排开发需求丨DAPP/LP代币智能合约流动性质押挖矿互助公排系统开发详细及方案
 以区块链为核心的数字科技可以推动信息技术服务,从而促进数字产业化;元宇宙可以创造和创新更广泛的应用场景,拉动信息消费促进产业数字化。因此,以区块链为核心的Web3.0技术体系推动形成的元宇宙数字生态,将对数字产业化和产业数字化提供有力支撑,为数字经济高质量发展打造新引擎。
|
JavaScript
dapp/lp/defi/nft流动性质押挖矿稳定版,dapp/lp/defi/nft流动性质押挖矿分红系统开发详细案例及功能
  Debit and credit voucher:When you deposit a token in Compound,you will get a credit voucher cToken.cToken is the ownership of the user's pledge token.You can exchange the original token and withdraw the corresponding profits in the Compound agreement.
|
JSON NoSQL Java
defi/nft/lp/dapp/dao代币发行合约流动性质押挖矿分红系统开发详情版(通缩销毁,锁仓限购,买卖回流,回购拉盘模式开发)
When the peer node receives the input (propsal) requested by the client, it will send a chain code message object (with input information and caller information) to the corresponding chain code.
|
JSON 区块链 数据格式
DEFI/NFT/LP/DAPP代币合约流动性质押挖矿分红开发案例源码,DEFI/NFT/LP/DAPP代币合约流动性质押挖矿分红系统开发(逻辑及详细)
# web3对象与已部署的用户合约进行通信 rpc = "HTTP合约通讯地址(http url)" web3 = Web3(HTTPProvider(rpc))
|
开发工具 网络安全 数据安全/隐私保护
代币合约流动性质押挖矿开发功能丨代币合约流动性质押挖矿分红系统开发实现技术分析及源码
topo.yaml示例 # # Global variables are applied to all deployments and used as the default value of # # the deployments if a specific deployment value is missing.