02.Compound V2 theory
2024-04-14 14:40:02 # 12.DeFi

Compound V2 theory

使用Compound的快速入门,用foundry写测试,包含upgrade, borrow, repay, supply, redeem 和计算流动性

简介

  • Compound定义
    • Compound是运行在以太坊上的数字资产理财和贷款服务平台。
    • 通过一个开源的、去中心化的Compound协议,自动建立市场化的利率定价,为用户提供类似银行的数字货币存贷业务。
    • 用户存入对应的数字资产回立即产生收益,也可以通过抵押的方式借出数字资产(需要支付利息,利率根据市场供需水平浮动定价),并且按照以太坊区块产生的时间(也就是大概每15秒结算一次利息)。用户的存款可以随时连本带息的取出

Compound认为大多数用户的数字资产都闲置在交易所和钱包里,没有任何收益,它的使命就是改变这一切。

一些名词

  • Supply Balance:存款量,折算为USD为单位

  • Borrow Balance:借款量,折算为USD为单位

  • APY:存款或借款的年利率,为复利利率。

  • Collateral Factor:抵押因子(该币种的最大抵押率),为 借款价值 / 抵押价值。比如你提供了价值 100USDT的Dai进行抵押,你最多只能借到价值83.5USDT的其他数字资产。

  • Earn APR:存款利率,对应Dashboard页面的数据。

  • Borrow APR:借款利率,对应Dashboard页面的数据。

  • Reserve Factor:储备因子(储备率),就是存款中的一部分钱要作为储备金,不对外借出的。

  • Reserves:储备金金额,来源于利息积累的一部分

  • Borrow Cap:借出上限

  • Utilization: 资金利用率

  • 标的资产(underlying token):是我们真正进行借贷的资产,比如 ETH、USDT、USDC、WBTC 等。

  • 资产利用率:在货币市场的资金池中,借款金额的占比。资产利用率在于度量资金的使用效率,越高越好,代表资金的效率越高。公式如下:

    • totalCash: 放入智能合约中,但是还没有被借走的标的资产总量

    • totalBorrows: 所有借款人应该偿还的所有标的资产总量(包含本金和利息)

    • totalReserves: 储备金是每个cToken合约中的一个会计条目,代表作为现金留出的历史利息的一部分,可以通过协议的治理提取或转移。

  • 备用金:Compound 会对每一笔借款的利息收益,按照备用金因子计提一笔备用金,作为平台收益。

compound架构

  • 放贷人/借款人存入资产到 Compound 智能合约的货币市场。放贷人/借款人存入的资产为底层资产(也称为标的资产)。
  • 智能合约按照兑换率发放对应底层资产的 Compound 代币 cTokens 到用户账户。这里的 cTokens 可以为 cDAI/cETH/cUSDC/cREP/cSAI/cWBTC/cBAT/cZRX 等。
  • 放贷人存入资产到 Compound 的货币市场中可以享受放贷利息收益,由 Compound 自动撮合贷款需求。
  • 借款人超额抵押资产后,可以从货币市场借款。不同于P2P借款,借款人不需要和贷款人协商,只要对应货币市场的流动性足够,由 Compound 智能合约自动撮合。借款利率由 Compound 智能合约根据市场对资金的供需关系实时确定。同一区块内,所有借款人的借款利率都是相同的。
  • Compound 按照区块数为单位累积借款人利息。
  • Compound 对每一笔借款都会计提准备金。
  • 放贷人可以随时赎回自己存入的底层资产
  • 借款人可以随时偿还贷款
  • 如果借款人抵押资产价值低于清算阀值,Compound 智能合约会自动发起清算操作,以保证用户的资产总额大于借贷总额。

  • 借款人可以抵押 Compound 支持的任何资产,但为了防止借款人付不出利息,借出的总资产必须小于抵押资产的一定数量。
  • 借款人支付的利息按照每个放贷者的资产比例平均分配给所有的放贷者。
  • 借款人可以随时还款,还款时依据借款利率与时间,决定总的还款数量。同样,放贷人可以随时连本带利提出 DAI,但前提是智能合约中必须有足够的 DAI,由于备用金机制,几乎不可能有提不出资产的情况。

