LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > 一个真正做DeFi生态的项目Compound,寻找DeFi兴起的原点,不要把借贷等同于P2P

一个真正做DeFi生态的项目Compound,寻找DeFi兴起的原点,不要把借贷等同于P2P

2020-09-06 EOS西站社区 来源:区块链网络

今日DeFi系列主题:

一个真正做DeFi生态的项目Compound,寻找DeFi兴起的原点,不要把借贷等同于P2P

这一周DeFi大跌,牵动整个币市全体跳水,很多人出来唱空DeFi,将DeFi比作P2P,认为这种借贷就是资金盘在骗人,西站认为,2020年上半年以来DeFi确实过热,没有只涨不跌的市场,资本市场就是这样,涨起来惊人,跌起来也吓人。

但我们不能因为资本市场这种不分良莠的下跌,就否定整个DeFi,去中心化金融未来一定是有前景,它绝不是空中楼阁;所以,这个时候更是我们的好机会,静下心来甄别项目,看看项目介绍和白皮书,好好研究一下项目的机制,选出好项目,为投资做好准备。

今天西站带你了解Compound项目,大家都知道今年的DeFi热就是从Compound开启的,可以说Compound是DeFi大热的原点,当它一举超过Maker,加冕DeFi王位,那时的场面是多么令人震撼!

如今DeFi暴跌,遍地鸡毛,我们反过来看Compound。

Compound是在以太坊上运行的一个 DeFi应用。它是一个抵押借贷应用。一个用户可以将其在以太坊上的资产进行抵押并借出另外一种资产。这个抵押是超额抵押。支持这个应用的智能合约不断检测市场中所抵押的产品的市场价格。当所抵押的资产下降时,智能合约会自动发出通知,通知用户进行相应的补仓。当用户无法按照事先确定的规则及时完成补仓时,智能合约会自动清仓,卖掉所抵押的资产来保证资产出借方的收益。

在6月中旬,Compound引入了治理代币。借贷双方都可以通过提供出借资产和借资产来获得治理代币。治理代币的引入大幅激发了市场的参与热情。Compound这个应用中的资产提供数量和资产借贷数量都大幅增长。

8月份,Compound发布了自己的价格预言机Open Price Feed,一个无需许可的、可升级的喂价机制。

该预言机由Open Zeppelin负责代码审计,Certora来明确合约内容的形式验证。

Compound正在运行一个聚合器,用户可以通过该聚合器获取已报告价格的数据。这些价格可以通过每个reporter的公共API直接获得。Compound还创造了一个不断更新的“记事本”,允许任何人在任何时间把当前的价格放到链上。

Compound还创建了一个价格页面,允许用户检查系统的当前状态。这些信息也可以在网上找到。

Compound开发了Open Price Feed,以确保加密社区能够维护和升级不依赖于Compound基础设施和流程的价格机制。其允许reporter使用一个已知的公钥提交价格数据,而“poster”(即任何以太坊地址)都可以在链上提交。

近段时间,去中心化预言机解决方案,如Chainlink和Band,在DeFi借贷平台日益普及的推动下,需求呈指数级增长。

Compound价格预言机的具体细节可以在GitHub上查看代码和相关文档,这说明Compound在做强DeFi生态,是值的我们关注的。

西站未来也会多多看GitHub上的代码,从代码安全角度为大家去解读项目。

首先看一下DeFi整体市场情况、Compound项目代币行情。

一、DeFi市场情况:

DeFi Pulse数据显示,DeFi项目总锁仓为72.7亿美元。本周锁仓减少了有30%左右。

Compound项目以6.1亿美元锁仓量排在所有项目的第6位,Compound已先后被Maker、Aave、Uniswap、Curve、Yearn项目超越,没有了当初王者的风范。

二、代币行情:

Compound代币COMP目前在所有主流交易所都已上线了COMP/USDT、COMP/ETH、COMP/BTC等交易对。

目前COMP报价是158美元元,总发行量是1千万枚,今天下跌16.61%。

据CoinMarket Cap 数据显示COMP从6月18日到9月6日,币价从65美元上涨到158美元,涨幅达3倍,高点发生在6月22日,达到300美元。

三、项目情况:

