shaneson.eth

Posted on Feb 05, 2022Read on Mirror.xyz

Wonderland和OHM实现(9,9)的关键--Abracadabra源码分析(一)

要时刻保持冷静,严谨。因为敲出来的每字母都要对几千万,甚至几个亿的资产负责。

接上一篇文章我对Abracadabra研究了之后,对它的Oracle Price计算非常有疑惑。一些生息资产居然可以计算Rate和Price。包括:3crv,3crypto等等。然后我就花了相对久等时间去研读源码。整个项目源码中Oracle的代码量占到了50%以上,所以这个项目的重点和难点明显是在Oracle部分。我把代码看完了之后,然后得到下面的图(简要):

因为篇幅问题,上面还有接近20个合约还没有列。毕竟重要的有Spell,sSpell,wMemo(Wonderland实现9,9的关键代码),wOHMLink(OHM实现9,9的核心代码)。这篇主要是用来总结Abracadabra和OHM与Wonderland联系最相近的(9,9)部分。

(9,9)

在Wonderland上如何实现(9,9)呢?如下图:第一步是质押$TIME;第二步是把$MEMO转成$wMEMO;然后去Abracadabra上用$wMEMO借出$MIM; 然后把$MIM换成$TIME,然后STAKE。结束一轮循环。可以看到,(9,9)的概念其实相当于杠杠做(3,3)。这个杠杆率是自己控制的,官方建议不要超过20%。我目测认为,Wonderland的TVL这么高的原因跟Abracadabra离不开关系。而(9,9)能实现最关键的部分在于支持wMemo借贷,而wMemo是一个生息资产。如何对wMemo定价成了这个逻辑的核心问题,而解决了这个问题的合约是wMEMOOracle.sol。接下来讲一下这个合约。

wMEMOOracle.sol源码分析

这个合约主要是用来获取wMEMO的价格的。我们先看他需要用到的外部接口有哪些:IAggregator和IWMEMO。IAggregator是用来访问chainlink合约的。(IMEMO这个接口被我删了,因为没用)

interface IAggregator {
    function latestAnswer() external view returns (int256 answer);
}

然后我们看一下他的存储区:其中,最重要的是MIM_USD和WMEMO_MIM。MIM_USD拿到的是Chianlink的MIM_USD价格对,WMEMO_MIM是UniswapFactory实例的Pair对。

    using FixedPoint for *;
    using BoringMath for uint256;
    uint256 public constant PERIOD = 10 minutes;
    IAggregator public constant MIM_USD = IAggregator(0x54EdAB30a7134A16a54218AE64C73e1DAf48a8Fb);
    IUniswapV2Pair public constant WMEMO_MIM = IUniswapV2Pair(0x4d308C46EA9f234ea515cC51F16fba776451cac8);

    struct PairInfo {
        uint256 priceCumulativeLast;
        uint32 blockTimestampLast;
        uint144 priceAverage;
    }

    PairInfo public pairInfo;

最后,我们看一下他是怎么get price的:首先它通过传入blocktimestamp,然后利用uniswap的接口计算出priceCumulative这个值;得到了priceCumulative之后,然后传入Chainlink的Oracle报价,利用移动平均的计算方式计算MIM的平均值,最后得到priceAverage。为什么不直接WMEMO_MIM * MIM呢,因为这样做会有闪电贷的漏洞。

Oracle总结

看了大概30多个合约,能总结出来那些莫名其妙的Token(生息资产,Chainlink和其他Oracle都没有这个pricefeed)拿到价格的机制是:

  1. Chainlink有的,读Chainlink。
  2. Chainlink没有?在Uniswap上有没有交易对,如果有那么就Uniswap Paris * ETH (USDT/MIM) Chainlink price
  3. Chianlink和Uniswap上都没有?看一下Curve里面有没有交易对,如果有那么就Curve lp paris * ETH (USDT/MIM) Chainklink price
  4. Chianlink和Uniswap和Curve上都没有?可能是一些新链的Token和很特殊的Token,联系一下对应链的DEX有没有API或者LP获得的方式。如果有,就是LP * ETH (USDT/MIM) Chainklink price

多说一句,我为我之前看空Chainlink忏悔,为我的错误认知道歉。虽然Chainlink很贵,但是它的昂贵却换来了超高的数据质量。有些事情,看似便宜,但很贵;有些事情,看似很贵,但是很便宜~~

随着经验的上涨,我现在真的觉得以前无知的自己很傻逼~嗯。现在好像2,3个月回首过往都觉得当时的自己傻逼且弱智。

这就是成长吗?

最后:

要时刻保持冷静,严谨。因为敲出来的每字母都要对几千万,甚至几个亿的资产负责。