原文标题:《Code Review 回顾:算法稳定币 Basis》 2021 年 1 月 6 日晚上 9 点,我们组织大家一起 review 了算法稳定币中的 Basis,视频回顾在 这里 ,非常感谢菠菜的分享。 目前的稳定币一共分为三种: 锚定法币,比如 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 才能获得这部分收益 代码解读 源码 treasury.sol 合约中主要的方法包括: setFund:修改社区发展基金接收地址 setFundAllocationRate:修改社区发展基金从 BAC 增发中接收的比率 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).p(1e18); IBasisAsset(cash).mint(address(this), seigniorage); 每次增发的总量的 2% 会进入到 Community Development Fund (社区发展基金)uint256 fundReserve = seigniorage.mul(fundAllocationRate).p(100); IERC20(cash).safeApprove(fund, fundReserve); ISimpleERCFund(fund).deposit(...) 发给债券持有人uint256 treasuryReserve = ...; accumulatedSeigniorage = accumulatedSeigniorage.add(treasuryReserve); emit TreasuryFunded(now, treasuryReserve); 给股票持有人(BAS),也就是给 boardroomIBoardroom(boardroom).allocateSeigniorage(boardroomReserve); 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 供应调整是通过激励用户的投机行为,让用户主动参与的。 免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻 ChainNews 立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。 —- 编译者/作者:Rebase社区 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
硬核 | 代码解析算法稳定币 Basis Cash 运行机制
2021-02-15 Rebase社区 来源:链闻
LOADING...
相关阅读:
- 路印协议与 acBTC 聊路印 Layer2 解决方案,以及 acBTC 最新进展2021-02-15
- 比特币BTC02-15行情分析2021-02-15
- 乘风破浪filecoin扬帆起航!漫长等待与求索,技术团队披荆斩棘2021-02-15
- 瑞波币价格分析:在技术状况恶化的情况下,XRP分解可能继续至0.4美元2021-02-15
- 我国区块链产业“脱虚向实”步伐逐渐加快2021-02-15