Skip to content

compoundV2项目一键快速部署到任何网络,完整源码视频分析。

Notifications You must be signed in to change notification settings

qdwds/compoundV2

Repository files navigation

compound

compound一个以太坊中去中心化的货币市场。任何人都能存币和借币,就像一个银行,用户可以存币获取利息收益,或进行抵押借币。

项目部署

创建.env文件

##  hardhat 本地网络的私钥 
HARDHAT_PRIVATE_KEY = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
## 部署主网时候需要的私钥
OKE_PRIVATE_KEY = 

下载本地依赖

yarn  或者 npm i 

启动区块链网络

npx harhdat 

部署网络

//  本地网络
npx hardhat run scripts/deploy.ts
//  主网或测试网络  其他网络资金修改hardhat.config.ts代码
npx hardhat run scripts/deploy.ts --network oke

调用执行

//  调用其他命令一致
npx hardhat run src/cToken/mint.ts

关键词概念

标的资产:抵押物的原生资产。

cToken

cToken是用户在compound上的存款凭证。使用cToken可以换回之前质押的本金和利息。token兑换cToken比例是根据CErc20Delegator部署时候设置的。

兑换率

cToken和标的资产的兑换比例,会根据时间和利率的变化不断上涨。持有cToken每个区块都会产生对应利息。

抵押因子

抵押因子代表用户抵押支持价值对应可以得到的借款比率,假如用户存入1ETH并且开启作为抵押品,开始时候价值2000u,抵押因子为0.75。借款额度为 1 * 2000 * 0.75 = 1500u,用户借款的话最多可以借出1500u的其他资产。

利率模型

compound中利率模型分为直线型拐点型两种。

直线型

资产的利率会随着资产的使用了而增长。公式利率 = 基础年利率 + 资金泗洪率 * 增长率

  • 使用率低:说明存款多借款少,等于供大于求。这时候存款率和借款率就会偏低
  • 使用率高:说明存款少借款多,这时候存款率和借款率就回偏高。但是这里使用率高的时候说明池子中的钱也变少了,会面临资金枯竭的风险这样就会出现存款用户没有资金可以取,也没有资金可以借,一般使用率在80%会比较安全

拐点型

拐点型利率模型会资产利率分为两种。前面增长率比较低,后面增长率比较高。目前compound中使用80%为拐点

  • 在拐点前借款机率是一条直线,拐点后是一条斜率很高的斜线。超高的借款里就能有效的降低借款需求,而超高的存款利率能够有效的鼓励大家提高供给(存款),避免资金枯竭。

基准年化利率

当质押支的资金为0时,年化利率为最低。

储备金率

为了防止挤兑,一定的储备金可以支持用户的存款业务。这部分资产不计入使用率内,因此不会被借出。

资金使用率

资金使用率是指资产储备金外,其他所有资产的资产使用率,资产使用率决定着存款利率会比借款利率低。

清算

资产价格出现波动导致抵押资产的价格 * 质押因子低于借款价值,那么compound就允许清算者对这部分资产进行清算。为了激励清算者,compound允许支付一部分的费用(1.08)给清算者,而这些费用是由被清算的用户来承担。

函数触发

mint

mint函数是把指定的token根据当前token的价格存入compound中,然后根据比例兑换出对应的cToken。调用者需要提前授权给compound后调用mint传入存款额度才能调用。

borrow

借款是根据当前用户存款额度最大75%(太大存在被清算的风险),compound会把当前cToken池子中对应标的资产额度发送给借款人,compound会在借款额度中记录一笔当前用户借了多少钱。

redeem

根据用户存款的对应的cToken的兑换出对对应比例的标的资产。赎回金额必须小于用户账户流动性及市场可用流动性

repayBorrow

根据用户存款对应的标的资产,按照指定数量兑换出标的资产发送给调用者。

repayBorrowBehalf

代还款当前用户代替其他用户偿还贷款,代还款支持全部和部分额度。全部额度输入MaxUint256即可。代还款还的是借款用户借出去的标的资产额度,还款者还的也是标的资产额度。

liquidateBorrow

清算触发条件。存钱 > 借钱(最大75%) > 价格下跌 > (下跌后价格 * .75 < 当初借款额度)> 触发清算 例如:存钱1个ETH当时价格为2200u, 借款2200 * 0.75 = 1650(这个时候借的钱太满了,非稳定币切记不要借钱额度到75%),等于我借了1650u。。突然ETH价格下跌到2000,计算2000 * 0.75 = 1500。下跌后的1500 < 当初借款额度1650 = 触发清算。 清算额度,清算人最多只能清算借款人额度的50%。例如借款人额度为1650,清算人最多只能清算1650 / 2 = 825的额度。 清算人可以使用任意资产抵押清算

