import { BigNumber, Contract } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { AggregatorV3InterfaceAbi } from "../../types/ethers-contracts"; import AGGREGATOR_V3_INTERFACE_ABI from "../abis/aggregatorV3Interface.abi.json"; export const getLatestPrice = async ( env: HardhatRuntimeEnvironment, priceFeedAddress: string ): Promise => { const [signer] = await env.ethers.getSigners(); const priceFeed: AggregatorV3InterfaceAbi = new Contract( priceFeedAddress, AGGREGATOR_V3_INTERFACE_ABI, signer ) as AggregatorV3InterfaceAbi; const latestRoundData = await priceFeed.latestRoundData(); const price: BigNumber = latestRoundData.answer; return price; }; export const getLatestRoundData = async ( env: HardhatRuntimeEnvironment, priceFeedAddress: string ): Promise<{ roundId: BigNumber; answer: BigNumber; startedAt: BigNumber; updatedAt: BigNumber; answeredInRound: BigNumber; }> => { const [signer] = await env.ethers.getSigners(); const priceFeed: AggregatorV3InterfaceAbi = new Contract( priceFeedAddress, AGGREGATOR_V3_INTERFACE_ABI, signer ) as AggregatorV3InterfaceAbi; const latestRoundData = await priceFeed.latestRoundData(); return { roundId: latestRoundData.roundId, answer: latestRoundData.answer, startedAt: latestRoundData.startedAt, updatedAt: latestRoundData.updatedAt, answeredInRound: latestRoundData.answeredInRound, }; }; export const getPriceFeedDecimals = async ( env: HardhatRuntimeEnvironment, priceFeedAddress: string ): Promise => { const [signer] = await env.ethers.getSigners(); const priceFeed: AggregatorV3InterfaceAbi = new Contract( priceFeedAddress, AGGREGATOR_V3_INTERFACE_ABI, signer ) as AggregatorV3InterfaceAbi; return priceFeed.decimals(); }; export const getPriceFeedDescription = async ( env: HardhatRuntimeEnvironment, priceFeedAddress: string ): Promise => { const [signer] = await env.ethers.getSigners(); const priceFeed: AggregatorV3InterfaceAbi = new Contract( priceFeedAddress, AGGREGATOR_V3_INTERFACE_ABI, signer ) as AggregatorV3InterfaceAbi; return priceFeed.description(); }; export const getRoundData = async ( env: HardhatRuntimeEnvironment, priceFeedAddress: string, roundId: BigNumber ): Promise<{ roundId: BigNumber; answer: BigNumber; startedAt: BigNumber; updatedAt: BigNumber; answeredInRound: BigNumber; }> => { const [signer] = await env.ethers.getSigners(); const priceFeed: AggregatorV3InterfaceAbi = new Contract( priceFeedAddress, AGGREGATOR_V3_INTERFACE_ABI, signer ) as AggregatorV3InterfaceAbi; const roundData = await priceFeed.getRoundData(roundId); return { roundId: roundData.roundId, answer: roundData.answer, startedAt: roundData.startedAt, updatedAt: roundData.updatedAt, answeredInRound: roundData.answeredInRound, }; }; export const getPriceFeedAggregatorVersion = async ( env: HardhatRuntimeEnvironment, priceFeedAddress: string ): Promise => { const [signer] = await env.ethers.getSigners(); const priceFeed: AggregatorV3InterfaceAbi = new Contract( priceFeedAddress, AGGREGATOR_V3_INTERFACE_ABI, signer ) as AggregatorV3InterfaceAbi; const version = await priceFeed.version(); return version; }; export const getAggregatorAddress = async ( env: HardhatRuntimeEnvironment, priceFeedAddress: string ): Promise => { const [signer] = await env.ethers.getSigners(); const priceFeed: AggregatorV3InterfaceAbi = new Contract( priceFeedAddress, AGGREGATOR_V3_INTERFACE_ABI, signer ) as AggregatorV3InterfaceAbi; const aggregatorAddress = await priceFeed.aggregator(); return aggregatorAddress; }; export const getAggregatorRoundId = async ( env: HardhatRuntimeEnvironment, priceFeedAddress: string ): Promise => { const [signer] = await env.ethers.getSigners(); const priceFeed: AggregatorV3InterfaceAbi = new Contract( priceFeedAddress, AGGREGATOR_V3_INTERFACE_ABI, signer ) as AggregatorV3InterfaceAbi; const roundData = await priceFeed.latestRoundData(); const aggregatorRoundId = roundData.roundId.toBigInt() & BigInt(`0xFFFFFFFFFFFFFFFF`); return BigNumber.from(aggregatorRoundId); }; export const getPhaseId = async ( env: HardhatRuntimeEnvironment, priceFeedAddress: string ): Promise => { const [signer] = await env.ethers.getSigners(); const priceFeed: AggregatorV3InterfaceAbi = new Contract( priceFeedAddress, AGGREGATOR_V3_INTERFACE_ABI, signer ) as AggregatorV3InterfaceAbi; const roundData = await priceFeed.latestRoundData(); const phaseId = roundData.roundId.toBigInt() >> 64n; return BigNumber.from(phaseId); }; export const getHistoricalPrice = async ( env: HardhatRuntimeEnvironment, priceFeedAddress: string, roundId: BigNumber ): Promise => { const [signer] = await env.ethers.getSigners(); const priceFeed: AggregatorV3InterfaceAbi = new Contract( priceFeedAddress, AGGREGATOR_V3_INTERFACE_ABI, signer ) as AggregatorV3InterfaceAbi; const roundData = await priceFeed.getRoundData(roundId); return roundData.answer; };