SolaRoad索拉迪/流動性質押挖礦/礦池算力分紅/系統開發/詳細案例/方案邏輯/原始碼詳情

xiaofufu發表於2023-05-19

  智慧合約是一種只有透過區塊鏈才能實現的新技術。智慧合約是數字化的,儲存在區塊鏈中,並使用加密程式碼強制執行協議。


  智慧合約與區塊鏈的結合,I35功能7O98開閥O7I8 普遍被認為是區塊鏈世界中一次里程碑式的升級。第一個結合了區塊鏈與智慧合約技術的平臺--以太坊的誕生,被認為是開啟了"區塊鏈2.0"時代。


  智慧合約技術


  V+++Mrsfu123 以太坊採用了Solidity作為智慧合約語言,Solidity是一門為實現智慧合約而建立的gao.級程式語言,能在允許以太坊程式的節點上執行。


  該語言吸收了C++、JavaScript的一些特性,例如它是靜態型別語言,支援繼承、庫等。


  智慧合約就是可程式設計的合同,也可以理解為一段自動執行的條文合同,在計算機中,就是一段自動執行的程式片段。它更易於合約儲存,並且由確定的演算法執行,給定輸入,就得到對應的輸出,極大保障了合約的執行力。


  contract UniswapV2Router02 is IUniswapV2Router02{


  using SafeMath for uint;


  address public immutable override factory;


  address public immutable override WETH;


  //超時判定


  modifier ensure(uint deadline){


  require(deadline>=block.timestamp,'UniswapV2Router:EXPIRED');


  _;


  }


  constructor(address _factory,address _WETH)public{


  factory=_factory;


  WETH=_WETH;


  }


  receive()external payable{


  assert(msg.sender==WETH);//only accept ETH via fallback from the WETH contract


  }


  //****ADD LIQUIDITY****


  //您可以將流動性直接存入核心合約(使用UniswapV2Pair::mint(在新標籤頁中開啟)↗),


  //但核心合約只檢查它自己沒有被欺騙,因此如果匯率在您提交交易和執行交易之間發生變化,


  //您將面臨損失價值的風險。如果你使用外圍合約,它會計算出你應該存入的金額並立即存入,


  //因此匯率不會改變,你也不會損失任何東西。


  //***********************


  function _addLiquidity(


  address tokenA,


  address tokenB,


  uint amountADesired,//希望存入的最大數量


  uint amountBDesired,


  uint amountAMin,//希望存入的最小數量


  uint amountBMin


  )internal virtual returns(uint amountA,uint amountB){//流動性提供者通常指定一個最低值,因為他們希望將交易限制在接近當前匯率的匯率。


  //create the pair if it doesn't exist yet


  if(IUniswapV2Factory(factory).getPair(tokenA,tokenB)==address(0)){//如果合約不存在就建立個新合約


  IUniswapV2Factory(factory).createPair(tokenA,tokenB);


  }


  (uint reserveA,uint reserveB)=UniswapV2Library.getReserves(factory,tokenA,tokenB);


  if(reserveA==0&&reserveB==0){


  (amountA,amountB)=(amountADesired,amountBDesired);//如果合約還沒建立,則多少都可以存,但具體但看初始化函式因為過低的話可能會回滾


  }else{


  uint amountBOptimal=UniswapV2Library.quote(amountADesired,reserveA,reserveB);//以我存的amountADesire,計算需要我存入對應多少的amountB


  if(amountBOptimal<=amountBDesired){//如果比我預期的少,那麼一定要比我預期最少的多


  require(amountBOptimal>=amountBMin,'UniswapV2Router:INSUFFICIENT_B_AMOUNT');


  (amountA,amountB)=(amountADesired,amountBOptimal);


  }else{//如果我需要存入的amountB超過我的預期,那麼我就換一種演算法算假如要存入一定數量的amountBDesir,則需要存入的amountA數量,


  uint amountAOptimal=UniswapV2Library.quote(amountBDesired,reserveB,reserveA);


  assert(amountAOptimal<=amountADesired);


  require(amountAOptimal>=amountAMin,'UniswapV2Router:INSUFFICIENT_A_AMOUNT');


  (amountA,amountB)=(amountAOptimal,amountBDesired);//返回實際的tokenA/tokenB儲存數量


  }


  }


  }


  function addLiquidity(


  address tokenA,


  address tokenB,


  uint amountADesired,


  uint amountBDesired,


  uint amountAMin,


  uint amountBMin,


  address to,


  uint deadline


  )external virtual override ensure(deadline)returns(uint amountA,uint amountB,uint liquidity){


  (amountA,amountB)=_addLiquidity(tokenA,tokenB,amountADesired,amountBDesired,amountAMin,amountBMin);//獲得實際的儲存tokenA/tokenB量


  address pair=UniswapV2Library.pairFor(factory,tokenA,tokenB);//透過使用庫函式pairFOr獲得該代幣對的合約地址,這樣會比詢問Facoty更省gas


  TransferHelper.safeTransferFrom(tokenA,msg.sender,pair,amountA);


  TransferHelper.safeTransferFrom(tokenB,msg.sender,pair,amountB);


  liquidity=IUniswapV2Pair(pair).mint(to);//返回存入的amountA、amountB、鑄造的流動性代幣數


  }


  function addLiquidityETH(//新增ETH/token代幣對的流動性


  address token,


  uint amountTokenDesired,


  uint amountTokenMin,


  uint amountETHMin,


  address to,


  uint deadline


  )external virtual override payable ensure(deadline)returns(uint amountToken,uint amountETH,uint liquidity){


  (amountToken,amountETH)=_addLiquidity(//計算實際需要存入的數量


  token,


  WETH,


  amountTokenDesired,


  msg.value,


  amountTokenMin,


  amountETHMin


  );


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

相關文章