DAO流動性質押挖礦分紅系統開發(開發案例)丨DAO流動性質押挖礦分紅原始碼

xiaofufu發表於2023-03-15

  ERC20代幣兌換ERC20代幣的函式入口和ERC20代幣兌換ETH的函式入口類似,不同的是ERC20代幣兌換ERC20代幣的函式入口在呼叫進行兌換的業務函式前會先用建立自身的工廠合約實現的getExchange函式來獲取目標代幣所在的兌換合約地址,然後再向目標兌換合約地址傳送兌換請求,將在本合約兌換得到的ETH兌換成目標代幣。


  函式入口呼叫到的函式就兩種,分別是根據輸入代幣計算輸出代幣的tokenToTokenInput,以及根據輸出代幣計算輸入代幣的tokenToTokenOutput。


  下面先看tokenToTokenInput。


  private


  def tokenToTokenInput(tokens_sold:uint256,min_tokens_bought:uint256,min_eth_bought:uint256(wei),deadline:timestamp,buyer:address,recipient:address,exchange_addr:address)->uint256:


  assert(deadline>=block.timestamp and tokens_sold>0)and(min_tokens_bought>0 and min_eth_bought>0)


  assert exchange_addr!=self and exchange_addr!=ZERO_ADDRESS


  關於區塊鏈專案技術開發唯:yy625019,代幣發行、dapp智慧合約開發、鏈遊開發、多鏈錢包開發


  交易所開發、量化合約開發、互助遊戲開發、Nft數字藏品開發、眾籌互助開發、元宇宙開發、swap開發、


  鏈上合約開發、ido開發、商城開發等,開發過各種各樣的系統模式,更有多種模式、制度、案例、後臺等,成熟技術團隊,歡迎實體參考。


  token_reserve:uint256=self.token.balanceOf(self)#獲得支付代幣的儲備量


  #用getInputPrice計算所能兌換到的ETH


  eth_bought:uint256=self.getInputPrice(tokens_sold,token_reserve,as_unitless_number(self.balance))


  wei_bought:uint256(wei)=as_wei_value(eth_bought,'wei')#將單位轉換成wei


  assert wei_bought>=min_eth_bought


  assert self.token.transferFrom(buyer,self,tokens_sold)#收取支付代幣


  #呼叫目標兌換合約地址的ethToTokenTransferInput函式,將ETH兌換成目標代幣


  tokens_bought:uint256=Exchange(exchange_addr).ethToTokenTransferInput(min_tokens_bought,deadline,recipient,value=wei_bought)


  log.EthPurchase(buyer,tokens_sold,wei_bought)


  return tokens_bought


  tokenToTokenInput在將支付代幣兌換成ETH後,就將ETH傳送到目標代幣的兌換合約地址並呼叫其ethToTokenTransferInput函式來將ETH兌換成目標代幣。


  接著看tokenToTokenOutput。


  private


  def tokenToTokenOutput(tokens_bought:uint256,max_tokens_sold:uint256,max_eth_sold:uint256(wei),deadline:timestamp,buyer:address,recipient:address,exchange_addr:address)->uint256:


  assert deadline>=block.timestamp and(tokens_bought>0 and max_eth_sold>0)


  assert exchange_addr!=self and exchange_addr!=ZERO_ADDRESS


  #呼叫目標兌換合約的getEthToTokenOutputPrice來根據目標代幣數量計算所需的中介ETH的數量


  eth_bought:uint256(wei)=Exchange(exchange_addr).getEthToTokenOutputPrice(tokens_bought)


  token_reserve:uint256=self.token.balanceOf(self)#獲得支付代幣的儲備量


  #根據得到的eth_bought代入getOutputPrice計算所需支付的代幣數量


  tokens_sold:uint256=self.getOutputPrice(as_unitless_number(eth_bought),token_reserve,as_unitless_number(self.balance))


  #tokens sold is always>0


  assert max_tokens_sold>=tokens_sold and max_eth_sold>=eth_bought


  assert self.token.transferFrom(buyer,self,tokens_sold)#收取支付代幣


  #呼叫目標兌換合約地址的ethToTokenTransferOutput函式,將ETH兌換成目標代幣


  eth_sold:uint256(wei)=Exchange(exchange_addr).ethToTokenTransferOutput(tokens_bought,deadline,recipient,value=eth_bought)


  log.EthPurchase(buyer,tokens_sold,eth_bought)


  return tokens_sold


  tokenToTokenOutput函式實現


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

相關文章