Proposal: Make use of multiple price feeds in the oracle for highly correlated assets to reduce the risk of unnecessary liquidations. For now, this includes the oracles for USDC, USDT, DAI, and SUSD, but could be expanded as Chainlink feeds are added. For a given asset X, the proposal is to use the X → USD price feed and the ETH → USD price feed to derive the X → ETH price. For example:
USDC → USD → ETH
USDT → USD → ETH
DAI → USD → ETH
YFI → ETH (unchanged)
Rationale: AAVE currently uses Chainlink as the primary oracle for all assets, which is a very resilient oracle network and is extremely difficult to manipulate. But the way Chainlink feeds are implemented in AAVE create unnecessary volatility for stablecoin pairs, which makes borrowing unnecessarily risky. This is because all stablecoin prices are converted to their ETH equivalent via the chainlink oracle. This creates volatility for a few different reasons.
- There is a 1% allowed deviation from the median price before the price feed for any asset will update. This means that the assets can increase your debt ratio by about 2% by just random chance alone.
- Different stablecoins are used in different markets. In the short term volatility situation of a market crash, stablecoin prices when converting to ETH will behave differently by asset because the liquidity for each asset pair is different. This can skew comparisons between stablecoins intensely, and could cause unnecessary liquidations.
A lot of these problems can be fixed when you note that most of the volatility in pricing happens in the stablecoin to cryptocurrency conversion. If all correlated assets share the same price feed for the volatile conversion, then the ratio between the correlated assets would no longer change due to price volatility. This solution has no impact on any assets that are correlated with ETH, and is win win as long as the solution can be implemented safely. Please see discussion below for more in depth detail on the issue.
It seems to me that the following are required if the change I’m proposing is to be implemented:
- Create a contract for each asset pair that aggregates the price from two Chainlink contracts and consolidates them into one price in a format that the AAVE oracle can accept. I built a proof of concept which can be compared to the current feed on Rinkeby for DAI to ETH. This is literally my first actual solidity code so it probably needs some work and testing. I think I’ve demonstrated that it’s possible though.
- Submit a proposal to the chain to call the setAssetSources function on the AAVE oracle to point to the new contracts.