diff --git a/contracts/misc/OracleAnchor.sol b/contracts/misc/OracleAnchor.sol index 16f5cf15..12eaaa55 100644 --- a/contracts/misc/OracleAnchor.sol +++ b/contracts/misc/OracleAnchor.sol @@ -1,14 +1,33 @@ +// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.6.12; -contract AaveOracle { - event AssetSourceUpdated(address indexed asset, address indexed source); +contract OracleAnchor { + event AssetSourceUpdated(address indexed token, address indexed aggregator); + event ChainlinkAggregatorUpdated(address indexed asset, address indexed source); event OracleSystemMigrated(); - constructor(address[] calldata assets, address[] calldata sources) public { - require(assets.length == sources.length, 'INCONSISTENT_PARAMS_LENGTH'); + constructor( + address[] memory aaveOracleAssets, // token assets that are complex + address[] memory aaveOracleSources, // custom oracles for complex tokens + address[] memory aggregatorAssets, // assets directly related to chainlink + address[] memory aggregatorSources // chainlink aggregator contract + ) public { + require( + aaveOracleAssets.length == aaveOracleSources.length, + 'INCONSISTENT_AAVEORACLE_PARAMS_LENGTH' + ); + require( + aggregatorAssets.length == aggregatorSources.length, + 'INCONSISTENT_CHAINLINKAGGREGATOR_PARAMS_LENGTH' + ); emit OracleSystemMigrated(); - for (uint256 i = 0; i < assets.length; i++) { - emit AssetSourceUpdated(assets[i], sources[i]); + + for (uint256 i = 0; i < aaveOracleAssets.length; i++) { + emit AssetSourceUpdated(aaveOracleAssets[i], aaveOracleSources[i]); + } + + for (uint256 i = 0; i < aggregatorAssets.length; i++) { + emit ChainlinkAggregatorUpdated(aggregatorAssets[i], aggregatorSources[i]); } } } diff --git a/package.json b/package.json index 1f8d3043..9a801a7b 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,8 @@ "dev:UniswapLiquiditySwapAdapter": "hardhat --network kovan deploy-UniswapLiquiditySwapAdapter --provider 0x88757f2f99175387aB4C6a4b3067c77A695b0349 --router 0xfcd87315f0e4067070ade8682fcdbc3006631441 --weth 0xd0a1e359811322d97991e03f863a0c30c2cf029c", "main:deployUniswapRepayAdapter": "hardhat --network main deploy-UniswapRepayAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D --weth 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "main:UniswapLiquiditySwapAdapter": "hardhat --network main deploy-UniswapLiquiditySwapAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D --weth 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "dev:deployOracleAnchor": "hardhat --network kovan deploy-OracleAnchor", + "main:OracleAnchor": "hardhat --network main deploy-OracleAnchor", "kovan:verify": "npm run hardhat:kovan verify:general -- --all --pool Aave", "ropsten:verify": "npm run hardhat:ropsten verify:general -- --all --pool Aave", "mainnet:verify": "npm run hardhat:main verify:general -- --all --pool Aave", diff --git a/tasks/deployments/deploy-OracleAnchor.ts b/tasks/deployments/deploy-OracleAnchor.ts new file mode 100644 index 00000000..0a5ed814 --- /dev/null +++ b/tasks/deployments/deploy-OracleAnchor.ts @@ -0,0 +1,145 @@ +import { task } from 'hardhat/config'; + +import { OracleAnchorFactory } from '../../types'; +import { verifyContract } from '../../helpers/etherscan-verification'; +import { EthereumNetwork } from '../../helpers/types'; + +task(`deploy-OracleAnchor`, `Deploys the OracleAnchor contract`) + .addFlag('verify', 'Verify OracleAnchor contract via Etherscan API.') + .setAction(async ({ verify }, localBRE) => { + await localBRE.run('set-DRE'); + + if (!localBRE.network.config.chainId) { + throw new Error('INVALID_CHAIN_ID'); + } + + const aaveOracleAssets = { + [EthereumNetwork.main]: [ + '0x056fd409e1d7a124bd7017459dfea2f387b6d5cd', // GUSD + '0x8798249c2e607446efb7ad49ec89dd1865ff4272', // XSUSHI + ], + [EthereumNetwork.kovan]: [], + }; // token assets that are complex + const aaveOracleSources = { + [EthereumNetwork.main]: [ + '0xec6f4cd64d28ef32507e2dc399948aae9bbedd7e', // GUSD + '0x9b26214bec078e68a394aaebfbfff406ce14893f', // XSUSHI + ], + [EthereumNetwork.kovan]: [], + }; // custom oracles for complex tokens + const aggregatorAssets = { + [EthereumNetwork.main]: [ + '0x0000000000085d4780b73119b644ae5ecd22b376', // TUSD + '0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e', // YFI + '0x0d8775f648430679a709e98d2b0cb6250d2887ef', // BAT + '0x0f5d2fb29fb7d3cfee444a200298f468908cc942', // MANA + '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', // UNI + '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', // WBTC + '0x408e41876cccdc0f92210600ef50372656052a38', // REN + '0x4fabb145d64652a948d72533023f6e7a623c7c53', // BUSD + '0x514910771af9ca656af840dff83e8264ecf986ca', // LINK + '0x57ab1ec28d129707052df4df418d58a2d46d5f51', // SUSD + '0x6b175474e89094c44da98b954eedeac495271d0f', // DAI + '0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9', // AAVE + '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2', // MKR + '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', // USDC + '0xba100000625a3754423978a60c9317c58a424e3d', // BAL + '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f', // SNX + '0xd533a949740bb3306d119cc777fa900ba034cd52', // CRV + '0xdac17f958d2ee523a2206206994597c13d831ec7', // USDT + '0xdd974d5c2e2928dea5f71b9825b8b646686bd200', // KNC + '0xe41d2489571d322189246dafa5ebde1f4699f498', // ZRX + '0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c', // ENJ + '0x10f7fc1f91ba351f9c629c5947ad69bd03c05b96', // USD => USD_MOCK_ADDRESS + '0x6b3595068778dd592e39a122f4f5a5cf09c90fe2', // SUSHI + ], + [EthereumNetwork.kovan]: [ + '0x016750ac630f711882812f24dba6c95b9d35856d', // TUSD + '0xb7c325266ec274feb1354021d27fa3e3379d840d', // YFI + '0x2d12186fbb9f9a8c28b3ffdd4c42920f8539d738', // BAT + '0x738dc6380157429e957d223e6333dc385c85fec7', // MANA + '0x075a36ba8846c6b6f53644fdd3bf17e5151789dc', // UNI + '0xd1b98b6607330172f1d991521145a22bce793277', // WBTC + '0x5eebf65a6746eed38042353ba84c8e37ed58ac6f', // REN + '0x4c6e1efc12fdfd568186b7baec0a43fffb4bcccf', // BUSD + '0xad5ce863ae3e4e9394ab43d4ba0d80f419f61789', // LINK + '0x99b267b9d96616f906d53c26decf3c5672401282', // SUSD + '0xff795577d9ac8bd7d90ee22b6c1703490b6512fd', // DAI + '0xb597cd8d3217ea6477232f9217fa70837ff667af', // AAVE + '0x61e4cae3da7fd189e52a4879c7b8067d7c2cc0fa', // MKR + '0xe22da380ee6b445bb8273c81944adeb6e8450422', // USDC + '0x7fdb81b0b8a010dd4ffc57c3fecbf145ba8bd947', // SNX + '0x13512979ade267ab5100878e2e0f485b568328a4', // USDT + '0x3f80c39c0b96a0945f9f0e9f55d8a8891c5671a8', // KNC + '0xd0d76886cf8d952ca26177eb7cfdf83bad08c00c', // ZRX + '0xc64f90cd7b564d3ab580eb20a102a8238e218be2', // ENJ + '0x10f7fc1f91ba351f9c629c5947ad69bd03c05b96', // USD => USD_MOCK_ADDRESS + ], + }; // assets directly related to chainlink + const aggregatorSources = { + [EthereumNetwork.main]: [ + '0x0c632ec5982e3a8dc116a02eba7a419efec170b1', //TUSD + '0x4a03707a1bfefc2836a69b1a6a6bd752270041a9', // YFI + '0x3146392934da3ae09447cd7fe4061d8aa96b50ae', // BAT + '0x3162c2de0c254b97d869a070929b518b5b9b56b3', // MANA + '0x5977d45ba0a1ffc3740506d07f5693bbc45df3c7', // UNI + '0xbd72da70007e47aaf1bbd84918675392cf6885f7', // WBTC + '0x1a53bf1bfffb7a2b33e1931d33423c7c94f675ee', // REN + '0x661be809784e094ea70f980939cf3f09337a3178', // BUSD + '0x7e6c635d6a53b5033d1b0cee84eccea9096859e4', // LINK + '0x060f728deb96875f992c97414eff2b3ef6c58ec7', // SUSD + '0xd866a07dea5ee3c093e21d33660b5579c21f140b', // DAI + '0x42f3b59f72772eb5794b04d2d85afac0d30a5683', // AAVE + '0x204a6fe11de66aa463879f47f3533dd87d47020d', // MKR + '0x00d02526ca08488342ab634de3b2d0050ecc7f60', // USDC + '0x4f5e9704b1d7cc032553f63471d96fcb63ff2bc3', // BAL => different contract than others + '0xbafe3cb0e563e914806a99d547bdbf2cfcf5fdf6', // SNX => same + '0x7f67ca2ce5299a67acd83d52a064c5b8e41ddb80', // CRV => same + '0x1058a82c25f55ab8ab0ce717f3e6e164e80f1a0b', // USDT + '0x075fe11b3dd9c605f7fd09ff9310e3e37baabc9e', // KNC + '0xe03b49682965a1eb5230d41f96e10896dc563f0d', // ZRX + '0x20aff4833e5d261bb34bc3980d88ad17a3fe90dc', // ENJ + '0x00c7A37B03690fb9f41b5C5AF8131735C7275446', // USD + '0x00377d6c82df8f63163ff828760b2a5d935734cf', // SUSHI + ], + [EthereumNetwork.kovan]: [ + '0x5d233bc41d345646f855502892eb11173f4b807b', //TUSD + '0xe45f3ed2218e7e411bf8dfde66069e57f46b26ef', // YFI + '0x7eeffd6a9d145f558b793f3aa65141bcd0c86312', // BAT + '0x3e360e4db87a34738fa9d4ac819f208d8275a66b', // MANA + '0x8d592e53fb1243657a51e531bfc30a3617a4173e', // UNI + '0x222d3bd9bc8aef87afa9c8e4c7468da3f2c7130d', // WBTC + '0x0fd41f0160c3567ae149b1564c080df208cba3b9', // REN + '0x361e36e9d6f47f8312e9709312e088304b013d8b', // BUSD + '0xb44aa3a6fc6419fac0a4fb9b9b8bfd69939503ff', // LINK + '0x55dca5e95d271f2d074a5e6cf4bf95b7db80d67d', // SUSD + '0x30fde1d82a4e58e579a64dbbcd8d4650805cf3c8', // DAI + '0xde222c97adb2bb443c381edf4bb3f5bccd533808', // AAVE + '0x0df8bbcd897fef6717d1cc44ac45cf2dd6e290bc', // MKR + '0xdcfc14bc921e189497d4e63f4de1b418b521b1c4', // USDC + '0x28a0fba7b73679d052c9b66bf4c83f6df7c349ce', // SNX => same + '0xccc6f61b7ad1ea539705ed4237a85e23277eb341', // USDT + '0x64e8b221bd554fe995c2fcf2490a3b979fe14776', // KNC + '0xf8e4d2a782dbe31a7f8db2c2bc5b3645338321e9', // ZRX + '0xf0e696e4b8b8d571c139e82a8a874022713fde52', // ENJ + '0x10b3c106c4ed7D22B0e7Abe5Dc43BdFA970a153c', // USD + ], + }; // chainlink aggregator contract + + console.log(`\n- OracleAnchor deployment`); + + console.log(`\tDeploying OracleAnchor implementation ...`); + const oracleAnchor = await new OracleAnchorFactory( + await localBRE.ethers.provider.getSigner() + ).deploy( + aaveOracleAssets[localBRE.network.name], + aaveOracleSources[localBRE.network.name], + aggregatorAssets[localBRE.network.name], + aggregatorSources[localBRE.network.name] + ); + await oracleAnchor.deployTransaction.wait(); + console.log('oracleAnchor.address', oracleAnchor.address); + await verifyContract(oracleAnchor.address, []); + + console.log(`\tFinished OracleAnchor deployment`); + });