// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.11; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; library PriceConverter { function getDerivedPrice( address _base, address _quote, uint8 _decimals ) public view returns (int256) { require( _decimals > uint8(0) && _decimals <= uint8(18), "Invalid _decimals" ); int256 decimals = int256(10**uint256(_decimals)); (, int256 basePrice, , , ) = AggregatorV3Interface(_base) .latestRoundData(); uint8 baseDecimals = AggregatorV3Interface(_base).decimals(); basePrice = scalePrice(basePrice, baseDecimals, _decimals); (, int256 quotePrice, , , ) = AggregatorV3Interface(_quote) .latestRoundData(); uint8 quoteDecimals = AggregatorV3Interface(_quote).decimals(); quotePrice = scalePrice(quotePrice, quoteDecimals, _decimals); return (basePrice * decimals) / quotePrice; } function scalePrice( int256 _price, uint8 _priceDecimals, uint8 _decimals ) internal pure returns (int256) { if (_priceDecimals < _decimals) { return _price * int256(10**uint256(_decimals - _priceDecimals)); } else if (_priceDecimals > _decimals) { return _price / int256(10**uint256(_priceDecimals - _decimals)); } return _price; } }