接入Chainlink價格資料開發DeFi流動性挖礦dApp例項

買賣虛擬貨幣
本文將教大家如何使用Chainlink去中心化預言機開發一款DeFi應用,並獎勵使用者專屬的ERC20通證。介紹近期DeFi行業的火熱讓DeFi、流動性挖礦、權益質押和治理型通證 都成為了熱議話題。這些功能開發起來相對比較簡單,因此本文將教大家如何基於DeFi-Chainlink程式碼庫在十分鐘內開發出一款DeFi流動性挖礦dApp。這個專案受到Dapp University的Gregory啟發,如果想要檢視他的專案程式碼庫和教學影片,請點選連結。專案程式碼庫:https://github.com/dappuniversity/defi_tutorial
教學影片:https://www.youtube.com/watch?v=CgXQC4dbGUE&t=1397s(以上鍊接請複製至瀏覽器開啟)什麼是流動性挖礦?流動性挖礦指某一使用者向DeFi協議提供流動性,以賺取費用、利息和激勵等被動收益。比如,向一個去中心化貸款協議(如Aave)或自動做市商模式的去中心化交易所(如Uniswap)提供流動性,以賺取收益。流動性挖礦的目的是啟用新平臺的流動性,新平臺往往因為沒有使用者而缺乏流動性,而沒有流動性也無法吸引新使用者加入,因此容易陷入惡性迴圈。流動性挖礦可以為平臺早期的流動性提供方提供經濟激勵,解決上述問題。使用者在平臺上質押資金,並獲得相應利息,這種模式與銀行的儲蓄賬戶類似,平臺會分給使用者一部分平臺費,以此激勵他們提供流動性。最近,越來越多的平臺釋出了自己的治理型通證,並將通證獎勵給初期的流動性提供方。這個模式很像銀行的儲蓄賬戶,開戶並存入資金的新使用者會得到銀行發放的現金獎勵。目前流動性挖礦仍是一個相對新穎的模式,因此其效用仍待考證。本文並不急於對這個問題下定論,而是向開發者社羣展示如何在dApp中為流動性提供方提供激勵併發放治理型通證作為獎勵。
dApp的作用是什麼?本文將演示如何開發一個dApp,使用者可以質押任何一種dApp內支援的ERC20通證,並自動向流動性提供方發放治理型通證作為獎勵。本文中的流動性挖礦通證是一個簡單的ERC20智慧合約,不存在投票功能,因此除了本示例以外沒有任何實用價值。使用者收到的通證數量是dApp中的一個重要部分。使用者收到的通證數量不能是隨機的,我們要確保傳送給他們的通證數量與他們在平臺質押的資金量成正比。因此,我們需要接入質押資產的當前市場價格資料,例項中我們將接入Chainlink去中心化價格資料。Chainlink等去中心化預言機可以為我們提供可靠的價格資料,讓我們計算平臺上所有質押通證的價值。我們可以輕鬆將ERC20通證用以太幣計價,以計算所有質押通證的總價值。一旦使用者在平臺質押資產,就可以整合其他貨幣樂高獲得更多利息收益,本文不包含這部分內容。比如說,你可以將使用者通證質押到Aave或Synthetix等平臺。快速啟動
要求:YarnNodejsTruffle有助記詞的以太幣錢包(比如metamask),將助記詞設定成環境變數節點運營商提供的RPC_URL,比如[Infura](https://infura.io/) 或使用自己的節點,並設定以RPC_URL命名的環境變數
克隆程式碼庫:git clone https://github.com/PatrickAlphaC/chainlink_deficd chainlink_defi安裝依賴:yarn在Kovan測試網部署智慧合約,然後啟動前端:
truffle migrate --network live --resetyarn start

然後會出現這樣一個視窗:

現在在平臺上可以質押一些通證。首先,需要點選確認,然後就可以向智慧合約傳送ERC20通證。一開始需要在錢包中充一些測試網LINK通證,你可以點選此處獲得Kovan LINK。

點選兩次確認後,就可以開始交易了。完成後,重新整理頁面可以看到最新的質押通證餘額。

然後可以回到終端,發放獎勵通證。可以在這裡檢視LINK/ETH匯率。平臺會發放與我們的ERC20通證總值相等的DAPP通證(注:以以太幣計價)。在我寫這篇文章時,1個LINK價值等於0.03348個以太幣,因此平臺將收到0.3348個DAPP。那麼執行以下命令發放通證:

truffle exec scripts/issue-token.js --network live

操作完成後,你可以看到收到的DAPP通證數量。

你還可以一鍵轉換通證型別。程式碼庫包含Kovan測試網的三種預設ERC20通證,即:LINK、FAU和DappToken(由你來部署!)

專案執行機制

專案主要功能包括兩個智慧合約,它們的前端都由react實現。

DappToken.sol
TokenFarm.sol

如果你剛開始學習truffle,不知道Migrations檔案是什麼,請先檢視truffle文件。

我們先來做DappToken.sol,因為它最容易做,只是一個簡單的ERC20通證。

幾乎不用寫什麼程式碼就可以部署一個ERC20通證:

pragma solidity ^0.6.0;


import "@openzeppelin/contracts/token/ERC20/ERC20.sol";


contract DappToken is ERC20 {
constructor() public ERC20("DApp Token", "DAPP") {
       _mint(msg.sender, 1000000000000000000000000);
   }
}

安裝openzepplin作為智慧合約框架。匯入的ERC20.sol包含Dapp通證作為ERC20通證所需的所有功能。在建構函式中給它命名,然後首次發行通證,進行部署。在演示中,我們使用了1,000,000個DAPP。(記住,末尾要加18個0,因為solidity/以太坊不帶小數點。)

部署合約時,將1,000,000個DAPP通證全部發到TokenFarm智慧合約中,平臺使用者獲得的獎勵全部來自這個智慧合約。這些行為定義在migrations檔案3_deploy_tokenfarm.js中。

const tokenFarm = await TokenFarm.deployed();
await dappToken.transfer(tokenFarm.address, "1000000000000000000000000");

tokenfarm.sol檔案重要性更高,其中包含質押、取消質押以及檢視使用者餘額等所有程式碼邏輯。為了追蹤所有使用者的質押資產餘額和ERC20通證總額,我們將使用者地址對映生成包含通證地址和通證數量的資料結構,並命名為stakingBalance。我們還可以對映生成以下資料:

· 使用者質押了多少獨特的通證
· 某一通證對以太幣的價格資料
· 平臺支援的通證名單
· 使用者/流動性提供方名單

mapping(address => mapping(address => uint256)) public stakingBalance;
mapping(address => uint256) public uniqueTokensStaked;
mapping(address => address) public tokenPriceFeedMapping;
address[] allowedTokens;
address[] public stakers;

使用者可以呼叫stakeTokens和unstakeTokens函式在平臺上質押或取消質押通證。不過更有意思的是getUserTotalValue函式,這個函式會接入Chainlink去中心化預言機,獲取可靠的價格資料,計算質押資產總值。

function getUserTotalValue(address user) public view returns (uint256) {
uint256 totalValue = 0;
if (uniqueTokensStaked[user] > 0) {
for (
uint256 allowedTokensIndex = 0;
allowedTokensIndex < allowedTokens.length;
allowedTokensIndex++
) {
totalValue =
totalValue +
getUserStakingBalanceEthValue(
user,
allowedTokens[allowedTokensIndex]
);
}
}
return totalValue;
}

getUserStakingBalanceEthValue函式可以獲取某一使用者的某一質押通證價值。

function getUserStakingBalanceEthValue(address user, address token)
public
view
returns (uint256)
{
if (uniqueTokensStaked[user] <= 0) {
return 0;
}
return
        (stakingBalance[token][user] * getTokenEthPrice(token)) / (10**18);
}

getTokenEthPrice函式可以獲取Chainlink價格資料。

function getTokenEthPrice(address token) public view returns (uint256) {
address priceFeedAddress = tokenPriceFeedMapping[token];
AggregatorV3Interface priceFeed = AggregatorV3Interface(
priceFeedAddress
);
(
uint80 roundID,
int256 price,
uint256 startedAt,
uint256 timeStamp,
uint80 answeredInRound
) = priceFeed.latestRoundData();
return uint256(price);
}

需要新增通證對以太幣的價格資料,以計算正確的價值。

歡迎大家使用這個程式碼庫進行開發或發PR。智慧合約開發者如果想要在專案中新增流動性挖礦功能,這是一個很好的起點。

現在,你的DeFi專案就可以接入Chainlink去中心化預言機了!

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;