如何使用JavaScript为DeFi协议提供资产数据

来源:爱站网时间:2020-07-11编辑:网友分享
DeFi已经成为以太坊生态系统中一个非常流行的用例。在撰写本文时,有超过10亿美元被锁定在DeFi协议中。以开放、分布式的替代方案取代现有金融产品的前景,迄今已证明非常受欢迎。这些DeFi平台之所以伟大,是因为它们易于开发人员使用。由于它们的开源代码的性质,任何愿意学习如何使用它们的人都可以使用它们。

DeFi已经成为以太坊生态系统中一个非常流行的用例。在撰写本文时,有超过10亿美元被锁定在DeFi协议中。以开放、分布式的替代方案取代现有金融产品的前景,迄今已证明非常受欢迎。

这些DeFi平台之所以伟大,是因为它们易于开发人员使用。由于它们的开源代码的性质,任何愿意学习如何使用它们的人都可以使用它们。

其中最大的一个是Compound金融,已锁定价值约为1.15亿美元。任何人都可以向他们的协议提供资产,并从中赚取利息,但这个过程是如何工作的?

Compound金融是如何运作?

Compound目前在这九个市场发挥作用:BAT、DAI、ETH、REP、SAI、USDC、USDT、WBTC、ZRX。这些是你可以赚取利息的数字资产。

让我们以DAI为例。你为Compound协议提供DAI后,该值将被协议锁定,直到您决定撤回它为止。同时您同意该协议可以借出该代币的价值,从而赢得整个资金池的利益,所以你可将其视为一个储蓄帐户。

存入其中后,您可以随时查看有多少DAI,当前利率是多少,借用其他资产等。

让我们从技术上讲讲

从技术角度来看,这个供应过程是什么样的?

该协议将ERC20兼容合约用于每个受支持的市场,它们称为cToken。它们每个都有一个外部函数:mint,将提供的值发送到该处。此函数接收提供的值,根据汇率计算等效数量的cToken,然后将其交换为提供的值。

例如,如果汇率为1:1,则提供一个ETH,那么发送方将会收到一个cETH。

与mint相反的是一个名为redeme的函数。当用户想要提取其锁定值时,使用所需数量的cETH代币调用redeme将根据当前汇率返回ETH的等价值。

注意:还有一个redeemUnderlyinging函数,该函数使用基础资产单位而不是cToken单位作为输入。

编写代码

先决条件:本演练假定您基本了解JavaScript、Web3和Ethereum智能合约。

我们将按照以下步骤供应ETH并将其兑换成Compound金融:

1. 加载cETH合约。
2. 通过调用mint,锁定ETH和接收cETH令牌来提供ETH。
3. 读取我们的cETH余额。
4. 读取我们锁定的ETH余额。
5. 通过提供cETH从协议中兑换我们的ETH。

步骤1:加载cETH合约

每个令牌智能合约在每个网络上都有一个不同的地址。cToken合约的ABI可从https://compound.finance/docs/abi//公开获得。

在我们的场景中,使用cETH和Kovan testnet,我们的URL是https://compound.finance/docs/abi/kovan/cETH。

在Compound的官方文档中可以找到每个网络上每个合约的地址。

使用web3,我们初始化合约实例如下:

const cEthInstance = new web3.eth.Contract(cEthABI, addr);

步骤2:提供ETH

图1显示了使用web3的send函数mint cTokens是多么容易:

cEthInstance.methods.mint().send({from: account, value: supplyValue})
    .once('transactionHash', (hash) => {
        // Transaction hash
    })
    .on('confirmation', (number, receipt) => {
        // Number of confirmations
    })
    .on('error', (error) => {
        console.log(error);
    });

在此阶段,我们的ETH将开始根据当前利率赚取利息(也可以使用数学公式来计算)。

步骤3:读取我们的cETH余额

由于cToken合约符合ERC20,因此它们提供了一个称为balanceOf的函数。我们可以通过调用并向其传递帐户地址来检查我们的cETH余额:

let b = await cEthInstance.methods.balanceOf(account).call();

第四步:读取我们锁定的ETH余额

cToken合约还提供了一个名为balanceOfUnderlying的函数,该函数使用其拥有的cToken和当前汇率返回帐户的基础资产价值:

let u = await cEthInstance.methods.balanceOfUnderlying(account).call();

步骤5:从协议中赎回我们的ETH

将步骤4中的值u用作图2中的redeemAmount,我们可以调用redeemUnderlying来赎回我们的以太币:

cEthInstance.methods.redeemUnderlying(redeemAmount).send({from: account})
    .once('transactionHash', (hash) => {
        // Transaction Hash
    })
    .on('confirmation', (number, receipt) => {
        // Number of confirmations
    })
    .on('error', (error) => {
        console.log(error);
    })

或者我们可以使用redeem代替redeemUnderlying并将第3步中的值b作为redeemAmount传递。

结论

随着DeFi变得越来越容易使用并为许多人所接受,在任何开发人员的工具箱中,学习如何与这些协议进行交互都是一种宝贵的工具。

 

上一篇:如何从DeFi协议获取交易数据

下一篇:以太坊Clef — 独立交易签名器实现

您可能感兴趣的文章

相关阅读

查看更多 >

热门软件源码

最新软件源码下载