运行机制

Compound市场,每一个币都有一个池子,并且这个池子只有这一种代币。Compound协议通过算法来决定这个池子里的币借贷利率是多少,这个算法会基于人们对这个币借贷的供需关系自动计算出利率,然后可以进行借款、还款、存款、取款

特点

  • 资金池
  • 基于供需法则,由算法生成利率,无需协商
  • 完全透明的代币余额信息,记录所有历史利率

cToken

  • cToken是我们在 Compound 上存入资产的凭证。取款时就可以用 cToken 换回标的资产

  • 所有cToken只有8位小数,而underlying token可能有所不同

  • 每一种标的资产都有对应的一种 cToken,比如,ETH 对应 cETH,USDT 对应 cUSDT,当用户向 Compound 存入 ETH 则会返回 cETH。

  • 存入token之后,会得到cToken(比如cDAI),我们的存币本息就体现在账户里增长的从DAI的价值,它是我们在Compound存款和提供流动性的凭证,账户里有了cToken,就会按时收到利息。比如:cETH 的兑换率为 0.02,即 1 个 cETH 可以兑换 0.02 个 ETH。

  • cToken 与标的资产的兑换率会随着时间推移不断上涨,上涨的部分正是用户存入资产所生成的利息。因为cToken的价值会越来越高,因为每一个区块会结算一次利息,然后继续升值

  • cToken也可以转账或交易。cToken和标定Token的兑换比例不是1:1,有一个兑换公式。它是ERC20兼容的代币。总体上来说,借款量越高,cToken和标定资产的兑换比例越高。兑换比例公式如下:

  • 放贷人将标的资产存入货币市场时候,平台会按照平台实时兑换率 exchangeRate,将标的兑换为平台的 cToken,此过程称之为铸币(Mint Token):

    • getCash(): 放入智能合约中,但是还没有被借走的标的资产总量
    • totalBorrows(): 所有借款人应该偿还的所有标的资产总量(包含本金和利息)
    • totalReserves(): 储备金是每个cToken合约中的一个会计条目,代表作为现金留出的历史利息的一部分,可以通过协议的治理提取或转移。
    • totalSupply():所有放贷人(存款)获得的 cToken 总量

利率

  • 只要借入资产与供应资产的比率发生变化,利率就会在每个区块上更新,也就是平均15秒出一个块,15秒更新一次。利率的数量取决于智能合约的具体实施。具体查看LegacyJumpRateModelV2.sol

  • Interest Rate Model:黑线代表市场的资金利用率(也就是借款需求),绿线代表存币市场的利率,紫线代表借币市场的利率。Compound对不同市场采用不同的利率定价模型

  • Compound的利率模型有两种:直线型和拐点型。

    • 黑色线:利用率。紫线:借款利率。绿线:存款利率
    • 借款利率的变化都是线性的,符合公式 y = k * x,而存款利率是根据借款利率计算的
    • 核心逻辑:本质上是要反映借贷供求关系的一个量化指标,利用率低说明存款的多,但借款的太少,即供给大于需求。这时候就需要鼓励用户多借款少存款,所以借款利率偏低,存款利率也偏低。而利用率高的时候则相反,借款利率和存款利率偏高,就能鼓励大家多存款少借款。
    • 利用率过高的话,那说明资金池里剩下的钱就比较少了,会面临资金池枯竭的风险。资金池枯竭的话,那存款用户就没资金可取,也没资金可借,这就可能会导致系统性风险了。一般资金使用率在 80% 以内比较安全。
    • 而为了控制利用率在安全范围内,Compound 大多数抵押品都使用拐点型利率模型。对应合约为 BaseJumpRateModelV2。
    • 拐点型利率模型其实是是两个直线型利率的合成,在达到临界点前使用一条直接,在达到临界点之后使用另一条斜率更高的直线,只所以这么做是为了保护资金池,防止资金池中的资金被借空。
  • 借款利率

    • 直线型借款利率公式

    • 拐点型借款利率公式

      • baseRate:基础利率。

      • utilizationRate:资产利用率

      • multiplier、jumpMultiplier,为对应的乘数

  • 存款利率

    • 存款利率与借款利率、资产利用率都有关系,公式如下:

    • borrowRate: 借款利率

    • reserveFactor: 备用金因子

    • utilizationRate: 就是资产利用率

