# Yam历史

## YAM版本

Yam协议的初始版本启动于2020年8月12日，之后由于一个致命的系统漏洞，导致失去了对Yam金库基金中资产的控制权限，也因此失去了对项目进行继续治理的可能性。之后项目方宣布了重启计划，并将初始版本YAMv1迁移至临时版本YAMv2，以使社区成员在等待正式版本YAM代码审计期间，可以对最终版本的具体参数设置进行投票表决。2020年9月18日，功能完备的正式版YAM发布，同时开启了YAMv2到YAM的迁移工作。

### YAMv1摘要

YAMv1因致命的系统漏洞而导致无法对项目进行治理，请点击查看[YAMv1事件完整回顾](http://www.apple.com/au/)文章。

YAMv1代币地址：`0x0e2298e3b3390e3b945a5456fbf59ecc3f55da16`

### YAMv2摘要

YAMv2是稳定且功能单一的ERC20代币，在成功募集到足够的代码审计资金后，创始团队部署了YAMv2合约。在等待正式版本YAM代码审计期间，社区成员使用YAMv2对最终版本的具体参数设置进行了投票表决并做出相应的修改。请点击查看[YAMv2临时治理摘要](http://www.apple.com/au/)文章。

YAMv2代币地址：`0xAba8cAc6866B83Ae4eec97DD07ED254282f6aD8A`

### YAM正式版

2020年9月18日，内建基数调整（Rebasing）机制，功能完备的弹性代币YAM正式版发布。同年12月29日，经Yam社区投票表决通过，正式取消了Rebasing弹性供应机制，同时Yam协议的`比例因子系数（Scaling Factor）`也永远定格在2.50这一数值。

YAM代币地址：`0x0aacfbec6a24756c20d41914f2caba817c0d8521`

## Rebase相关内容

经Yam社区投票表决通过，**Yam于2020年12月29日正式取消了Rebasing弹性供应机制。**&#x540C;时Yam协议的`比例因子系数（Scaling Factor）`也永远定格在2.50这一数值。

以下内容仅供存档使用：

### Rebase基本要点

通常来说，基数调整（Rebasing）是一种用来推动代币价格趋于稳定的机制，它通过自动调节供应量来实现这一功能。当代币价格高于目标价格时，供应量增加；而低于目标价格时，则供应量减少。YAM最后锚定的目标价格为1 USDC，同时使用Sushiswap YAM/ETH流动池的数据生成TWAP（时间加权平均价格）的预言机数据，以判定是否有必要对供应量进行调整。

* 如果YAM的价格高于1.05 USDC，则增加YAM的供应量，这被称为正向基数调整（通胀）。
* 如果YAM的价格低于1.05 USDC，则减少YAM的供应量，这被称为负向基数调整（通缩）。
* 如果YAM的价格介于0.95 - 1.05 USDC，则YAM的供应量保持不变，不进行基数调整。

当基数调整发生时，Yam内置的`比例因子系数（Scaling Factor）`也会同时产生变化，并对所有地址上的YAM余额自动进行调整，无一例外。

在Yam协议中，每当正向基数调整（通胀）发生时，YAM供应量增加部分的5%都会被用来在Sushiswap YAM/ETH流动池进行出售，换成ETH作为储备金资产存入由社区共同管理的金库基金。

### Rebase相关计算

在计算供应量变化之前，首先需要确定代币的当前价格与目标价格的偏离比：

* 价格偏离比 = ( 当前价格 - 目标价格 ) ÷ 目标价格

同时，为了降低因供应量调整而产生的剧烈波动，将YAM的价格平滑引向目标价格，Yam协议引入了`变基迟滞参数（RebaseLag）`，这个参数的数值最后被设定为20。

变基迟滞参数会将供应量的调整，分散在20个基数调整周期内进行。也就是说，在没有任何买入/卖出的前提下，经过20次基数调整后，代币价格将与目标价格相吻合。

综合以上，基数调整所产生的供应量变化、新的供应总量，以及金库注入储备金的计算公式，分别对应如下：

* 供应量变化 = 当前供应总量 × ( 价格偏离比 ÷ 变基迟滞参数 )
* 新供应总量 = 当前供应总量 + 供应量变化
* 金库基金注入资金数量 = 供应量变化 × 5%

举例说明，如果目前YAM供应总量为500万枚，当前价格为1.1美元，目标价格为1美元，则相应的数据及计算过程如下：

* 价格偏离比：( 1.1 - 1 ) ÷ 1 = 0.1
* 供应量变化：5,000,000 × ( 0.1 ÷ 20 ) = 25,000
* 新供应总量：5,000,000 + 25,000 = 5,025,000
* 金库基金注入资金数量：25,000 × 5% = 1,250（此部分会售出换成储备金资产后，存入金库基金）
* 分发给YAM持有者数量：25,000 - 1,250 = 23,750

### 最大滑点限制

为了避免因购买储备金资产而对市场价格造成过度压力，Yam协议对该交易行为设置了一个阈值，以降低对价格产生影响，这个阈值被称为`最大滑点（MaxSlippage）`，Yam协议中最后的最大滑点值被设置为5%。

金库基金在出售YAM用于购买储备金资产时，如果触发最大滑点仍未能全部卖出，则剩余部分会在下次基数调整后，继续在不超出最大滑点的范围内进行出售。

### 流动性供给

内建基数调整（Rebasing）机制的弹性代币，并非一种标准的ERC20代币。在功能性上，这一类代币超出了标准的ERC20定义规范。因此，在默认情况下，诸如Uniswap、Sushiswap和Balancer这样的流动性平台，无法正确处理基数调整所导致的代币数量增减。即便流动池内的代币数量因基数调整而产生了变化，流动池也无法进行正确识别，这就导致了恶意交易者或交易机器人可以利用这一漏洞来“盗取”这些代币。

通过向相关流动池添加有效函数调用的方法，可以避免这种情况的发生。对Uniswap和Sushiswap而言，这个函数就是`同步函数 sync()`。目前`同步函数 sync()`已被添加至Uniswap YAM/yUSD流动池、Uniswap YAM/ETH流动池，以及Sushiswap YAM/ETH流动池的合约调用代码中，以确保相关流动池可以正确识别基数调整所带来的代币数量增减。

需要注意的是，除了上述3个流动池之外的所有其它流动池，都没有添加`同步函数 sync()`调用。在基数调整发生时，这些流动池会存在相关风险。

### TWAP预言机

基数调整的相关计算需要使用由Sushiswap流动池提供的TWAP（时间加权平均价格）数据。TWAP预言机用于测算两次基数调整之间的价格变化平均值，也被用来确定YAM代币的当前价格。

由于金库基金资产的购买流动池是YAM/ETH，而YAM的目标价格是1 USDC，因此计算YAM的TWAP价格需要用到YAM/ETH和ETH/USDC两个流动池内的TWAP数据，从而可以推导获得YAM/USDC的TWAP价格。

## Gitcoin捐赠金

在YAMv2临时治理期间，一项关于Gitcoin的提案被提交并通过。该提案批准将金库基金资产的1%捐赠给Gitcoin，用以资助以太坊网络上的公共开源项目。

注：Gitcoin是致力于让开源项目贡献者获得奖金回报的网络平台。