Compound是在以太坊上的一种算法货币市场协议,可以使用户赚取利息或抵押资产。任何人都可以向Compound的流动资金池提供资产,并立即开始赚取持续不断的利息。价格会根据供求情况自动调整。提供的资产余额用cTokens表示:赚取利息并用作抵押品的基础资产的表示。根据基础资产的质量,用户最多可以借入其cToken价值的50-75%。用户可以随时添加或删除资金,但是如果他们的债务抵押不足,任何人都可以清算;清算资产的5%折扣可激励清算人。复合协议拨出已付利息的10%作为储备金;其余的交给供应商。Compound最初于2018年9月在主网上启动,并于2019年5月升级到v2。该协议现在支持BAT,DAI,SAI,ETH,REP,USDC,WBTC和ZRX。复合材料已经过审核和正式验证。截至2020年5月,大院已过渡到社区治理。COMP代币持有人及其代表就Compound的所有变更进行辩论,提议并投票。

Compound的地址是:https://compound.finance/

Compound介绍

这些文档是基于Compound Whitepaper (Feb 2019)的Compound协议的全面指南。协议代码库托管在Github上,并由社区维护。

请加入Compound社区Discord服务器中的#development室;我们的团队和社区成员期待着帮助您在Compound之上构建应用程序。您的问题可以帮助我们改善,所以请不要犹豫,如果您在这里找不到想要的东西。

指南

01搭建以太坊开发环境

02向复合协议提供资产

03从复合协议中借入资产

04使用Infura创建复合API

05建立治理界面

06委派与投票

网路

复合协议当前部署在以下网络上:

协议数学

Compound协议协定使用指数数学系统Exponential.sol,以足够的精度表示小数。

多数数字表示为尾数,尾数是无符号整数,缩放比例为1 * 10 ^ 18,以便以较高的精度执行基本数学运算。

cToken和底层小数

价格和汇率由每种资产的唯一小数位表示;cToken是具有8位小数的ERC-20令牌,而它们的基础令牌有所不同,并且具有一个名为小数的公共成员。

代币 cToken小数 底层 基础小数

ETH 8 ETH 18

电池 8 蝙蝠 18

计算机辅助教学 8 戴 18

REP 8 REP 18

美国USDC 8 美国农业部 6

美元兑美元 8 USDT 6

世贸中心 8 世贸中心 8

cZRX 8 ZRX 18

解释汇率

cToken 汇率通过cToken与基础资产之间的小数位数差异来缩放。

oneCTokenInUnderlying = exchangeRateCurrent / (1 * 10 ^ (18 + underlyingDecimals - cTokenDecimals))

这是一个使用Web3.js JavaScript在BAT中查找1 cBAT值的示例。

const cTokenDecimals = 8; // all cTokens have 8 decimal places

const underlying = new web3.eth.Contract(erc20Abi, batAddress);

const cToken = new web3.eth.Contract(cTokenAbi, cBatAddress);

const underlyingDecimals = await underlying.methods.decimals().call();

const exchangeRateCurrent = await cToken.methods.exchangeRateCurrent().call();

const mantissa = 18 + parseInt(underlyingDecimals) - cTokenDecimals;

const oneCTokenInUnderlying = exchangeRateCurrent / Math.pow(10, mantissa);

console.log('1 cBAT can be redeemed for', oneCTokenInUnderlying, 'BAT');

ETH没有底层合约,因此要使用cETH进行交易,请将底层 Decimals设置为18。

要查找可以兑换cToken的基础令牌的数量,请将cToken的数量除以上述值oneCTokenInUnderlying。

underlyingTokens = cTokenAmount * oneCTokenInUnderlying

计算应计利息

每个市场的利率都会更新市场中借入资产与供应资产之比发生变化的任何区域。利率变化取决于为市场实施的利率模型智能合约,以及市场上借入资产与供应资产之比的变化量。

请参阅Observable上的利率数据可视化笔记本,以可视化当前将哪个利率模型应用于每个市场。

可以从MarketHistoryService API检索历史利率。

当任何以太坊地址与市场的cToken合约互动时,市场中的所有供应商和借款人都会产生利息,从而调用以下功能之一:铸造,赎回,借入或还款。这些功能之一的成功执行将触发accrueInterest方法,该方法会导致将利息添加到市场中每个供应商和借款人的基础余额中。当前块以及未触发accrueInterest方法的每个先前块(没有用户与cToken合约进行交互)的利息都将累积。仅在其中cToken合约调用了上述方法之一的区块期间,才会产生利息。