清算

  • 借款的时候,如果在我们还款前,市场产生波动导致抵押率达到最大抵押率(清算阈值),那么第三方清算人就会介入,替借款人偿还全部或部分借款,然后该清算人就会得到对应价值的抵押物,并额外获得8%的抵押物激励,也就是将抵押物的价格打了8%的折扣计价给清算人
  • 系统并不保证会发生清算。它提供了激励措施,以便用户(清算人)不断寻找清算机会,以便他们调用清算功能并获得一些钱作为回报。

质押

  • 抵押因子,每种标的资产都有一个抵押因子,代表用户抵押的资产价值对应可得到的借款的比率,即用来衡量可借额度的。

  • 抵押因子取值范围 0-1,当为 0 时,表示该类资产不能作为抵押品去借贷其他资产。一般最高设为 0.75,比如 ETH,假如用户存入了 0.1 个 ETH 并开启作为抵押品,当时的 ETH 价值为 2000 美元,则可借额度为 0.1 2000 0.75 = 150 美元,可最多借出价值 150 美元的其他资产。

审计

  • Comptroller是Compound协议的风险管理层;它决定了用户需要维持多少抵押品,以及用户是否可以(以及多少)可以被清算。每次用户与 cToken 交互时,都会要求Comptroller批准或拒绝该交易。

  • 可以将 Comptroller 视为提供者和验证者合约,它向用户提供信息cTokens并检查用户是否可以执行给定的交易。

治理

  • 一些概念

    • 治理代币COMP,拥有COMP的用户可以参与社区投票,拥有1%以上COMP的地址可以发起提案并开启投票。发行量为1000万,42.3%留给了Compound协议使用。所有参与存贷业务的用户都能够得到COMP激励。Distribution APY是当前市场存贷的挖矿收益率,存贷越多,COMP奖励越多,也就是常说的流动性挖矿。

    • 每天在八个借贷市场上分发大概2880个COMP

    • Comproller采用可升级代理模式,实际的proxy合约叫做Unitroller。Unitroller拥有一些方法比如设置实现类、设置Admin等,一般的调用请求都会进入到fallback中然后进行delegate调用。因此这里存在一些安全问题,比如提出一个恶意提案,通过之后,该恶意提案将实现类合约升级为恶意合约。

  • 三个组件:COMP Token、Governor Alpha、 Timelock。通过治理模块,允许社区提出、投票和实时更提案,提案可以包括调整利率模型、增加对新资产的支持等。

下面给出发起提案、投票、执行的完整流程

  1. 发出提案

    • propose()方法位于GovernorBravoDelegate.sol中。发起投票有门槛,需要一定数量的COMP,目前是25000

      1
      function propose(address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description) public returns (uint)

      一旦提案通过,那么投票会被延迟13,140个区块,大约两天,然后才可以进行投票

  2. 投票

    • 有用COMP的人才可以进行投票,可以将投票权委托给自己,也可也委托给别人。还有其他投票函数,原理也大致相同

    • 需要传入提案的ID和选项(0代表反对,1代表支持,2代表弃权)

    • 目前投票期持续19,710个区块(约3天),投票期结束后,就该对提案进行排队了

      1
      function castVote(uint proposalId, uint8 support) externalt
  3. 队列

    • 一旦收集到所有选票并且投票期结束,该提案要么“成功”,要么“失败”。如果提案成功,那么下一步就可以进行。
    • 提案成功必须满足:(1)赞成票大于反对票,(2)赞成票大于quorumVotes,目前quorumVotes=400,000
    • 一旦交易被排队到 Timelock 合约中,就会有 172,800 秒的延迟(2 天)。一旦延迟结束,交易就可以执行。
  4. 执行

    • 这只需从 GovernorBravoDelegate.sol 中调用execute()交易即可完成。该函数将从 Timelock.sol的上下文中执行提案。
Prev
2024-04-14 14:40:02 # 12.DeFi
Next