import { tEthereumAddress, iMultiPoolsAssets, IMarketRates, iAssetBase, iAssetAggregatorBase, SymbolMap, } from './types'; import { LendingRateOracle } from '../types/LendingRateOracle'; import { PriceOracle } from '../types/PriceOracle'; import { MockAggregator } from '../types/MockAggregator'; import { deployMockAggregator } from './contracts-deployments'; import { chunk, waitForTx } from './misc-utils'; import { getStableAndVariableTokensHelper } from './contracts-getters'; export const setInitialMarketRatesInRatesOracleByHelper = async ( marketRates: iMultiPoolsAssets, assetsAddresses: { [x: string]: tEthereumAddress }, lendingRateOracleInstance: LendingRateOracle, admin: tEthereumAddress ) => { const stableAndVariableTokenHelper = await getStableAndVariableTokensHelper(); const assetAddresses: string[] = []; const borrowRates: string[] = []; const symbols: string[] = []; for (const [assetSymbol, { borrowRate }] of Object.entries(marketRates) as [ string, IMarketRates ][]) { const assetAddressIndex = Object.keys(assetsAddresses).findIndex( (value) => value === assetSymbol ); const [, assetAddress] = (Object.entries(assetsAddresses) as [string, string][])[ assetAddressIndex ]; assetAddresses.push(assetAddress); borrowRates.push(borrowRate); symbols.push(assetSymbol); } // Set borrow rates per chunks const ratesChunks = 20; const chunkedTokens = chunk(assetAddresses, ratesChunks); const chunkedRates = chunk(borrowRates, ratesChunks); const chunkedSymbols = chunk(symbols, ratesChunks); // Set helper as owner await waitForTx( await lendingRateOracleInstance.transferOwnership(stableAndVariableTokenHelper.address) ); console.log(`- Oracle borrow initalization in ${chunkedTokens.length} txs`); for (let chunkIndex = 0; chunkIndex < chunkedTokens.length; chunkIndex++) { const tx3 = await waitForTx( await stableAndVariableTokenHelper.setOracleBorrowRates( chunkedTokens[chunkIndex], chunkedRates[chunkIndex], lendingRateOracleInstance.address ) ); console.log(` - Setted Oracle Borrow Rates for: ${chunkedSymbols[chunkIndex].join(', ')}`); } // Set back ownership await waitForTx( await stableAndVariableTokenHelper.setOracleOwnership(lendingRateOracleInstance.address, admin) ); }; export const setInitialAssetPricesInOracle = async ( prices: iAssetBase, assetsAddresses: iAssetBase, priceOracleInstance: PriceOracle ) => { for (const [assetSymbol, price] of Object.entries(prices) as [string, string][]) { const assetAddressIndex = Object.keys(assetsAddresses).findIndex( (value) => value === assetSymbol ); const [, assetAddress] = (Object.entries(assetsAddresses) as [string, string][])[ assetAddressIndex ]; await waitForTx(await priceOracleInstance.setAssetPrice(assetAddress, price)); } }; export const setAssetPricesInOracle = async ( prices: SymbolMap, assetsAddresses: SymbolMap, priceOracleInstance: PriceOracle ) => { for (const [assetSymbol, price] of Object.entries(prices) as [string, string][]) { const assetAddressIndex = Object.keys(assetsAddresses).findIndex( (value) => value === assetSymbol ); const [, assetAddress] = (Object.entries(assetsAddresses) as [string, string][])[ assetAddressIndex ]; await waitForTx(await priceOracleInstance.setAssetPrice(assetAddress, price)); } }; export const deployMockAggregators = async (initialPrices: SymbolMap, verify?: boolean) => { const aggregators: { [tokenSymbol: string]: MockAggregator } = {}; for (const tokenContractName of Object.keys(initialPrices)) { if (tokenContractName !== 'ETH') { const priceIndex = Object.keys(initialPrices).findIndex( (value) => value === tokenContractName ); const [, price] = (Object.entries(initialPrices) as [string, string][])[priceIndex]; aggregators[tokenContractName] = await deployMockAggregator(price, verify); } } return aggregators; }; export const deployAllMockAggregators = async ( initialPrices: iAssetAggregatorBase, verify?: boolean ) => { const aggregators: { [tokenSymbol: string]: MockAggregator } = {}; for (const tokenContractName of Object.keys(initialPrices)) { if (tokenContractName !== 'ETH') { const priceIndex = Object.keys(initialPrices).findIndex( (value) => value === tokenContractName ); const [, price] = (Object.entries(initialPrices) as [string, string][])[priceIndex]; aggregators[tokenContractName] = await deployMockAggregator(price, verify); } } return aggregators; };