这是应计供应利息的示例:

爱丽丝向化合物协议提供1 ETH。在供应时,supplyRatePerBlock为37893605 Wei或每块0.000000000037893605 ETH。没有人与3个以太坊区块的cEther合约进行交互。在随后的第四个区块,Bob借了一些ETH。爱丽丝的基础余额现在为1.000000000151574420 ETH(这是37893605 Wei乘以4块,加上原始的1 ETH)。在后续区块中,Alice的基础ETH余额将基于1.000000000151574420 ETH的新值而不是最初的1 ETH产生应计利息。请注意,supplyRatePerBlock值可能随时更改。

使用每块速率计算APY

可以使用以下公式中的supplyRatePerBlock(用于供应APY)或roweRatePerBlock(用于借入APY)的值来计算每个市场中的供应或借贷的年平均收益率(APY):

Rate = cToken.supplyRatePerBlock(); // Integer

Rate = 37893566

ETH Mantissa = 1 * 10 ^ 18 (ETH has 18 decimal places)

Blocks Per Day = 4 * 60 * 24 (based on 4 blocks occurring every minute)

Days Per Year = 365

APY = ((((Rate / ETH Mantissa * Blocks Per Day + 1) ^ Days Per Year - 1)) - 1) * 100

这是一个使用Web3.js JavaScript计算供求APY的示例:

const ethMantissa = 1e18;

const blocksPerDay = 4 * 60 * 24;

const daysPerYear = 365;

const cToken = new web3.eth.Contract(cEthAbi, cEthAddress);

const supplyRatePerBlock = await cToken.methods.supplyRatePerBlock().call();

const borrowRatePerBlock = await cToken.methods.borrowRatePerBlock().call();

const supplyApy = (((Math.pow((supplyRatePerBlock / ethMantissa * blocksPerDay) + 1, daysPerYear - 1))) - 1) * 100;

const borrowApy = (((Math.pow((borrowRatePerBlock / ethMantissa * blocksPerDay) + 1, daysPerYear - 1))) - 1) * 100;

console.log(`Supply APY for ETH ${supplyApy} %`);

console.log(`Borrow APY for ETH ${borrowApy} %`);

燃气费

协议功能的用气量可能会因市场和用户而有所波动。外部调用(例如对基础ERC-20令牌的调用)可能会使用任意数量的gas。任何涉及检查账户流动性的计算,其燃气成本都会随着进入市场的数量而增加。因此,尽管很难提供任何成本保证,但我们提供下表作为指导:

代币介绍

复合协议支持的每种资产都通过cToken合同进行了集成,该合同是提供给该协议的余额的EIP-20兼容表示。通过铸造cToken,用户(1)通过cToken的汇率赚取利息,该汇率相对于基础资产增加价值,并且(2)能够使用cToken作为抵押。

cToken是与复合协议进行交互的主要方式;当用户铸造,赎回,借贷,偿还借贷,清算借贷或转让cToken时,她将使用cToken合同来这样做。

当前有两种类型的cToken:CErc20和CEther。尽管这两种类型都公开EIP-20接口,但CErc20会包装基础的ERC-20资产,而CEther会简单地包装Ether本身。这样,涉及将资产转移到协议中的核心功能根据类型而略有不同,每个接口如下所示。

薄荷

薄荷功能将资产转移到协议中,该协议开始根据资产的当前供应率来累积利息。用户收到的cToken数量等于所提供的基础令牌除以当前汇率。

CErc20

function mint(uint mintAmount) returns (uint)

msg.sender:将提供资产并拥有铸造的cToken的帐户。

mintAmount:要提供的资产数量,以基础资产为单位。

返回值:成功则返回 0,否则返回错误代码

在提供资产之前,用户必须首先批准 cToken才能访问其令牌余额。

以太

function mint() payable

msg.value payable:要提供的以太币的量,以wei为单位。

msg.sender:将提供以太币并拥有铸造的cToken的帐户。

返回:不返回,返回错误。

坚固性

Erc20 underlying = Erc20(0xToken...); // get a handle for the underlying asset contract

CErc20 cToken = CErc20(0x3FDA...); // get a handle for the corresponding cToken contract

underlying.approve(address(cToken), 100); // approve the transfer

