代码解析算法稳定币 Basis Cash 运行机制
Basis Cash 采用了三币模型,BAC (Basis Cash)、BAS (Basis Share)、BAB (Basis Bond)三者相当于货币、股票和债券。
![](https://img.learnblockchain.cn/attachments/2021/01/thO6QCTw5ff7c9e237827.png) 2021 年 1 月 6 日晚上 9 点,我们组织大家一起 review 了算法稳定币中的 Basis,视频回顾在这里:https://www.bilibili.com/video/BV1bK4y157aR/ 。 非常感谢**菠菜**大神的分享。 目前的稳定币一共分为三种: - 锚定法币,比如 USDT 和 USDC,也包括交易所发行的稳定币,例如 BUSD、HUSD 等。 - 链上资产抵押型,比如 MakerDAO 的 DAI 和 Synthetix 的 sUSD。 - 算法稳定币,比如 AMPL、ESD、Frax,还有今天要说的 Basis。 算法稳定币经历了几个阶段,basis 是很新的一个项目,采用了三币模型。 ## Basis 机制 Basis 有三个币:BAC(Basis Cash)、BAS(Basis Share)、BAB(Basis Bond),三者相当于货币,股票和债券。可以将 Basis 理解为一个央行,BAC 是央行发行的货币;BAS 是央行的股东持有的股票,需要承担系统风险,也获取系统的收益;BAB 是债券,相当于央行的债券。 这 3 个都是 erc20 token,BAB 目前没有日期限制,只要在合适的价格就可以兑付。 ![](https://img.learnblockchain.cn/attachments/2021/01/l544EOdQ5ff7ca00ef9f3.png) BAC 价格调节机制就是一个市场供需的调节机制。 - 当 BAC 价格少于 1 美元,需要减少 BAC 流通,让 BAC 的价格自然上升到 1 美元 - BAC 价格少于 1 美元,用户可以用申购债券 BAB,方式是销毁 BAC,得到 BAB - BAB 价格 = BAC 价格的平方,因为 BAC 价格小于 1,所以平方后的 BAB 的价格会更低 - 未来可以用一个 BAB 换回一个 BAC - 当 BAC 价格超过 1 美元,需要增加 BAC 流通,让 BAC 的价格自然下降到 1 美元 - 目前的阈值是当 BAC > 1.05 时,可以触发系统增发 BAC - 增发的 BAC 会发给持有 BAB 和 BAS 的用户 - **优先还债,所以先给持有 BAB 的用户,方式是销毁 BAB,得到 BAC** - 剩下的 BAC 给 BAS 持有人,如果没有剩余,则不给 BAS 持有人分配 - BAS 相当于股东,只有锁定到 boardroom 合约 的 BAS 才能获得这部分收益 ## 代码解读 源码在:[https://github.com/Basis-Cash/basiscash-protocol](https://github.com/Basis-Cash/basiscash-protocol) ### treasury.sol setFund 修改基金地址 setFuncAllocationRate 修改比率 getBondOraclePrice 是通过预言机获取 Uniswap 上 BAB 的价格 getSeigniorageOraclePrice 是通过预言机获取 Uniswap 上 BAC 的价格 bugBonds 购买债券,targetPrice 是给前端进行校验的,只能 BAC 小于 1 美元才能执行 redeemBonds,赎回债券,BAC 价格要大于 1.05 美元才能执行 allocateSeigniorage 核心函数,开发者定期的去调用 - 价格小于 1.05 不执行,大于 1.05 才计算发多少钱 - 需要在一个 epoch (周期)开始后才能执行, checkEpoch 是 1 个 modifier, - 计算增发量,并增发 ```js uint256 seigniorage = cashSupply.mul(percentage).div(1e18); IBasisAsset(cash).mint(address(this), seigniorage); ``` - 每次增发的总量的 2%会进入到 Community Development Fund(社区发展基金) ```js uint256 fundReserve = seigniorage.mul(fundAllocationRate).div(100); IERC20(cash).safeApprove(fund, fundReserve); ISimpleERCFund(fund).deposit(...) ``` - 发给债券持有人 ```js uint256 treasuryReserve = ...; accumulatedSeigniorage = accumulatedSeigniorage.add(treasuryReserve); emit TreasuryFunded(now, treasuryReserve); ``` - 给股票持有人(BAS),也就是给 boardroom ### Boardroom.sol Boardroom 相当于董事会,是 Basis 股份的持有者。 计算董事会成员可以分多少钱 allocateSeigniorage 计算可以分配多少钱 claimReward 取钱操作 通用代码模块 ### Timelock.sol 时间锁是治理体系不可或缺的一部分,通过 Timelock 限制超级用户对系统参数的修改,使普通用户有足够的时间进行决策,这里的 Timelock,参数需要等待至少 2 天才能生效。 ```js uint256 public constant MINIMUM_DELAY = 2 days; uint256 public constant GRACE_PERIOD = 14 days; uint256 public constant MAXIMUM_DELAY = 30 days; ``` 还有个巧妙的 onlyOneBlock, 限制 1 个块中只能有 1 个操作者,防止多次调用。 ```js _status[block.number][tx.origin] = true; _status[block.number][msg.sender] = true; ``` ## 总结 Basis 的代码很巧妙,化繁为简,代码也很整洁,通过 3 种 token 的互相转化,保持价格稳定。 AMPL 的供应量是自动调整的,而 Basis 的 token 供应调整是通过激励用户的投机行而主动参与的。 关于 Basis 的更多介绍请看视 https://www.bilibili.com/video/BV1bK4y157aR/ 。 原文:https://mp.weixin.qq.com/s/MfCKHGdvlYYWRzWSwzjPrw --- **Code Review** 是由 Rebase 社区组织的代码学习活动,通过小组学习的形式一起学习开源项目代码。通过 review 代码,可以深入了解一个项目;通过小组学习,大家可以一起互相激励学习、交流和进步。Happy Review! <img src="https://upyun-assets.ethfans.org/uploads/photo/image/3b2920f8380b4754a0e2054ae3635a68.jpg" width="300">
2021 年 1 月 6 日晚上 9 点,我们组织大家一起 review 了算法稳定币中的 Basis,视频回顾在这里:https://www.bilibili.com/video/BV1bK4y157aR/ 。 非常感谢菠菜大神的分享。
目前的稳定币一共分为三种:
-
锚定法币,比如 USDT 和 USDC,也包括交易所发行的稳定币,例如 BUSD、HUSD 等。
-
链上资产抵押型,比如 MakerDAO 的 DAI 和 Synthetix 的 sUSD。
-
算法稳定币,比如 AMPL、ESD、Frax,还有今天要说的 Basis。
算法稳定币经历了几个阶段,basis 是很新的一个项目,采用了三币模型。
Basis 机制
Basis 有三个币:BAC(Basis Cash)、BAS(Basis Share)、BAB(Basis Bond),三者相当于货币,股票和债券。可以将 Basis 理解为一个央行,BAC 是央行发行的货币;BAS 是央行的股东持有的股票,需要承担系统风险,也获取系统的收益;BAB 是债券,相当于央行的债券。 这 3 个都是 erc20 token,BAB 目前没有日期限制,只要在合适的价格就可以兑付。
BAC 价格调节机制就是一个市场供需的调节机制。
-
当 BAC 价格少于 1 美元,需要减少 BAC 流通,让 BAC 的价格自然上升到 1 美元
-
BAC 价格少于 1 美元,用户可以用申购债券 BAB,方式是销毁 BAC,得到 BAB
-
BAB 价格 = BAC 价格的平方,因为 BAC 价格小于 1,所以平方后的 BAB 的价格会更低
-
未来可以用一个 BAB 换回一个 BAC
-
-
当 BAC 价格超过 1 美元,需要增加 BAC 流通,让 BAC 的价格自然下降到 1 美元
-
目前的阈值是当 BAC > 1.05 时,可以触发系统增发 BAC
-
增发的 BAC 会发给持有 BAB 和 BAS 的用户
-
优先还债,所以先给持有 BAB 的用户,方式是销毁 BAB,得到 BAC
-
剩下的 BAC 给 BAS 持有人,如果没有剩余,则不给 BAS 持有人分配
-
BAS 相当于股东,只有锁定到 boardroom 合约 的 BAS 才能获得这部分收益
-
代码解读
源码在:https://github.com/Basis-Cash/basiscash-protocol
treasury.sol
setFund 修改基金地址
setFuncAllocationRate 修改比率
getBondOraclePrice 是通过预言机获取 Uniswap 上 BAB 的价格
getSeigniorageOraclePrice 是通过预言机获取 Uniswap 上 BAC 的价格
bugBonds 购买债券,targetPrice 是给前端进行校验的,只能 BAC 小于 1 美元才能执行
redeemBonds,赎回债券,BAC 价格要大于 1.05 美元才能执行
allocateSeigniorage 核心函数,开发者定期的去调用
-
价格小于 1.05 不执行,大于 1.05 才计算发多少钱
-
需要在一个 epoch (周期)开始后才能执行, checkEpoch 是 1 个 modifier,
-
计算增发量,并增发
uint256 seigniorage = cashSupply.mul(percentage).div(1e18); IBasisAsset(cash).mint(address(this), seigniorage);
- 每次增发的总量的 2%会进入到 Community Development Fund(社区发展基金)
uint256 fundReserve = seigniorage.mul(fundAllocationRate).div(100);
IERC20(cash).safeApprove(fund, fundReserve);
ISimpleERCFund(fund).deposit(...)
- 发给债券持有人
uint256 treasuryReserve = ...;
accumulatedSeigniorage = accumulatedSeigniorage.add(treasuryReserve);
emit TreasuryFunded(now, treasuryReserve);
- 给股票持有人(BAS),也就是给 boardroom
Boardroom.sol
Boardroom 相当于董事会,是 Basis 股份的持有者。
计算董事会成员可以分多少钱
allocateSeigniorage 计算可以分配多少钱
claimReward 取钱操作
通用代码模块
Timelock.sol
时间锁是治理体系不可或缺的一部分,通过 Timelock 限制超级用户对系统参数的修改,使普通用户有足够的时间进行决策,这里的 Timelock,参数需要等待至少 2 天才能生效。
uint256 public constant MINIMUM_DELAY = 2 days;
uint256 public constant GRACE_PERIOD = 14 days;
uint256 public constant MAXIMUM_DELAY = 30 days;
还有个巧妙的 onlyOneBlock, 限制 1 个块中只能有 1 个操作者,防止多次调用。
_status[block.number][tx.origin] = true;
_status[block.number][msg.sender] = true;
总结
Basis 的代码很巧妙,化繁为简,代码也很整洁,通过 3 种 token 的互相转化,保持价格稳定。
AMPL 的供应量是自动调整的,而 Basis 的 token 供应调整是通过激励用户的投机行而主动参与的。
关于 Basis 的更多介绍请看视 https://www.bilibili.com/video/BV1bK4y157aR/ 。
原文:https://mp.weixin.qq.com/s/MfCKHGdvlYYWRzWSwzjPrw
Code Review 是由 Rebase 社区组织的代码学习活动,通过小组学习的形式一起学习开源项目代码。通过 review 代码,可以深入了解一个项目;通过小组学习,大家可以一起互相激励学习、交流和进步。Happy Review!
<img src="https://upyun-assets.ethfans.org/uploads/photo/image/3b2920f8380b4754a0e2054ae3635a68.jpg" width="300">
区块链技术网。
- 发表于 2021-01-08 11:01
- 阅读 ( 1439 )
- 学分 ( 22 )
- 分类:DeFi
评论