# DefiVault (DFV) 经济白皮书 ## 代币分配 DeFi Vault 担保池代币 DFV 首次发行总量1000万 | 角色 | 比例 | 锁定期(月)| 备注 | | ------ | ------ | --------- | -------- | | 团队 | 15% | 24 | 初始团队保留代币 | | 天使 | 10% | 24 | | | 私募 | 20% | 6 | | | 市场 | 5% | | 用于奖励前期社区运营,以及投资推荐人 | | 基金会 | 50% | 60 | | ## 简介 DFV 代币为 DeFi 用户提供一个担保资金的方式,确保 DeFi 用户的资金安全。 针对某个 DeFi 产品,会有一个相应的该产品的 bToken 合约,用户通过持有 bToken 合约来间接持有该产品,并获得 DFV 代币的资金担保。 例如,对于 DefiBoard 产品。一旦 DefiBoard 出现问题,如,DefiBoard 本身的流动性不足,造成用户无法提出现金。DFV 合约自动根据 Oracle 提供的当前 DFV 的价格,增发(Mint)相应数量的 DFV 代币给用户。用户可以在市场上卖掉 DFV 代币弥补自己投资的损失。 用户投资 DefiBoard 产品不需要支付任何费用,但是提取收益时需要以 DFV 支付一定比例(目前为年化 1%)的手续费。因此,用户需要在市场上购买 DFV 代币来支付手续费。支付手续费的 DFV 代币则被 DFV 合约自动销毁(Burn)。 为了保证 DFV 币价的稳定。DFV 持币人有动力保证 DefiBoard 接入的产品足够安全没有漏洞。否则,一旦产品造成用户损失,DFV 合约自动增发 DFV 代币赔偿用户,从而稀释所有 DFV 持币人。 DFV 持币人可以通过为 DefiBoard 产品提供服务获得额外收益。比如抵押 DFV 为 DefiBoard 投资的产品进行仓位调整(Rebalance)以获得 Rebalance 的奖励,例如,Worker可以收取仓位金额 x 增加的收益率/2 的奖励。 ## 合约架构 主要包括3个合约 bToken 合约,DFV 合约,以及 PriceOracle 合约。 ### backed Token (bToken) 合约 针对需要担保的产品,需要部署相应的 bToken 合约。例如针对MetaMoneyMarket(MMM)产品,部署 MMM bToken 合约 bMaxToken。 bToken 为 ERC20 代币,负责记录持币人的状态,以及对接底层产品。 bToken 合约需要记录 - 每个 bToken 用户持有代币的余额,如 MMM bToken 产生 bMaxToken 代币,并记录 bMaxToken 代币余额; - 当时的 underlying 的 exchangeRate,即 maxToken 的 exchangeRate; - 持有的底层资产总额,如记录下 bToken 合约管理的 MMM 的 maxToken 总数。 ### DFV 合约 DFV 合约为 ERC20 代币,负责创建,销毁,和管理DFV代币,记录担保人代币状态,以及对接 PriceOracle 合约。 ### PriceOracle 合约 PriceOracle 合约负责提供任何 DFV 支持担保的资产代币的价格信息,如 DFV/DAI, DFV/USDC, DFV/ETH 等。 ## 主要流程 ### 存入 用户存入资产代币,如 DAI。Wrapper 首先根据用户当前 bToken 余额,结算用户需要支付的保险手续费。手续费根据合约设置的固定手续费率 x bToken持有的时间进行计算;并将手续费发送给 DFV 主合约。然后,根据当前已有的底层资产 underlying,以及现有的 bToken 总量,根据用户存入的 DAI 的数量,计算出需要产生多少个 bToken 发送给用户。最后以当前 underlying 产品的 exchangeRate 更新该用户保存的 exchangeRate,以记录用户最新的本金数量。 ### 取出 用户将持有一定数量的 bToken 转入相应的 DFV Wrapper 合约进行提现。该 Wrapper 合约先向底层产品获得 exchangeRate;计算出用户需要支付的保险手续费并发送给 DFV 主合约。然后计算出需要花费多少 underlying 并发送给底层产品获得资产代币。然后更新用户的 bToken 余额,以及 exchangeRate。最后将资产代币发送给用户。 #### 兑换底层资产出错 当 Wrapper 合约向底层产品兑换资产出错时,用户可以通过赔偿流程提取资产 ### 赔偿 用户向 DFV 合约发送数额。 DFV 合约确认收到的赔偿请求来自于白名单地址,并且是支持的资产,如DAI,USDC等。 DFV 合约根据资产类别,向相应的 PriceOracle 询问当前 DFV 兑换该资产的价格。然后根据需要赔偿的数量,创建相应数量的 DFV 代币,然后返回给请求的 Wrapper 合约。 Wrapper 收到 DFV 代币后,连同兑换到的资产代币,一起发送给用户。 ### 交易 Transfer 用户之间可以互相交易 bToken。比如用户 A 自己持有 100 bDAI,然后从用户 B 购买 200 bDAI。 合约先计算2个用户的手续费,并将手续费发送给 DFV 合约。然后更新用户 A 余额为 +200,用户 B 余额 -200,并且同时更新2人的 exchangeRate 为当前最新 exchangeRate。 ### 手续费扣除 用户余额发生变动时,需要记录当时的 exchangeRate,以记录用户当时的本金。记录用户本金的时候,即为用户结算需要扣除的保险费用。 例如,用户余额为 100 bToken, 用户如果全部取现,则根据用户累计的时间,计算累计产生的保险费用,如果按照每年1%计算,则换算为每个区块 0.00000000444 的利息。合约将用户的bToken全部向底层资产兑换为底层协议代币如DAI,然后扣除利息产生的底层代币,其他的返回给用户。 用户如果转账给其他用户;则根据双方累计的时间,分别计算双方累计的保险费用,分别计算并扣除双方各自应该支付的利息。然后将用户转出的部分转入另外一个用户,即双方 bToken 数量的修改。作为利息的 bToken 则转入合约收益账户。 如果合约的收益作为 bToken 保存,则合约本身自己产生了担保成本。因此,合约的收益不能使用 bToken 保存,而需要用合约对应的底层代币 underlying 进行保存。例如,合约担保的是 Compound 产品,则合约的收益应该使用 underlying 即 cToken 来计算和保存。 ## 合约主要方法 所有方法返回 result 为 0,代表执行正确,否则返回相应的出错代码。 ### BToken ``` javascript contract BToken is ERC20 { function constructor(IDeFiVault DFV, string memory name, string memory symbol, uint decimals); // 需要输入 DeFiVault 合约地址 function setFees(uint256 fee) external returns (uint256 result); // 设置每个区块收取的保险手续费率,单位为 wei。如果按照每年1%计算,则换算为每个区块 4439371000 wei 的利息 function mint(address recipient, uint256 amount) external; // 存入资产换 BToken function burn(unint256 amount) external; // 存入 BToken 换取资产 function sweep() external; // 将之前累计的手续费,以及未兑换成功的 underlying token 兑换成相应资产,如DAI,然后作为fee支付 DFV.payFee() // 内部方法 function _calcFees() internal; // 计算用户的保险费用 } // 针对 MetaMoneyMarket 创建的 bToken contract MmmDfvConnector is BToken { IMetaMoneyMarket _MetaMoneyMarket; //BToken _bToken; function constructor(IMetaMoneyMarket MMM, IDeFiVault DFV, string memory name, string memory symbol, uint decimals) public BToken(DFV, name, symbol, decimals) { } function deposit(address tokenAddress, uint256 tokenAmount) external; function withdraw(address tokenAddress, uint256 tokenShareAmount) external; } ``` ### DeFiVault (DFV) ``` javascript contract DeFiVault is ERC20Mintable, ERC20Burnable { // Admins function addToken(address token) external onlyAdmin; function addOracle(address oracle, address token) external onlyAdmin; function addBToken(address bToken) external onlyAdmin; // 把支持的bToken合约添加到白名单 function addExchange(address exchange, address token) external onlyAdmin; // 添加交易所合约地址用于交易 DFV与其他代币,如DAI function claim(address token, uint256 amount) external onlyWhitelist returns (uint256 result); // 申请赔偿,返回新产生的 DFV 代币 function payFee(address token, uint256 amount) external; // bToken 合约将手续费发送给 DFV function redeemAuction(address token, uint256 amount) // 发送 DFV 代币来获取 token,然后销毁收到的 DFV } ``` ## 以下为以前的内容(可能过期,不用看) ## 担保资金增长机制 参与者角色: DefiBoard 用户,使用 DefiBoard 产品收益的人 DFB 投资人,为 DFB 出钱的人 DFB 贡献者,包括开发者,社区运营,Rebalance Worker,即出力不出钱的人。 以太坊的价格下跌,会不会导致 DFB 价格的下跌? 以太坊价格下跌,会使得借贷平台借入ETH做空,或者借入DAI来保证自己抵押的仓位。因此也会对资金端产生巨大需求,即从交易来说暴涨暴跌都会放大成交量,对资金产生更多需求,因此资金人的收益反而会增加,并为 DFB 资金系统带来更多的手续费,对 DFB 代币的需求反而增加。 ## 风险控制 ## 代币估值计算 - 2018年,DeFi 总交易量仅以太坊上达到 2.1 亿美元 - 2019年至今,以太坊 DeFi 总交易额为 4.3 亿美元,预计全年超过 5 亿美元,较去年增长 250% 以上。 - 预计 2020 年, 以太坊 DeFi 总交易额超过 10 亿美元。整个 DeFi 交易量超过 30 亿美元。 DFB 初始手续费率为 0.5%。那么 2020 年以太坊上的总手续费可以达到 5000 万美元,即DFB的总需求量为 5000 万美元。因此可以推算出 DFB 的价格。18年,以太坊 DeFi 还款总量 1.52 亿 - 2018年,以太坊 DeFi 还款总量 1.5 亿 - 2019年至今,以太坊 DeFi 还款总量 3.58 亿。预计全年超过 4 亿,增幅约 140 %。 - 预计 2020 年将超过 8.5 亿美元。 假设 DefiBoard 2020年可以获得 30 的交易量,即 3亿 美元。平均手续费 2% ,则 2020年平台手续费 2000 万美元。 | Column 1 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023| 2024 | | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | | 总还款 Repayment | 150 | 358 | 用户通过DFOS保险合约投资产品,合约记录用户投资的本金,记录 tokenshare 和 exchange rate DFOS合约自动扣除手续费,然后将手续费打到 交易所 换取 DFOS 代币。然后将 DFOS 代币销毁 将用户的投资打入相应的产品 用户提现,确保用户本金不损失,即确保exchange rate大于之前记录的。 如果完全提现,则计算用户是否本金损失。如果损失本金, 如果本金损失,DFOS合约根据当前币价计算出相应数量的 DFOS 代币创建,然后将DFOS代币 通过交易所兑换为用户的资产。 代币分发机制 lenders invest to MaxLend thru DFOS contracts. DFOS invests lenders fund to MaxLend, and gets MaxTokens. DFOS records the amount of MaxToken, and the exchange rate. DFOS return MaxToken to the lender. ```sequence Lender->DFB: Deposit DAI DFB->MMM: Deposit DAI MMM-->DFB: Return MaxDAI Note right of DFB: Update # of MaxDAI\n and exchangeRate DFB-->Lender: Return MaxDAI ``` When the lender sends MaxTokens to withdraw the underlying, DFOS sends user's MaxTokens to the MaxLend product. If succeeded, DFOS take a percentage fee off the returned assets, and send back the user all the remainings. ```sequence Lender->DFOS: Deposit MaxDAI DFOS->MMM: Deposit MaxDAI MMM-->DFOS: Return DAI Note right of DFOS: Take a 0.5% fee DFOS-->Lender: Return DAI ``` If failed, DFOS multiplies the tokens user supplies with exchange rate from MaxLend minusing the percent of fees, to calculate how much underlying needs to send back to the user. Then DFOS calculates how many DFOS tokens need to minted based on the oracle price. Then sends the user the newly minted DFOS tokens. ```sequence Lender->DFOS: Deposit MaxDAI N DFOS->MMM: Deposit MaxDAI N MMM-->DFOS: failed DFOS->MMM: Get exchangeRate Note right of DFOS: Mint new DFOS\nDFOS = N MaxDAI x exchangeRate DFOS-->Lender: Return DFOS ```