assert(cToken.mint(100) == 0); // mint the cTokens and assert there is no error

Web3 1.0

const cToken = CEther.at(0x3FDB...);

await cToken.methods.mint().send({from: myAccount, value: 50});

赎回

兑换功能将指定数量的cToken转换为基础资产,并将其返回给用户。收到的基础代币数量等于兑换的cToken数量乘以当前汇率。赎回的金额必须小于用户的帐户流动性和市场的可用流动性。

CErc20 / CEther

function redeem(uint redeemTokens) returns (uint)

msg.sender:赎回资金应转入的帐户。

redeemTokens:要兑换的cToken数量。

返回值:成功则返回 0,否则返回错误代码

坚固性

CEther cToken = CEther(0x3FDB...);

require(cToken.redeem(7) == 0, "something went wrong");

Web3 1.0

const cToken = CErc20.at(0x3FDA...);

cToken.methods.redeem(1).send({from: ...});

赎回基础

兑换基础功能将cToken转换为指定数量的基础资产,并将其返回给用户。兑换的cToken数量等于所接收的基础令牌的数量除以当前汇率。赎回的金额必须小于用户的帐户流动性和市场的可用流动性。

CErc20 / CEther

function redeemUnderlying(uint redeemAmount) returns (uint)

msg.sender:赎回资金应转入的帐户。

redeemAmount:要赎回的基础数量。

返回值:成功则返回 0,否则返回错误代码

坚固性

CEther cToken = CEther(0x3FDB...);

require(cToken.redeemUnderlying(50) == 0, "something went wrong");

Web3 1.0

const cToken = CErc20.at(0x3FDA...);

cToken.methods.redeemUnderlying(10).send({from: ...});

的借位函数从协议给用户的资产,并创建一个借位平衡,开始基于所述累积兴趣借入率的资产。借入的金额必须小于用户的帐户流动性和市场的可用流动性。

要借入以太币,借款人必须是“应付”(坚实)的。

CErc20 / CEther

function borrow(uint borrowAmount) returns (uint)

msg.sender:应将借入资金转入的帐户。

借款金额:要借入的基础资产的金额。

返回值:成功则返回 0,否则返回错误代码

坚固性

CErc20 cToken = CErc20(0x3FDA...);

require(cToken.borrow(100) == 0, "got collateral?");

Web3 1.0

const cToken = CEther.at(0x3FDB...);

await cToken.methods.borrow(50).send({from: 0xMyAccount});

偿还借款

还款功能将资产转移到协议中,从而减少了用户的借入余额。

CErc20

function repayBorrow(uint repayAmount) returns (uint)

msg.sender:借入资产并应偿还借入的帐户。

repayAmount:要偿还的基础借款资产的金额。值为-1(即2256 -1)可用于全额还款。

返回值:成功则返回 0,否则返回错误代码

在偿还资产之前,用户必须首先批准 cToken才能访问其令牌余额。

以太

function repayBorrow() payable

msg.value payable:要偿还的以太币的量,以wei为单位。

msg.sender:借入资产并应偿还借入的帐户。

返回:不返回,返回错误。

坚固性

CEther cToken = CEther(0x3FDB...);

require(cToken.repayBorrow.value(100)() == 0, "transfer approved?");

Web3 1.0

const cToken = CErc20.at(0x3FDA...);

cToken.methods.repayBorrow(10000).send({from: ...});

偿还借贷代表

还款功能将资产转移到协议中,从而减少了目标用户的借入余额。

CErc20

function repayBorrowBehalf(address borrower, uint repayAmount) returns (uint)

msg.sender:用于偿还借入的帐户。

借款人:借入要偿还资产的帐户。

repayAmount:要偿还的基础借款资产的金额。值为-1(即2256 -1)可用于全额还款。

返回值:成功则返回 0,否则返回错误代码

在偿还资产之前,用户必须首先批准 cToken才能访问其令牌余额。

以太

function repayBorrowBehalf(address borrower) payable

msg.value payable:要偿还的以太币的量,以wei为单位。

msg.sender:用于偿还借入的帐户。

借款人:借入要偿还资产的帐户。

返回:不返回,返回错误。

坚固性

CEther cToken = CEther(0x3FDB...);

require(cToken.repayBorrowBehalf.value(100)(0xBorrower) == 0, "transfer approved?");

Web3 1.0

