diff --git a/contracts/libraries/ReserveConfiguration.sol b/contracts/libraries/ReserveConfiguration.sol new file mode 100644 index 00000000..d224305f --- /dev/null +++ b/contracts/libraries/ReserveConfiguration.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity ^0.6.8; + +import {SafeMath} from '@openzeppelin/contracts/math/SafeMath.sol'; +import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; + +import {ReserveLogic} from './ReserveLogic.sol'; +import {UserLogic} from './UserLogic.sol'; +import {WadRayMath} from './WadRayMath.sol'; + +import '../interfaces/IPriceOracleGetter.sol'; +import {IFeeProvider} from '../interfaces/IFeeProvider.sol'; +import '@nomiclabs/buidler/console.sol'; + +/** + * @title ReserveConfiguration library + * @author Aave + * @title Implements the bitmap logic to handle the configuration mapping + */ +library ReserveConfiguration { + uint256 constant LTV_MASK = 0xFFFFFFFF0000; + uint256 constant LIQUIDATION_THRESHOLD_MASK = 0xFFFF0000FFFF; + uint256 constant LIQUIDATION_BONUS_MASK = 0x0000FFFFFFFF; + uint256 constant LIQUIDATION_BONUS_MASK = 0x00FFFFFFFFFFFF; + + struct Map { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-56: Decimals + uint256 data; + } + + function setLTV(ReserveConfiguration.Map _self, uint256 _ltv) internal { + _self.data = (_self.data & LTV_MASK) | _ltv; + } + + function getLTV(ReserveConfiguration.Map _self) internal view returns (uint256) { + return _self.data & !LTV_MASK; + } + + function setLiquidationThreshold(ReserveConfiguration.Map _self, uint256 _threshold) internal { + _self.data = (_self.data & LIQUIDATION_THRESHOLD_MASK) | (_threshold << 16); + } + + function getLiquidationThreshold(ReserveConfiguration.Map _self) internal view returns (uint256) { + return (_self.data & !LIQUIDATION_THRESHOLD_MASK) >> 16; + } + + function setLiquidationBonus(ReserveConfiguration.Map _self, uint256 _bonus) internal { + _self.data = (_self.data & LIQUIDATION_BONUS_MASK) | (_bonus << 32); + } + + function getLiquidationBonus(ReserveConfiguration.Map _self) internal view returns (uint256) { + return (_self.data & !LIQUIDATION_BONUS_MASK) >> 32; + } + + function setDecimals(ReserveConfiguration.Map _self, uint256 _decimals) internal { + _self.data = (_self.data & DECIMALS_MASK) | (_ltv << 48); + } + + function getDecimals(ReserveConfiguration.Map _self) internal view returns (uint256) { + return (_self.data & !DECIMALS_MASK) >> 48; + } +}