广告

算法稳定币 Basis

Code Review 回顾:算法稳定币 Basis

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:修改社区发展基金接收地址

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).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

IBoardroom(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 供应调整是通过激励用户的投机行为,让用户主动参与的。

24小时热点

区块链的“钱包地址”是什么?

区块链的“钱包地址”是一个字符串,它是一个用户在比特币或以太 ...

84977

币团交易所

企业初创阶段的特点

企业初创阶段一般指企业由创业者开始萌芽之初,但尚未正式注册、 ...

114298

TokenInsight
广告

热点专题

NFT艺术品到底是什么?

Beeple,“EVERYDAYS: THE FIRST 5 ...

2302618

Opera House

最全的NFT发展史

当我们理解一个新生事物,必须要首先了解其起源,通过对其源头以 ...

1741884

iBox

“华英会”诈骗圈钱5000亿!崩盘后将会凄惨无比

“华英会”崩盘的预警已多次发出,尽管尚未正式宣布崩盘,但大家 ...

1268286

Magic Eden

什么是IDO?这种模式会带来怎样的影响?

要理解IDO(Initial DeFi Offering)初 ...

1142497

Bitstamp交易所

有黑客采取新型 USDT 假充值手法

根据慢雾区情报,有黑客采取新型 USDT 假充值手法,黑客采 ...

996155

区块链博客

4种利用永续合约资金费率套利的策略

下文将介绍在保持市场中立的条件下,如何从永续掉期资金费率中套 ...

904752

DCG区块链孵化器

链圈百科:韩国政府机构组织图

一、行政院 韩国行政院是一个由政府的行政机构组成的中央政府 ...

822626

BitKeep钱包

国内NFT平台是怎么赚钱的?

2021年被称为NFT的“元年”,互联网巨头、各大企业、艺术 ...

797900

CoinBene满币网

元宇宙平台合法吗

现在,元宇宙平台备受热捧,但有人质疑其合法性。在此,我们将对 ...

750629

T网

宝二爷郭宏才的乘风破浪之旅

10年后的比特币会涨到10万美元吗?宝二爷说过:“先吹吹牛B ...

706507

QuillAudits