const cToken = CErc20.at(0x3FDA...);

await cToken.methods.repayBorrowBehalf(0xBorrower, 10000).send({from: 0xPayer});

清算借款

账户流动性为负的用户将受到该协议其他用户的清算,以将其账户流动性恢复为正(即高于抵押要求)。清算发生时,清算人可以代表借款人偿还部分或全部未偿还的借款,作为回报,可以得到借款人持有的贴现抵押品的折价;此折扣被定义为清算激励。

清算人可以关闭水下帐户的任何单个未偿还借款的某个固定百分比(即,关闭系数)。与v1中不同,清算人必须与希望偿还借贷并扣押另一项资产作为抵押的每个cToken合同进行交互。扣押抵押品后,清算人将被转让cToken,它们可以像赎回自己提供资产一样赎回。用户必须先批准每个cToken合同,然后才能进行清算(即,在他们偿还的借入资产上),因为他们正在向合同中转移资金。

CErc20

function liquidateBorrow(address borrower, uint amount, address collateral) returns (uint)

msg.sender:用来偿还借款人债务并扣押其抵押品的清算帐户。

借款人:应清算的负资金流动性账户。

repayAmount:要偿还并转换为抵押的借入资产的金额,以基础借用资产的单位指定。

cTokenCollateral:清算人应抓住的当前由借款人持有的cToken的地址。

返回值:成功则返回 0,否则返回错误代码

在提供资产之前,用户必须首先批准 cToken才能访问其令牌余额。

以太

function liquidateBorrow(address borrower, address cTokenCollateral) payable

msg.value payable:要偿还并转换为抵押的以太币的金额,以wei为单位。

msg.sender:用来偿还借款人债务并扣押其抵押品的清算帐户。

借款人:应清算的负资金流动性账户。

cTokenCollateral:清算人应抓住的当前由借款人持有的cToken的地址。

返回:不返回,返回错误。

坚固性

CEther cToken = CEther(0x3FDB...);

CErc20 cTokenCollateral = CErc20(0x3FDA...);

require(cToken.liquidateBorrow.value(100)(0xBorrower, cTokenCollateral) == 0, "borrower underwater??");

Web3 1.0

const cToken = CErc20.at(0x3FDA...);

const cTokenCollateral = CEther.at(0x3FDB...);

await cToken.methods.liquidateBorrow(0xBorrower, 33, cTokenCollateral).send({from: 0xLiquidator});

关键事件

事件 描述

造币厂(地址造币厂,uint mintAmount,uint mintTokens)

成功铸就薄荷糖。

兑换(地址兑换,uint兑换mAmount,uint兑换令牌)

成功赎回时发出。

借入(地址借方,单位借入金额,单位账户借入,单位借入总计)

在成功发射借用。

RepayBorrow(地址付款人,地址借款人,单位repayAmount,单位帐户借方,单位总计借方)

成功偿还借贷时发出。

LiquidateBorrow(地址清算人,地址借款人,uint repayAmount,地址cTokenCollateral,uint seizeTokens)

成功进行清算借贷时发出。

错误代码

故障信息

汇率

随着市场上利息的增加,每个cToken都可以转换为数量不断增加的基础资产。cToken与基础资产之间的汇率等于:

exchangeRate = (getCash() + totalBorrows() - totalReserves()) / totalSupply()

CErc20 / CEther

function exchangeRateCurrent() returns (uint)

返回值:当前汇率(无符号整数),按1e18缩放。

坚固性

CErc20 cToken = CToken(0x3FDA...);

uint exchangeRateMantissa = cToken.exchangeRateCurrent();

Web3 1.0

const cToken = CEther.at(0x3FDB...);

const exchangeRate = (await cToken.methods.exchangeRateCurrent().call()) / 1e18;

提示:请注意使用调用与发送来从链外调用功能,而不会产生汽油费用。

获得现金

现金是此cToken合同拥有的基础余额的数量。可以查询该市场当前可用的现金总量。

CErc20 / CEther

function getCash() returns (uint)

返回:合同拥有的基础资产的数量。

坚固性

CErc20 cToken = CToken(0x3FDA...);

uint cash = cToken.getCash();

Web3 1.0

const cToken = CEther.at(0x3FDB...);

const cash = (await cToken.methods.getCash().call());

总借款

借贷总额是市场目前借出的标的物的数量,以及累积给市场供应商的利息的数量。

