阿凡達(泰山眾籌)開發案例版丨阿凡達(泰山眾籌)系統開發(規則及原始碼)

xiaofufu發表於2023-02-24

  在進行兩個代幣交易時,是首先需要在鏈下計算出交易的路徑,例如使用ETH->DAI:


  可以直接透過ETH/DAI的交易池完成


  也可以透過ETH->USDC->DAI路徑,即經過ETH/USDC,USDC/DAI兩個交易池完成交易


  Uniswap的前端會幫使用者實時計算出最優路徑(即交易的收益最高),作為引數傳給合約呼叫。前端中這部分計算的具體實現在這裡,具體過程為先用需要交易的輸入代幣,輸出代幣,以及一系列可用的中間代幣(程式碼中叫Base token)生成所有的路徑(當然為了降低複雜度,路徑中最多包含3個代幣),然後遍歷每個路徑輸出的輸出代幣數量,最後選取最佳路徑。


  交易的入口函式是exactInput函式,程式碼如下:


  struct ExactInputParams{


  bytes path;//路徑


  address recipient;//收款地址


  uint256 deadline;//交易有效期


  uint256 amountIn;//輸入的token數(輸入的token地址就是path中的第一個地址)


  uint256 amountOutMinimum;//預期交易最少獲得的token數(獲得的token地址就是path中最後一個地址)


  }


  function exactInput(ExactInputParams memory params)


  external


  payable


  override


  checkDeadline(params.deadline)


  returns(uint256 amountOut)


  {


  //透過迴圈,遍歷傳入的路徑,進行交易


  while(true){


  bool hasPools=params.path.hasPools();


  //完成當前路徑的交易


  params.amountIn=exactInputSingle(


  params.amountIn,


  //如果是中間交易,又合約代為收取和支付中間代幣


  hasPools?address(this):params.recipient,


  //給回撥函式用的引數


  SwapData({


  path:params.path.getFirstPool(),


  payer:msg.sender


  })


  );


  //如果路徑全部遍歷完成,則退出迴圈,交易完成


  if(hasPools){


  //步進path中的值


  params.path=params.path.skipToken();


  }else{


  amountOut=params.amountIn;


  break;


  }


  }


  //檢查交易是否滿足預期


  require(amountOut>=params.amountOutMinimum,'Too little received');


  }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69956839/viewspace-2936865/,如需轉載,請註明出處,否則將追究法律責任。

相關文章