接入Chainlink价格数据开发DeFi流动性挖矿dApp实例

Chainlink 发布在 海盗号 DeFi 24437

本文将教大家如何使用Chainlink去中心化预言机开发一款DeFi应用,并奖励用户专属的ERC20通证。

 

介绍

 

近期DeFi行业的火热让DeFi流动性挖矿权益质押理型通证都成为了热议话题。这些功能开发起来相对比较简单,因此本文将教大家如何基于DeFi-Chainlink代码库在十分钟内开发出一款DeFi流动性挖矿dApp

这个项目受到Dapp UniversityGregory启发,如果想要查看他的项目代码库教学视频,请点击链接。

什么是流动性挖矿?

流动性挖矿指某一用户向DeFi协议提供流动性,以赚取费用、利息和激励等被动收益。比如,向一个去中心化贷款协议(如Aave)或自动做市商模式的去中心化交易所(如Uniswap)提供流动性,以赚取收益。流动性挖矿的目的是激活新平台的流动性,新平台往往因为没有用户而缺乏流动性,而没有流动性也无法吸引新用户加入,因此容易陷入恶性循环。流动性挖矿可以为平台早期的流动性提供方提供经济激励,解决上述问题。

用户在平台上质押资金,并获得相应利息,这种模式与银行的储蓄账户类似,平台会分给用户一部分平台费,以此激励他们提供流动性。最近,越来越多的平台发布了自己的治理型通证,并将通证奖励给初期的流动性提供方。这个模式很像银行的储蓄账户,开户并存入资金的新用户会得到银行发放的现金奖励。目前流动性挖矿仍是一个相对新颖的模式,因此其效用仍待考证。本文并不急于对这个问题下定论,而是向开发者社区展示如何在dApp中为流动性提供方提供激励并发放治理型通证作为奖励。

dApp的作用是什么?

本文将演示如何开发一个dApp,用户可以质押任何一种dApp内支持的ERC20通证,并自动向流动性提供方发放治理型通证作为奖励。本文中的流动性挖矿通证是一个简单的ERC20智能合约,不存在投票功能,因此除了本示例以外没有任何实用价值。

用户收到的通证数量是dApp中的一个重要部分。用户收到的通证数量不能是随机的,我们要确保发送给他们的通证数量与他们在平台质押的资金量成正比。因此,我们需要接入质押资产的当前市场价格数据,实例中我们将接入Chainlink去中心化价格数据

Chainlink去中心化预言机可以为我们提供可靠的价格数据,让我们计算平台上所有质押通证的价值。我们可以轻松将ERC20通证用以太币计价,以计算所有质押通证的总价值。

一旦用户在平台质押资产,就可以集成其他货币乐高获得更多利息收益,本文不包含这部分内容。比如说,你可以将用户通证质押到AaveSynthetix等平台。

 

快速启动

 

要求:

Yarn

Nodejs

Truffle

有助记词的以太币钱包(比如metamask),将助记词设置成环境变量节点运营商提供的RPC_URL,比如[Infura](https://infura.io/) 或使用自己的节点,并设置以RPC_URL命名的环境变量

安装依赖:

yarn
Kovan测试网部署智能合约,然后启动前端:
truffle migrate --network live --reset
yarn start
然后会出现这样一个窗口:

现在在平台上可以质押一些通证。首先,需要点击确认,然后就可以向智能合约发送ERC20通证。一开始需要在钱包中充一些测试网LINK通证,你可以点击此处获得Kovan LINK

点击两次确认后,就可以开始交易了。完成后,刷新页面可以看到最新的质押通证余额。

 

然后可以回到终端,发放奖励通证。可以在这里查看LINK/ETH汇率。平台会发放与我们的ERC20通证总值相等的DAPP通证(注:以以太币计价)。在我写这篇文章时,1LINK价值等于0.03348个以太币,因此平台将收到0.3348DAPP。那么运行以下命令发放通证:

truffle exec scripts/issue-token.js --network live
操作完成后,你可以看到收到的DAPP通证数量。

你还可以一键转换通证类型。代码库包含Kovan测试网的三种默认ERC20通证,即:LINKFAUDappToken(由你来部署!)

 

项目运行机制

 

项目主要功能包括两个智能合约,它们的前端都由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,000DAPP。(记住,末尾要加180,因为solidity/以太坊不带小数点。)

部署合约时,将1,000,000DAPP通证全部发到TokenFarm智能合约中,平台用户获得的奖励全部来自这个智能合约。这些行为定义在migrations文件3_deploy_tokenfarm.js中。

const tokenFarm = await TokenFarm.deployed();
 await dappToken.transfer(tokenFarm.address, "1000000000000000000000000");
tokenfarm.sol文件重要性更高,其中包含质押、取消质押以及查看用户余额等所有代码逻辑。为了追踪所有用户的质押资产余额和ERC20通证总额,我们将用户地址映射生成包含通证地址和通证数量的数据结构,并命名为stakingBalance。我们还可以映射生成以下数据:

1. 用户质押了多少独特的通证

2. 某一通证对以太币的价格数据

3. 台支持的通证名单

4. 用/流动性提供方名单

mapping(address => mapping(address => uint256)) public stakingBalance;
   mapping(address => uint256) public uniqueTokensStaked;
   mapping(address => address) public tokenPriceFeedMapping;
   address[] allowedTokens;
   address[] public stakers;
用户可以调用stakeTokensunstakeTokens函数在平台上质押或取消质押通证。不过更有意思的是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去中心化预言机了!

本文链接:https://www.8btc.com/media/652167
转载请注明文章出处

文章标签: DeFi ChainLink
评论
登录 账号发表你的看法,还没有账号?立即免费 注册