CErc20 / CEther

function totalBorrowsCurrent() returns (uint)

返回值:借入标的的总金额,含利息。

坚固性

CErc20 cToken = CToken(0x3FDA...);

uint borrows = cToken.totalBorrowsCurrent();

Web3 1.0

const cToken = CEther.at(0x3FDB...);

const borrows = (await cToken.methods.totalBorrowsCurrent().call());

借款余额

从协议中借用资产的用户将根据当前借入利率累计利息。利息在每个区块中累积,积分可以使用此功能来获取用户的利息借入余额的当前值。

CErc20 / CEther

function borrowBalanceCurrent(address account) returns (uint)

帐户:借入资产的帐户。

返回值:用户当前的借贷余额(含利息),以基础资产为单位。

坚固性

CErc20 cToken = CToken(0x3FDA...);

uint borrows = cToken.borrowBalanceCurrent(msg.caller);

Web3 1.0

const cToken = CEther.at(0x3FDB...);

const borrows = await cToken.methods.borrowBalanceCurrent(account).call();

借入率

在任何时间点,您都可以查询合同以获取当前的借贷利率。

CErc20 / CEther

function borrowRatePerBlock() returns (uint)

返回值:当前借入利率(无符号整数),按1e18缩放。

坚固性

CErc20 cToken = CToken(0x3FDA...);

uint borrowRateMantissa = cToken.borrowRatePerBlock();

Web3 1.0

const cToken = CEther.at(0x3FDB...);

const borrowRate = (await cToken.methods.borrowRatePerBlock().call()) / 1e18;

总供给

总供应量是此cToken市场中当前流通的代币数量。它是cToken合同的EIP-20接口的一部分。

CErc20 / CEther

function totalSupply() returns (uint)

返回:市场流通的代币总数。

坚固性

CErc20 cToken = CToken(0x3FDA...);

uint tokens = cToken.totalSupply();

Web3 1.0

const cToken = CEther.at(0x3FDB...);

const tokens = (await cToken.methods.totalSupply().call());

基础余额

用户的基础余额(代表其在协议中的资产)等于用户的cToken余额乘以Exchange Rate。

CErc20 / CEther

function balanceOfUnderlying(address account) returns (uint)

account:要获得基础余额的帐户。

返回值:帐户当前拥有的基础数量。

坚固性

CErc20 cToken = CToken(0x3FDA...);

uint tokens = cToken.balanceOfUnderlying(msg.caller);

Web3 1.0

const cToken = CEther.at(0x3FDB...);

const tokens = await cToken.methods.balanceOfUnderlying(account).call();

供应率

在任何时间点,都可以查询合同以获取每块的当前供应率。供应率是从借款利率,储备系数和借款总额得出的。

CErc20 / CEther

function supplyRatePerBlock() returns (uint)

返回值:当前供给速率(无符号整数),按1e18缩放。

坚固性

CErc20 cToken = CToken(0x3FDA...);

uint supplyRateMantissa = cToken.supplyRatePerBlock();

Web3 1.0

const cToken = CEther.at(0x3FDB...);

const supplyRate = (await cToken.methods.supplyRatePerBlock().call()) / 1e18;

总储备

储备金是每个cToken合约中的一个会计分录,代表一部分作为现金预留的历史利息,可以通过协议的管理方式提取或转移。协议中规定了借款人利息的一小部分,由准备金决定。

CErc20 / CEther

function totalReserves() returns (uint)

返回值:市场中持有的储备总量。

坚固性

CErc20 cToken = CToken(0x3FDA...);

uint reserves = cToken.totalReserves();

Web3 1.0

const cToken = CEther.at(0x3FDB...);

const reserves = (await cToken.methods.totalReserves().call());

储备因子

储备因子定义了转换为储备的借款人利息部分。

CErc20 / CEther

function reserveFactorMantissa() returns (uint)

返回值:当前保留系数,为无符号整数,按1e18缩放。

坚固性

CErc20 cToken = CToken(0x3FDA...);

uint reserveFactorMantissa = cToken.reserveFactorMantissa();

Web3 1.0

const cToken = CEther.at(0x3FDB...);

const reserveFactor = (await cToken.methods.reserveFactorMantissa().call()) / 1e18;

—-

编译者/作者:EOS西站社区

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...