compound 经济模型

流动性来源

用户存钱

提供流动性激励

存款利率

资金池风险

为了防止挤兑,建立资金池储备金,储备金来源是利息积累的一部分

利率

存款利率 = 贷款利率 * 资金使用率 资金使用率 = 总借款 / (资金池余额 + 总借款 - 储备金)

部署错误问题修改

设置价格

setUnderlyingPrice设置token价值时候发现cEth价格始终设置不上,经过长时间排查后发现 cEth调用address(CErc20(address(cToken)).underlying())得到的数据为"",导致代码报错无法成功设置cEth价格。

设置市场

代码部署设置市场应该使用comptroller的地址,而不是使用代理合约unitoller的地址。之前由于错误使用,导致在设置代币加入市场后,明明已经加入市场查找时候能找到,调用无法调用

概念

以下概念部分摘自Keegan小钢并作出一部分简化修改。

存款利率

存款利率的计算需先得到借款利率,和借款利率一样,都是每个区块计算一次,同一个区块的放贷人对于相同的资产获得相同的放贷利率。

清算激励

清算人的清算奖励机制。清算人清算借款人后可以得到的建立1.08(compound),该奖励是由借款人支出。

抵押率

根据用户的存款额度,最多可以抵押当前存款资产的75%(compound)资产借出使用。

标的资产(Underlying Token)

即借贷资产,比如 ETH、USDT、USDC、WBTC等原始资产。

cToken

用户在 Compound 上存入资产的凭证,每一种标的资产都有对应的一种 cToken。每种token兑换cToken部署时候都能设置token <=> cToken对换比例。 比如:ETH 对应 cETH,USDT 对应 cUSDT,当用户向 Compound 存入 USDT 则会得到对应比例的cUSDT。取款时就可以用 cUSDT 换回对应比例的USDT标的资产。

兑换率(Exchange Rate)

cToken 与标的资产的兑换比例,比如 cETH 的兑换率为 0.02,即 1 个 cETH 可以兑换 0.02 个 ETH。兑换率会随着时间推移不断上涨,因此,持有 cToken 就等于不断生息,所以也才叫生息代币。

抵押因子(Collateral Factor)

每种标的资产都有一个抵押因子,代表用户抵押的资产价值对应可得到的借款的比率,即用来衡量可借额度的。取值范围 0-1,当为 0 时,表示该类资产不能作为抵押品去借贷其他资产。一般最高设为 0.75,比如 ETH,假如用户存入了 0.1 个 ETH 并开启作为抵押品,当时的 ETH 价值为 2000 美元,则可借额度为 0.1 * 2000 * 0.75 = 150 美元,可最多借出价值 150 美元的其他资产。

储备金系数(Reserve Factor)

即协议抽取借款人支付的利息的百分比,这根据资产的不同而决定 (Compound协议中,不同资产有着不同的储备金系数)。备用金因子 (reserveFactor )的作用是确保抵押收益率小于借款利率。

利息产生

列入dai/cDai比例 = 1/40,可以兑换40000个cDai。这时我存入和100dai到compound中,当时兑换率为0.025。一年后我想全部取出这时候兑换率为0.0275。这时候40000 * 0.00275 = 110dai。

利用率乘数

计算公式

以下部分摘自Compound完全解析-利率模型篇,并作出部分修改。

兑换率

兑换率 = 未被借走的 + 未还总量(含利息) - 储备金 / 总量
exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply

存款年利率

以Compound DAI为例,基础利率(年化利率)= 5%,加给利率(年化利率乘基)= 12%,若以目前当下的使用率= 62.13%来计算: 借款年利率 = 5% + (12% x 0.6213) = 12.4556% 也就是上图所显示的12.46% 的由来,也就是说,借款人所需要支付利息的年利率,在这个当下是12.46%。

块质押利率(存款) = 资金使用率 * 借款利率 *(1 - 储备金率)
supplyRate = utilizationRate * borrowRate * (1 - reserveFactor)

借款年利率

块质押利率(存款) = 资金使用率 * 借款利率 *(1 - 储备金率)
supplyRate = utilizationRate * borrowRate * (1 - reserveFactor)

使用率

totalBorrows / (totalCasg + totalBorrows)

存款额度计算

新的存款总额 = 存款总额 +(存款总额 * 存款利率 * 时间)

贷款额度

新的贷款总额 = 贷款总额 +(贷款总额 * 贷款利率 * 时间)

笔记文档:区块链笔记
哔哩哔哩:视频合集

About

compoundV2项目一键快速部署到任何网络,完整源码视频分析。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published