Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
7408294 | 11 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Name:
DefaultReserveInterestRateStrategyV2
Compiler Version
v0.8.22+commit.4fc1097e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; import {WadRayMath} from '../protocol/libraries/math/WadRayMath.sol'; import {PercentageMath} from '../protocol/libraries/math/PercentageMath.sol'; import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; import {Errors} from '../protocol/libraries/helpers/Errors.sol'; import {IDefaultInterestRateStrategyV2} from '../interfaces/IDefaultInterestRateStrategyV2.sol'; import {IReserveInterestRateStrategy} from '../interfaces/IReserveInterestRateStrategy.sol'; import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; /** * @title DefaultReserveInterestRateStrategyV2 contract * @author BGD Labs * @notice Default interest rate strategy used by the Aave protocol * @dev Strategies are pool-specific: each contract CAN'T be used across different Aave pools * due to the caching of the PoolAddressesProvider and the usage of underlying addresses as * index of the _interestRateData */ contract DefaultReserveInterestRateStrategyV2 is IDefaultInterestRateStrategyV2 { using WadRayMath for uint256; using PercentageMath for uint256; struct CalcInterestRatesLocalVars { uint256 availableLiquidity; uint256 currentVariableBorrowRate; uint256 currentLiquidityRate; uint256 borrowUsageRatio; uint256 supplyUsageRatio; uint256 availableLiquidityPlusDebt; } /// @inheritdoc IDefaultInterestRateStrategyV2 IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; /// @inheritdoc IDefaultInterestRateStrategyV2 uint256 public constant MAX_BORROW_RATE = 1000_00; /// @inheritdoc IDefaultInterestRateStrategyV2 uint256 public constant MIN_OPTIMAL_POINT = 1_00; /// @inheritdoc IDefaultInterestRateStrategyV2 uint256 public constant MAX_OPTIMAL_POINT = 99_00; /// @dev Map of reserves address and their interest rate data (reserveAddress => interestRateData) mapping(address => InterestRateData) internal _interestRateData; modifier onlyPoolConfigurator() { require( msg.sender == ADDRESSES_PROVIDER.getPoolConfigurator(), Errors.CALLER_NOT_POOL_CONFIGURATOR ); _; } /** * @dev Constructor. * @param provider The address of the PoolAddressesProvider of the associated Aave pool */ constructor(address provider) { require(provider != address(0), Errors.INVALID_ADDRESSES_PROVIDER); ADDRESSES_PROVIDER = IPoolAddressesProvider(provider); } /// @inheritdoc IReserveInterestRateStrategy function setInterestRateParams( address reserve, bytes calldata rateData ) external onlyPoolConfigurator { _setInterestRateParams(reserve, abi.decode(rateData, (InterestRateData))); } /// @inheritdoc IDefaultInterestRateStrategyV2 function setInterestRateParams( address reserve, InterestRateData calldata rateData ) external onlyPoolConfigurator { _setInterestRateParams(reserve, rateData); } /// @inheritdoc IDefaultInterestRateStrategyV2 function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory) { return _rayifyRateData(_interestRateData[reserve]); } /// @inheritdoc IDefaultInterestRateStrategyV2 function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory) { return _interestRateData[reserve]; } /// @inheritdoc IDefaultInterestRateStrategyV2 function getOptimalUsageRatio(address reserve) external view returns (uint256) { return _bpsToRay(uint256(_interestRateData[reserve].optimalUsageRatio)); } /// @inheritdoc IDefaultInterestRateStrategyV2 function getVariableRateSlope1(address reserve) external view returns (uint256) { return _bpsToRay(uint256(_interestRateData[reserve].variableRateSlope1)); } /// @inheritdoc IDefaultInterestRateStrategyV2 function getVariableRateSlope2(address reserve) external view returns (uint256) { return _bpsToRay(uint256(_interestRateData[reserve].variableRateSlope2)); } /// @inheritdoc IDefaultInterestRateStrategyV2 function getBaseVariableBorrowRate(address reserve) external view override returns (uint256) { return _bpsToRay(uint256(_interestRateData[reserve].baseVariableBorrowRate)); } /// @inheritdoc IDefaultInterestRateStrategyV2 function getMaxVariableBorrowRate(address reserve) external view override returns (uint256) { return _bpsToRay( uint256( _interestRateData[reserve].baseVariableBorrowRate + _interestRateData[reserve].variableRateSlope1 + _interestRateData[reserve].variableRateSlope2 ) ); } /// @inheritdoc IReserveInterestRateStrategy function calculateInterestRates( DataTypes.CalculateInterestRatesParams memory params ) external view virtual override returns (uint256, uint256) { InterestRateDataRay memory rateData = _rayifyRateData(_interestRateData[params.reserve]); // @note This is a short circuit to allow mintable assets (ex. GHO), which by definition cannot be supplied // and thus do not use virtual underlying balances. if (!params.usingVirtualBalance) { return (0, rateData.baseVariableBorrowRate); } CalcInterestRatesLocalVars memory vars; vars.currentLiquidityRate = 0; vars.currentVariableBorrowRate = rateData.baseVariableBorrowRate; if (params.totalDebt != 0) { vars.availableLiquidity = params.virtualUnderlyingBalance + params.liquidityAdded - params.liquidityTaken; vars.availableLiquidityPlusDebt = vars.availableLiquidity + params.totalDebt; vars.borrowUsageRatio = params.totalDebt.rayDiv(vars.availableLiquidityPlusDebt); vars.supplyUsageRatio = params.totalDebt.rayDiv( vars.availableLiquidityPlusDebt + params.unbacked ); } else { return (0, vars.currentVariableBorrowRate); } if (vars.borrowUsageRatio > rateData.optimalUsageRatio) { uint256 excessBorrowUsageRatio = (vars.borrowUsageRatio - rateData.optimalUsageRatio).rayDiv( WadRayMath.RAY - rateData.optimalUsageRatio ); vars.currentVariableBorrowRate += rateData.variableRateSlope1 + rateData.variableRateSlope2.rayMul(excessBorrowUsageRatio); } else { vars.currentVariableBorrowRate += rateData .variableRateSlope1 .rayMul(vars.borrowUsageRatio) .rayDiv(rateData.optimalUsageRatio); } vars.currentLiquidityRate = vars .currentVariableBorrowRate .rayMul(vars.supplyUsageRatio) .percentMul(PercentageMath.PERCENTAGE_FACTOR - params.reserveFactor); return (vars.currentLiquidityRate, vars.currentVariableBorrowRate); } /** * @dev Doing validations and data update for an asset * @param reserve address of the underlying asset of the reserve * @param rateData Encoded reserve interest rate data to apply */ function _setInterestRateParams(address reserve, InterestRateData memory rateData) internal { require(reserve != address(0), Errors.ZERO_ADDRESS_NOT_VALID); require( rateData.optimalUsageRatio <= MAX_OPTIMAL_POINT && rateData.optimalUsageRatio >= MIN_OPTIMAL_POINT, Errors.INVALID_OPTIMAL_USAGE_RATIO ); require( rateData.variableRateSlope1 <= rateData.variableRateSlope2, Errors.SLOPE_2_MUST_BE_GTE_SLOPE_1 ); // The maximum rate should not be above certain threshold require( uint256(rateData.baseVariableBorrowRate) + uint256(rateData.variableRateSlope1) + uint256(rateData.variableRateSlope2) <= MAX_BORROW_RATE, Errors.INVALID_MAX_RATE ); _interestRateData[reserve] = rateData; emit RateDataUpdate( reserve, rateData.optimalUsageRatio, rateData.baseVariableBorrowRate, rateData.variableRateSlope1, rateData.variableRateSlope2 ); } /** * @dev Transforms an InterestRateData struct to an InterestRateDataRay struct by multiplying all values * by 1e23, turning them into ray values * * @param data The InterestRateData struct to transform * * @return The resulting InterestRateDataRay struct */ function _rayifyRateData( InterestRateData memory data ) internal pure returns (InterestRateDataRay memory) { return InterestRateDataRay({ optimalUsageRatio: _bpsToRay(uint256(data.optimalUsageRatio)), baseVariableBorrowRate: _bpsToRay(uint256(data.baseVariableBorrowRate)), variableRateSlope1: _bpsToRay(uint256(data.variableRateSlope1)), variableRateSlope2: _bpsToRay(uint256(data.variableRateSlope2)) }); } // @dev helper function added here, as generally the protocol doesn't use bps function _bpsToRay(uint256 n) internal pure returns (uint256) { return n * 1e23; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IReserveInterestRateStrategy} from './IReserveInterestRateStrategy.sol'; import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; /** * @title IDefaultInterestRateStrategyV2 * @author BGD Labs * @notice Interface of the default interest rate strategy used by the Aave protocol */ interface IDefaultInterestRateStrategyV2 is IReserveInterestRateStrategy { /** * @notice Holds the interest rate data for a given reserve * * @dev Since values are in bps, they are multiplied by 1e23 in order to become rays with 27 decimals. This * in turn means that the maximum supported interest rate is 4294967295 (2**32-1) bps or 42949672.95%. * * @param optimalUsageRatio The optimal usage ratio, in bps * @param baseVariableBorrowRate The base variable borrow rate, in bps * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps */ struct InterestRateData { uint16 optimalUsageRatio; uint32 baseVariableBorrowRate; uint32 variableRateSlope1; uint32 variableRateSlope2; } /** * @notice The interest rate data, where all values are in ray (fixed-point 27 decimal numbers) for a given reserve, * used in in-memory calculations. * * @param optimalUsageRatio The optimal usage ratio * @param baseVariableBorrowRate The base variable borrow rate * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio */ struct InterestRateDataRay { uint256 optimalUsageRatio; uint256 baseVariableBorrowRate; uint256 variableRateSlope1; uint256 variableRateSlope2; } /** * @notice emitted when new interest rate data is set in a reserve * * @param reserve address of the reserve that has new interest rate data set * @param optimalUsageRatio The optimal usage ratio, in bps * @param baseVariableBorrowRate The base variable borrow rate, in bps * @param variableRateSlope1 The slope of the variable interest curve, before hitting the optimal ratio, in bps * @param variableRateSlope2 The slope of the variable interest curve, after hitting the optimal ratio, in bps */ event RateDataUpdate( address indexed reserve, uint256 optimalUsageRatio, uint256 baseVariableBorrowRate, uint256 variableRateSlope1, uint256 variableRateSlope2 ); /** * @notice Returns the address of the PoolAddressesProvider * @return The address of the PoolAddressesProvider contract */ function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); /** * @notice Returns the maximum value achievable for variable borrow rate, in bps * @return The maximum rate */ function MAX_BORROW_RATE() external view returns (uint256); /** * @notice Returns the minimum optimal point, in bps * @return The optimal point */ function MIN_OPTIMAL_POINT() external view returns (uint256); /** * @notice Returns the maximum optimal point, in bps * @return The optimal point */ function MAX_OPTIMAL_POINT() external view returns (uint256); /** * notice Returns the full InterestRateData object for the given reserve, in ray * * @param reserve The reserve to get the data of * * @return The InterestRateDataRay object for the given reserve */ function getInterestRateData(address reserve) external view returns (InterestRateDataRay memory); /** * notice Returns the full InterestRateDataRay object for the given reserve, in bps * * @param reserve The reserve to get the data of * * @return The InterestRateData object for the given reserve */ function getInterestRateDataBps(address reserve) external view returns (InterestRateData memory); /** * @notice Returns the optimal usage rate for the given reserve in ray * * @param reserve The reserve to get the optimal usage rate of * * @return The optimal usage rate is the level of borrow / collateral at which the borrow rate */ function getOptimalUsageRatio(address reserve) external view returns (uint256); /** * @notice Returns the variable rate slope below optimal usage ratio in ray * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO * * @param reserve The reserve to get the variable rate slope 1 of * * @return The variable rate slope */ function getVariableRateSlope1(address reserve) external view returns (uint256); /** * @notice Returns the variable rate slope above optimal usage ratio in ray * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO * * @param reserve The reserve to get the variable rate slope 2 of * * @return The variable rate slope */ function getVariableRateSlope2(address reserve) external view returns (uint256); /** * @notice Returns the base variable borrow rate, in ray * * @param reserve The reserve to get the base variable borrow rate of * * @return The base variable borrow rate */ function getBaseVariableBorrowRate(address reserve) external view returns (uint256); /** * @notice Returns the maximum variable borrow rate, in ray * * @param reserve The reserve to get the maximum variable borrow rate of * * @return The maximum variable borrow rate */ function getMaxVariableBorrowRate(address reserve) external view returns (uint256); /** * @notice Sets interest rate data for an Aave rate strategy * @param reserve The reserve to update * @param rateData The reserve interest rate data to apply to the given reserve * Being specific to this custom implementation, with custom struct type, * overloading the function on the generic interface */ function setInterestRateParams(address reserve, InterestRateData calldata rateData) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title IPoolAddressesProvider * @author Aave * @notice Defines the basic interface for a Pool Addresses Provider. */ interface IPoolAddressesProvider { /** * @dev Emitted when the market identifier is updated. * @param oldMarketId The old id of the market * @param newMarketId The new id of the market */ event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); /** * @dev Emitted when the pool is updated. * @param oldAddress The old address of the Pool * @param newAddress The new address of the Pool */ event PoolUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the pool configurator is updated. * @param oldAddress The old address of the PoolConfigurator * @param newAddress The new address of the PoolConfigurator */ event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the price oracle is updated. * @param oldAddress The old address of the PriceOracle * @param newAddress The new address of the PriceOracle */ event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the ACL manager is updated. * @param oldAddress The old address of the ACLManager * @param newAddress The new address of the ACLManager */ event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the ACL admin is updated. * @param oldAddress The old address of the ACLAdmin * @param newAddress The new address of the ACLAdmin */ event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the price oracle sentinel is updated. * @param oldAddress The old address of the PriceOracleSentinel * @param newAddress The new address of the PriceOracleSentinel */ event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the pool data provider is updated. * @param oldAddress The old address of the PoolDataProvider * @param newAddress The new address of the PoolDataProvider */ event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when a new proxy is created. * @param id The identifier of the proxy * @param proxyAddress The address of the created proxy contract * @param implementationAddress The address of the implementation contract */ event ProxyCreated( bytes32 indexed id, address indexed proxyAddress, address indexed implementationAddress ); /** * @dev Emitted when a new non-proxied contract address is registered. * @param id The identifier of the contract * @param oldAddress The address of the old contract * @param newAddress The address of the new contract */ event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the implementation of the proxy registered with id is updated * @param id The identifier of the contract * @param proxyAddress The address of the proxy contract * @param oldImplementationAddress The address of the old implementation contract * @param newImplementationAddress The address of the new implementation contract */ event AddressSetAsProxy( bytes32 indexed id, address indexed proxyAddress, address oldImplementationAddress, address indexed newImplementationAddress ); /** * @notice Returns the id of the Aave market to which this contract points to. * @return The market id */ function getMarketId() external view returns (string memory); /** * @notice Associates an id with a specific PoolAddressesProvider. * @dev This can be used to create an onchain registry of PoolAddressesProviders to * identify and validate multiple Aave markets. * @param newMarketId The market id */ function setMarketId(string calldata newMarketId) external; /** * @notice Returns an address by its identifier. * @dev The returned address might be an EOA or a contract, potentially proxied * @dev It returns ZERO if there is no registered address with the given id * @param id The id * @return The address of the registered for the specified id */ function getAddress(bytes32 id) external view returns (address); /** * @notice General function to update the implementation of a proxy registered with * certain `id`. If there is no proxy registered, it will instantiate one and * set as implementation the `newImplementationAddress`. * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit * setter function, in order to avoid unexpected consequences * @param id The id * @param newImplementationAddress The address of the new implementation */ function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; /** * @notice Sets an address for an id replacing the address saved in the addresses map. * @dev IMPORTANT Use this function carefully, as it will do a hard replacement * @param id The id * @param newAddress The address to set */ function setAddress(bytes32 id, address newAddress) external; /** * @notice Returns the address of the Pool proxy. * @return The Pool proxy address */ function getPool() external view returns (address); /** * @notice Updates the implementation of the Pool, or creates a proxy * setting the new `pool` implementation when the function is called for the first time. * @param newPoolImpl The new Pool implementation */ function setPoolImpl(address newPoolImpl) external; /** * @notice Returns the address of the PoolConfigurator proxy. * @return The PoolConfigurator proxy address */ function getPoolConfigurator() external view returns (address); /** * @notice Updates the implementation of the PoolConfigurator, or creates a proxy * setting the new `PoolConfigurator` implementation when the function is called for the first time. * @param newPoolConfiguratorImpl The new PoolConfigurator implementation */ function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; /** * @notice Returns the address of the price oracle. * @return The address of the PriceOracle */ function getPriceOracle() external view returns (address); /** * @notice Updates the address of the price oracle. * @param newPriceOracle The address of the new PriceOracle */ function setPriceOracle(address newPriceOracle) external; /** * @notice Returns the address of the ACL manager. * @return The address of the ACLManager */ function getACLManager() external view returns (address); /** * @notice Updates the address of the ACL manager. * @param newAclManager The address of the new ACLManager */ function setACLManager(address newAclManager) external; /** * @notice Returns the address of the ACL admin. * @return The address of the ACL admin */ function getACLAdmin() external view returns (address); /** * @notice Updates the address of the ACL admin. * @param newAclAdmin The address of the new ACL admin */ function setACLAdmin(address newAclAdmin) external; /** * @notice Returns the address of the price oracle sentinel. * @return The address of the PriceOracleSentinel */ function getPriceOracleSentinel() external view returns (address); /** * @notice Updates the address of the price oracle sentinel. * @param newPriceOracleSentinel The address of the new PriceOracleSentinel */ function setPriceOracleSentinel(address newPriceOracleSentinel) external; /** * @notice Returns the address of the data provider. * @return The address of the DataProvider */ function getPoolDataProvider() external view returns (address); /** * @notice Updates the address of the data provider. * @param newDataProvider The address of the new DataProvider */ function setPoolDataProvider(address newDataProvider) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; /** * @title IReserveInterestRateStrategy * @author BGD Labs * @notice Basic interface for any rate strategy used by the Aave protocol */ interface IReserveInterestRateStrategy { /** * @notice Sets interest rate data for an Aave rate strategy * @param reserve The reserve to update * @param rateData The abi encoded reserve interest rate data to apply to the given reserve * Abstracted this way as rate strategies can be custom */ function setInterestRateParams(address reserve, bytes calldata rateData) external; /** * @notice Calculates the interest rates depending on the reserve's state and configurations * @param params The parameters needed to calculate interest rates * @return liquidityRate The liquidity rate expressed in ray * @return variableBorrowRate The variable borrow rate expressed in ray */ function calculateInterestRates( DataTypes.CalculateInterestRatesParams memory params ) external view returns (uint256, uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Errors library * @author Aave * @notice Defines the error messages emitted by the different contracts of the Aave protocol */ library Errors { string public constant CALLER_NOT_POOL_ADMIN = '1'; // 'The caller of the function is not a pool admin' string public constant CALLER_NOT_EMERGENCY_ADMIN = '2'; // 'The caller of the function is not an emergency admin' string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = '3'; // 'The caller of the function is not a pool or emergency admin' string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = '4'; // 'The caller of the function is not a risk or pool admin' string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = '5'; // 'The caller of the function is not an asset listing or pool admin' string public constant CALLER_NOT_BRIDGE = '6'; // 'The caller of the function is not a bridge' string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = '7'; // 'Pool addresses provider is not registered' string public constant INVALID_ADDRESSES_PROVIDER_ID = '8'; // 'Invalid id for the pool addresses provider' string public constant NOT_CONTRACT = '9'; // 'Address is not a contract' string public constant CALLER_NOT_POOL_CONFIGURATOR = '10'; // 'The caller of the function is not the pool configurator' string public constant CALLER_NOT_ATOKEN = '11'; // 'The caller of the function is not an AToken' string public constant INVALID_ADDRESSES_PROVIDER = '12'; // 'The address of the pool addresses provider is invalid' string public constant INVALID_FLASHLOAN_EXECUTOR_RETURN = '13'; // 'Invalid return value of the flashloan executor function' string public constant RESERVE_ALREADY_ADDED = '14'; // 'Reserve has already been added to reserve list' string public constant NO_MORE_RESERVES_ALLOWED = '15'; // 'Maximum amount of reserves in the pool reached' string public constant EMODE_CATEGORY_RESERVED = '16'; // 'Zero eMode category is reserved for volatile heterogeneous assets' string public constant INVALID_EMODE_CATEGORY_ASSIGNMENT = '17'; // 'Invalid eMode category assignment to asset' string public constant RESERVE_LIQUIDITY_NOT_ZERO = '18'; // 'The liquidity of the reserve needs to be 0' string public constant FLASHLOAN_PREMIUM_INVALID = '19'; // 'Invalid flashloan premium' string public constant INVALID_RESERVE_PARAMS = '20'; // 'Invalid risk parameters for the reserve' string public constant INVALID_EMODE_CATEGORY_PARAMS = '21'; // 'Invalid risk parameters for the eMode category' string public constant BRIDGE_PROTOCOL_FEE_INVALID = '22'; // 'Invalid bridge protocol fee' string public constant CALLER_MUST_BE_POOL = '23'; // 'The caller of this function must be a pool' string public constant INVALID_MINT_AMOUNT = '24'; // 'Invalid amount to mint' string public constant INVALID_BURN_AMOUNT = '25'; // 'Invalid amount to burn' string public constant INVALID_AMOUNT = '26'; // 'Amount must be greater than 0' string public constant RESERVE_INACTIVE = '27'; // 'Action requires an active reserve' string public constant RESERVE_FROZEN = '28'; // 'Action cannot be performed because the reserve is frozen' string public constant RESERVE_PAUSED = '29'; // 'Action cannot be performed because the reserve is paused' string public constant BORROWING_NOT_ENABLED = '30'; // 'Borrowing is not enabled' string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = '32'; // 'User cannot withdraw more than the available balance' string public constant INVALID_INTEREST_RATE_MODE_SELECTED = '33'; // 'Invalid interest rate mode selected' string public constant COLLATERAL_BALANCE_IS_ZERO = '34'; // 'The collateral balance is 0' string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '35'; // 'Health factor is lesser than the liquidation threshold' string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = '36'; // 'There is not enough collateral to cover a new borrow' string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = '37'; // 'Collateral is (mostly) the same currency that is being borrowed' string public constant NO_DEBT_OF_SELECTED_TYPE = '39'; // 'For repayment of a specific type of debt, the user needs to have debt that type' string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '40'; // 'To repay on behalf of a user an explicit amount to repay is needed' string public constant NO_OUTSTANDING_VARIABLE_DEBT = '42'; // 'User does not have outstanding variable rate debt on this reserve' string public constant UNDERLYING_BALANCE_ZERO = '43'; // 'The underlying balance needs to be greater than 0' string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '44'; // 'Interest rate rebalance conditions were not met' string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '45'; // 'Health factor is not below the threshold' string public constant COLLATERAL_CANNOT_BE_LIQUIDATED = '46'; // 'The collateral chosen cannot be liquidated' string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '47'; // 'User did not borrow the specified currency' string public constant INCONSISTENT_FLASHLOAN_PARAMS = '49'; // 'Inconsistent flashloan parameters' string public constant BORROW_CAP_EXCEEDED = '50'; // 'Borrow cap is exceeded' string public constant SUPPLY_CAP_EXCEEDED = '51'; // 'Supply cap is exceeded' string public constant UNBACKED_MINT_CAP_EXCEEDED = '52'; // 'Unbacked mint cap is exceeded' string public constant DEBT_CEILING_EXCEEDED = '53'; // 'Debt ceiling is exceeded' string public constant UNDERLYING_CLAIMABLE_RIGHTS_NOT_ZERO = '54'; // 'Claimable rights over underlying not zero (aToken supply or accruedToTreasury)' string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = '56'; // 'Variable debt supply is not zero' string public constant LTV_VALIDATION_FAILED = '57'; // 'Ltv validation failed' string public constant INCONSISTENT_EMODE_CATEGORY = '58'; // 'Inconsistent eMode category' string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = '59'; // 'Price oracle sentinel validation failed' string public constant ASSET_NOT_BORROWABLE_IN_ISOLATION = '60'; // 'Asset is not borrowable in isolation mode' string public constant RESERVE_ALREADY_INITIALIZED = '61'; // 'Reserve has already been initialized' string public constant USER_IN_ISOLATION_MODE_OR_LTV_ZERO = '62'; // 'User is in isolation mode or ltv is zero' string public constant INVALID_LTV = '63'; // 'Invalid ltv parameter for the reserve' string public constant INVALID_LIQ_THRESHOLD = '64'; // 'Invalid liquidity threshold parameter for the reserve' string public constant INVALID_LIQ_BONUS = '65'; // 'Invalid liquidity bonus parameter for the reserve' string public constant INVALID_DECIMALS = '66'; // 'Invalid decimals parameter of the underlying asset of the reserve' string public constant INVALID_RESERVE_FACTOR = '67'; // 'Invalid reserve factor parameter for the reserve' string public constant INVALID_BORROW_CAP = '68'; // 'Invalid borrow cap for the reserve' string public constant INVALID_SUPPLY_CAP = '69'; // 'Invalid supply cap for the reserve' string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = '70'; // 'Invalid liquidation protocol fee for the reserve' string public constant INVALID_EMODE_CATEGORY = '71'; // 'Invalid eMode category for the reserve' string public constant INVALID_UNBACKED_MINT_CAP = '72'; // 'Invalid unbacked mint cap for the reserve' string public constant INVALID_DEBT_CEILING = '73'; // 'Invalid debt ceiling for the reserve string public constant INVALID_RESERVE_INDEX = '74'; // 'Invalid reserve index' string public constant ACL_ADMIN_CANNOT_BE_ZERO = '75'; // 'ACL admin cannot be set to the zero address' string public constant INCONSISTENT_PARAMS_LENGTH = '76'; // 'Array parameters that should be equal length are not' string public constant ZERO_ADDRESS_NOT_VALID = '77'; // 'Zero address not valid' string public constant INVALID_EXPIRATION = '78'; // 'Invalid expiration' string public constant INVALID_SIGNATURE = '79'; // 'Invalid signature' string public constant OPERATION_NOT_SUPPORTED = '80'; // 'Operation not supported' string public constant DEBT_CEILING_NOT_ZERO = '81'; // 'Debt ceiling is not zero' string public constant ASSET_NOT_LISTED = '82'; // 'Asset is not listed' string public constant INVALID_OPTIMAL_USAGE_RATIO = '83'; // 'Invalid optimal usage ratio' string public constant UNDERLYING_CANNOT_BE_RESCUED = '85'; // 'The underlying asset cannot be rescued' string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = '86'; // 'Reserve has already been added to reserve list' string public constant POOL_ADDRESSES_DO_NOT_MATCH = '87'; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' string public constant SILOED_BORROWING_VIOLATION = '89'; // 'User is trying to borrow multiple assets including a siloed one' string public constant RESERVE_DEBT_NOT_ZERO = '90'; // the total debt of the reserve needs to be 0 string public constant FLASHLOAN_DISABLED = '91'; // FlashLoaning for this asset is disabled string public constant INVALID_MAX_RATE = '92'; // The expect maximum borrow rate is invalid string public constant WITHDRAW_TO_ATOKEN = '93'; // Withdrawing to the aToken is not allowed string public constant SUPPLY_TO_ATOKEN = '94'; // Supplying to the aToken is not allowed string public constant SLOPE_2_MUST_BE_GTE_SLOPE_1 = '95'; // Variable interest rate slope 2 can not be lower than slope 1 string public constant CALLER_NOT_RISK_OR_POOL_OR_EMERGENCY_ADMIN = '96'; // 'The caller of the function is not a risk, pool or emergency admin' string public constant LIQUIDATION_GRACE_SENTINEL_CHECK_FAILED = '97'; // 'Liquidation grace sentinel validation failed' string public constant INVALID_GRACE_PERIOD = '98'; // Grace period above a valid range string public constant INVALID_FREEZE_STATE = '99'; // Reserve is already in the passed freeze state string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode string public constant CALLER_NOT_UMBRELLA = '101'; // The caller of the function is not the umbrella contract string public constant RESERVE_NOT_IN_DEFICIT = '102'; // The reserve is not in deficit string public constant MUST_NOT_LEAVE_DUST = '103'; // Below a certain threshold liquidators need to take the full position string public constant USER_CANNOT_HAVE_DEBT = '104'; // Thrown when a user tries to interact with a method that requires a position without debt }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; /** * @title PercentageMath library * @author Aave * @notice Provides functions to perform percentage calculations * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. */ library PercentageMath { // Maximum percentage factor (100.00%) uint256 internal constant PERCENTAGE_FACTOR = 1e4; // Half percentage factor (50.00%) uint256 internal constant HALF_PERCENTAGE_FACTOR = 0.5e4; /** * @notice Executes a percentage multiplication * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 * @param value The value of which the percentage needs to be calculated * @param percentage The percentage of the value to be calculated * @return result value percentmul percentage */ function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256 result) { // to avoid overflow, value <= (type(uint256).max - HALF_PERCENTAGE_FACTOR) / percentage assembly { if iszero( or( iszero(percentage), iszero(gt(value, div(sub(not(0), HALF_PERCENTAGE_FACTOR), percentage))) ) ) { revert(0, 0) } result := div(add(mul(value, percentage), HALF_PERCENTAGE_FACTOR), PERCENTAGE_FACTOR) } } /** * @notice Executes a percentage division * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 * @param value The value of which the percentage needs to be calculated * @param percentage The percentage of the value to be calculated * @return result value percentdiv percentage */ function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256 result) { // to avoid overflow, value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR assembly { if or( iszero(percentage), iszero(iszero(gt(value, div(sub(not(0), div(percentage, 2)), PERCENTAGE_FACTOR)))) ) { revert(0, 0) } result := div(add(mul(value, PERCENTAGE_FACTOR), div(percentage, 2)), percentage) } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; /** * @title WadRayMath library * @author Aave * @notice Provides functions to perform calculations with Wad and Ray units * @dev Provides mul and div function for wads (decimal numbers with 18 digits of precision) and rays (decimal numbers * with 27 digits of precision) * @dev Operations are rounded. If a value is >=.5, will be rounded up, otherwise rounded down. */ library WadRayMath { // HALF_WAD and HALF_RAY expressed with extended notation as constant with operations are not supported in Yul assembly uint256 internal constant WAD = 1e18; uint256 internal constant HALF_WAD = 0.5e18; uint256 internal constant RAY = 1e27; uint256 internal constant HALF_RAY = 0.5e27; uint256 internal constant WAD_RAY_RATIO = 1e9; /** * @dev Multiplies two wad, rounding half up to the nearest wad * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 * @param a Wad * @param b Wad * @return c = a*b, in wad */ function wadMul(uint256 a, uint256 b) internal pure returns (uint256 c) { // to avoid overflow, a <= (type(uint256).max - HALF_WAD) / b assembly { if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_WAD), b))))) { revert(0, 0) } c := div(add(mul(a, b), HALF_WAD), WAD) } } /** * @dev Divides two wad, rounding half up to the nearest wad * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 * @param a Wad * @param b Wad * @return c = a/b, in wad */ function wadDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { // to avoid overflow, a <= (type(uint256).max - halfB) / WAD assembly { if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), WAD))))) { revert(0, 0) } c := div(add(mul(a, WAD), div(b, 2)), b) } } /** * @notice Multiplies two ray, rounding half up to the nearest ray * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 * @param a Ray * @param b Ray * @return c = a raymul b */ function rayMul(uint256 a, uint256 b) internal pure returns (uint256 c) { // to avoid overflow, a <= (type(uint256).max - HALF_RAY) / b assembly { if iszero(or(iszero(b), iszero(gt(a, div(sub(not(0), HALF_RAY), b))))) { revert(0, 0) } c := div(add(mul(a, b), HALF_RAY), RAY) } } /** * @notice Divides two ray, rounding half up to the nearest ray * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 * @param a Ray * @param b Ray * @return c = a raydiv b */ function rayDiv(uint256 a, uint256 b) internal pure returns (uint256 c) { // to avoid overflow, a <= (type(uint256).max - halfB) / RAY assembly { if or(iszero(b), iszero(iszero(gt(a, div(sub(not(0), div(b, 2)), RAY))))) { revert(0, 0) } c := div(add(mul(a, RAY), div(b, 2)), b) } } /** * @dev Casts ray down to wad * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 * @param a Ray * @return b = a converted to wad, rounded half up to the nearest wad */ function rayToWad(uint256 a) internal pure returns (uint256 b) { assembly { b := div(a, WAD_RAY_RATIO) let remainder := mod(a, WAD_RAY_RATIO) if iszero(lt(remainder, div(WAD_RAY_RATIO, 2))) { b := add(b, 1) } } } /** * @dev Converts wad up to ray * @dev assembly optimized for improved gas savings, see https://twitter.com/transmissions11/status/1451131036377571328 * @param a Wad * @return b = a converted in ray */ function wadToRay(uint256 a) internal pure returns (uint256 b) { // to avoid overflow, b/WAD_RAY_RATIO == a assembly { b := mul(a, WAD_RAY_RATIO) if iszero(eq(div(b, WAD_RAY_RATIO), a)) { revert(0, 0) } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library DataTypes { /** * This exists specifically to maintain the `getReserveData()` interface, since the new, internal * `ReserveData` struct includes the reserve's `virtualUnderlyingBalance`. */ struct ReserveDataLegacy { //stores the reserve configuration ReserveConfigurationMap configuration; //the liquidity index. Expressed in ray uint128 liquidityIndex; //the current supply rate. Expressed in ray uint128 currentLiquidityRate; //variable borrow index. Expressed in ray uint128 variableBorrowIndex; //the current variable borrow rate. Expressed in ray uint128 currentVariableBorrowRate; // DEPRECATED on v3.2.0 uint128 currentStableBorrowRate; //timestamp of last update uint40 lastUpdateTimestamp; //the id of the reserve. Represents the position in the list of the active reserves uint16 id; //aToken address address aTokenAddress; // DEPRECATED on v3.2.0 address stableDebtTokenAddress; //variableDebtToken address address variableDebtTokenAddress; //address of the interest rate strategy address interestRateStrategyAddress; //the current treasury balance, scaled uint128 accruedToTreasury; //the outstanding unbacked aTokens minted through the bridging feature uint128 unbacked; //the outstanding debt borrowed against this asset in isolation mode uint128 isolationModeTotalDebt; } struct ReserveData { //stores the reserve configuration ReserveConfigurationMap configuration; //the liquidity index. Expressed in ray uint128 liquidityIndex; //the current supply rate. Expressed in ray uint128 currentLiquidityRate; //variable borrow index. Expressed in ray uint128 variableBorrowIndex; //the current variable borrow rate. Expressed in ray uint128 currentVariableBorrowRate; /// @notice reused `__deprecatedStableBorrowRate` storage from pre 3.2 // the current accumulate deficit in underlying tokens uint128 deficit; //timestamp of last update uint40 lastUpdateTimestamp; //the id of the reserve. Represents the position in the list of the active reserves uint16 id; //timestamp until when liquidations are not allowed on the reserve, if set to past liquidations will be allowed uint40 liquidationGracePeriodUntil; //aToken address address aTokenAddress; // DEPRECATED on v3.2.0 address __deprecatedStableDebtTokenAddress; //variableDebtToken address address variableDebtTokenAddress; //address of the interest rate strategy address interestRateStrategyAddress; //the current treasury balance, scaled uint128 accruedToTreasury; //the outstanding unbacked aTokens minted through the bridging feature uint128 unbacked; //the outstanding debt borrowed against this asset in isolation mode uint128 isolationModeTotalDebt; //the amount of underlying accounted for by the protocol uint128 virtualUnderlyingBalance; } struct ReserveConfigurationMap { //bit 0-15: LTV //bit 16-31: Liq. threshold //bit 32-47: Liq. bonus //bit 48-55: Decimals //bit 56: reserve is active //bit 57: reserve is frozen //bit 58: borrowing is enabled //bit 59: DEPRECATED: stable rate borrowing enabled //bit 60: asset is paused //bit 61: borrowing in isolation mode is enabled //bit 62: siloed borrowing enabled //bit 63: flashloaning enabled //bit 64-79: reserve factor //bit 80-115: borrow cap in whole tokens, borrowCap == 0 => no cap //bit 116-151: supply cap in whole tokens, supplyCap == 0 => no cap //bit 152-167: liquidation protocol fee //bit 168-175: DEPRECATED: eMode category //bit 176-211: unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled //bit 212-251: debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals //bit 252: virtual accounting is enabled for the reserve //bit 253-255 unused uint256 data; } struct UserConfigurationMap { /** * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. * The first bit indicates if an asset is used as collateral by the user, the second whether an * asset is borrowed by the user. */ uint256 data; } // DEPRECATED: kept for backwards compatibility, might be removed in a future version struct EModeCategoryLegacy { // each eMode category has a custom ltv and liquidation threshold uint16 ltv; uint16 liquidationThreshold; uint16 liquidationBonus; // DEPRECATED address priceSource; string label; } struct CollateralConfig { uint16 ltv; uint16 liquidationThreshold; uint16 liquidationBonus; } struct EModeCategoryBaseConfiguration { uint16 ltv; uint16 liquidationThreshold; uint16 liquidationBonus; string label; } struct EModeCategory { // each eMode category has a custom ltv and liquidation threshold uint16 ltv; uint16 liquidationThreshold; uint16 liquidationBonus; uint128 collateralBitmap; string label; uint128 borrowableBitmap; } enum InterestRateMode { NONE, __DEPRECATED, VARIABLE } struct ReserveCache { uint256 currScaledVariableDebt; uint256 nextScaledVariableDebt; uint256 currLiquidityIndex; uint256 nextLiquidityIndex; uint256 currVariableBorrowIndex; uint256 nextVariableBorrowIndex; uint256 currLiquidityRate; uint256 currVariableBorrowRate; uint256 reserveFactor; ReserveConfigurationMap reserveConfiguration; address aTokenAddress; address variableDebtTokenAddress; uint40 reserveLastUpdateTimestamp; } struct ExecuteLiquidationCallParams { uint256 reservesCount; uint256 debtToCover; address collateralAsset; address debtAsset; address user; bool receiveAToken; address priceOracle; uint8 userEModeCategory; address priceOracleSentinel; } struct ExecuteSupplyParams { address asset; uint256 amount; address onBehalfOf; uint16 referralCode; } struct ExecuteBorrowParams { address asset; address user; address onBehalfOf; uint256 amount; InterestRateMode interestRateMode; uint16 referralCode; bool releaseUnderlying; uint256 reservesCount; address oracle; uint8 userEModeCategory; address priceOracleSentinel; } struct ExecuteRepayParams { address asset; uint256 amount; InterestRateMode interestRateMode; address onBehalfOf; bool useATokens; } struct ExecuteWithdrawParams { address asset; uint256 amount; address to; uint256 reservesCount; address oracle; uint8 userEModeCategory; } struct ExecuteEliminateDeficitParams { address asset; uint256 amount; } struct ExecuteSetUserEModeParams { uint256 reservesCount; address oracle; uint8 categoryId; } struct FinalizeTransferParams { address asset; address from; address to; uint256 amount; uint256 balanceFromBefore; uint256 balanceToBefore; uint256 reservesCount; address oracle; uint8 fromEModeCategory; } struct FlashloanParams { address receiverAddress; address[] assets; uint256[] amounts; uint256[] interestRateModes; address onBehalfOf; bytes params; uint16 referralCode; uint256 flashLoanPremiumToProtocol; uint256 flashLoanPremiumTotal; uint256 reservesCount; address addressesProvider; address pool; uint8 userEModeCategory; bool isAuthorizedFlashBorrower; } struct FlashloanSimpleParams { address receiverAddress; address asset; uint256 amount; bytes params; uint16 referralCode; uint256 flashLoanPremiumToProtocol; uint256 flashLoanPremiumTotal; } struct FlashLoanRepaymentParams { uint256 amount; uint256 totalPremium; uint256 flashLoanPremiumToProtocol; address asset; address receiverAddress; uint16 referralCode; } struct CalculateUserAccountDataParams { UserConfigurationMap userConfig; uint256 reservesCount; address user; address oracle; uint8 userEModeCategory; } struct ValidateBorrowParams { ReserveCache reserveCache; UserConfigurationMap userConfig; address asset; address userAddress; uint256 amount; InterestRateMode interestRateMode; uint256 reservesCount; address oracle; uint8 userEModeCategory; address priceOracleSentinel; bool isolationModeActive; address isolationModeCollateralAddress; uint256 isolationModeDebtCeiling; } struct ValidateLiquidationCallParams { ReserveCache debtReserveCache; uint256 totalDebt; uint256 healthFactor; address priceOracleSentinel; } struct CalculateInterestRatesParams { uint256 unbacked; uint256 liquidityAdded; uint256 liquidityTaken; uint256 totalDebt; uint256 reserveFactor; address reserve; bool usingVirtualBalance; uint256 virtualUnderlyingBalance; } struct InitReserveParams { address asset; address aTokenAddress; address variableDebtAddress; address interestRateStrategyAddress; uint16 reservesCount; uint16 maxNumberReserves; } }
{ "remappings": [ "solidity-utils/=lib/solidity-utils/src/", "forge-std/=lib/forge-std/src/", "ds-test/=lib/forge-std/lib/ds-test/src/", "openzeppelin-contracts-upgradeable/=lib/solidity-utils/lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/solidity-utils/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/", "@openzeppelin/contracts-upgradeable/=lib/solidity-utils/lib/openzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/contracts/=lib/solidity-utils/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/", "erc4626-tests/=lib/solidity-utils/lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "halmos-cheatcodes/=lib/solidity-utils/lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "shanghai", "viaIR": false, "libraries": { "src/contracts/protocol/libraries/logic/BorrowLogic.sol": { "BorrowLogic": "0x62325c94E1c49dcDb5937726aB5D8A4c37bCAd36" }, "src/contracts/protocol/libraries/logic/BridgeLogic.sol": { "BridgeLogic": "0x621Ef86D8A5C693a06295BC288B95C12D4CE4994" }, "src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol": { "ConfiguratorLogic": "0x09e88e877B39D883BAFd46b65E7B06CC56963041" }, "src/contracts/protocol/libraries/logic/EModeLogic.sol": { "EModeLogic": "0xC31d2362fAeD85dF79d0bec99693D0EB0Abd3f74" }, "src/contracts/protocol/libraries/logic/FlashLoanLogic.sol": { "FlashLoanLogic": "0x34039100cc9584Ae5D741d322e16d0d18CEE8770" }, "src/contracts/protocol/libraries/logic/LiquidationLogic.sol": { "LiquidationLogic": "0x4731bF01583F991278692E8727d0700a00A1fBBf" }, "src/contracts/protocol/libraries/logic/PoolLogic.sol": { "PoolLogic": "0xf8C97539934ee66a67C26010e8e027D77E821B0C" }, "src/contracts/protocol/libraries/logic/SupplyLogic.sol": { "SupplyLogic": "0x185477906B46D9b8DE0DEB73A1bBfb87b5b51BC3" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"provider","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"reserve","type":"address"},{"indexed":false,"internalType":"uint256","name":"optimalUsageRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseVariableBorrowRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"variableRateSlope1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"variableRateSlope2","type":"uint256"}],"name":"RateDataUpdate","type":"event"},{"inputs":[],"name":"ADDRESSES_PROVIDER","outputs":[{"internalType":"contract IPoolAddressesProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BORROW_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_OPTIMAL_POINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_OPTIMAL_POINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"unbacked","type":"uint256"},{"internalType":"uint256","name":"liquidityAdded","type":"uint256"},{"internalType":"uint256","name":"liquidityTaken","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"reserveFactor","type":"uint256"},{"internalType":"address","name":"reserve","type":"address"},{"internalType":"bool","name":"usingVirtualBalance","type":"bool"},{"internalType":"uint256","name":"virtualUnderlyingBalance","type":"uint256"}],"internalType":"struct DataTypes.CalculateInterestRatesParams","name":"params","type":"tuple"}],"name":"calculateInterestRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"}],"name":"getBaseVariableBorrowRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"}],"name":"getInterestRateData","outputs":[{"components":[{"internalType":"uint256","name":"optimalUsageRatio","type":"uint256"},{"internalType":"uint256","name":"baseVariableBorrowRate","type":"uint256"},{"internalType":"uint256","name":"variableRateSlope1","type":"uint256"},{"internalType":"uint256","name":"variableRateSlope2","type":"uint256"}],"internalType":"struct IDefaultInterestRateStrategyV2.InterestRateDataRay","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"}],"name":"getInterestRateDataBps","outputs":[{"components":[{"internalType":"uint16","name":"optimalUsageRatio","type":"uint16"},{"internalType":"uint32","name":"baseVariableBorrowRate","type":"uint32"},{"internalType":"uint32","name":"variableRateSlope1","type":"uint32"},{"internalType":"uint32","name":"variableRateSlope2","type":"uint32"}],"internalType":"struct IDefaultInterestRateStrategyV2.InterestRateData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"}],"name":"getMaxVariableBorrowRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"}],"name":"getOptimalUsageRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"}],"name":"getVariableRateSlope1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"}],"name":"getVariableRateSlope2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"},{"internalType":"bytes","name":"rateData","type":"bytes"}],"name":"setInterestRateParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"},{"components":[{"internalType":"uint16","name":"optimalUsageRatio","type":"uint16"},{"internalType":"uint32","name":"baseVariableBorrowRate","type":"uint32"},{"internalType":"uint32","name":"variableRateSlope1","type":"uint32"},{"internalType":"uint32","name":"variableRateSlope2","type":"uint32"}],"internalType":"struct IDefaultInterestRateStrategyV2.InterestRateData","name":"rateData","type":"tuple"}],"name":"setInterestRateParams","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561000f575f80fd5b506040516110c53803806110c583398101604081905261002e91610089565b604080518082019091526002815261189960f11b60208201526001600160a01b0382166100775760405162461bcd60e51b815260040161006e91906100b6565b60405180910390fd5b506001600160a01b0316608052610102565b5f60208284031215610099575f80fd5b81516001600160a01b03811681146100af575f80fd5b9392505050565b5f602080835283518060208501525f5b818110156100e2578581018301518582016040015282016100c6565b505f604082860101526040601f19601f8301168501019250505092915050565b608051610f9e6101275f395f818160ee0152818161046a01526107fb0152610f9e5ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063a8d9e56f11610088578063c79ce42e11610063578063c79ce42e1461021d578063cca22ea1146102f2578063f7e0fe6714610305578063fd81bb121461030d575f80fd5b8063a8d9e56f146101cd578063aa33f063146101e2578063b90db31b146101f5575f80fd5b80636a00178e116100c35780636a00178e146101945780637a0c5ebf146101a75780637a24bd7e146101b15780638f4b0d5d146101ba575f80fd5b80630542975c146100e9578063131e889c1461012d5780635b651bae14610173575b5f80fd5b6101107f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61014061013b366004610c74565b610320565b60405161012491908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b610186610181366004610c74565b6103b2565b604051908152602001610124565b6101866101a2366004610c74565b6103e0565b610186620186a081565b6101866126ac81565b6101866101c8366004610c74565b61043a565b6101e06101db366004610c96565b610468565b005b6101866101f0366004610c74565b610559565b610208610203366004610d28565b61057e565b60408051928352602083019190915201610124565b6102ad61022b366004610c74565b604080516080810182525f808252602082018190529181018290526060810191909152506001600160a01b03165f90815260208181526040918290208251608081018452905461ffff8116825263ffffffff620100008204811693830193909352600160301b8104831693820193909352600160501b90920416606082015290565b6040516101249190815161ffff16815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b610186610300366004610c74565b6107cc565b610186606481565b6101e061031b366004610dd5565b6107f9565b61034760405180608001604052805f81526020015f81526020015f81526020015f81525090565b6001600160a01b0382165f90815260208181526040918290208251608081018452905461ffff8116825263ffffffff620100008204811693830193909352600160301b8104831693820193909352600160501b9092041660608201526103ac906108de565b92915050565b6001600160a01b0381165f908152602081905260408120546103ac90600160301b900463ffffffff16610970565b6001600160a01b0381165f908152602081905260408120546103ac9063ffffffff600160501b820481169161042591600160301b820481169162010000900416610e27565b61042f9190610e27565b63ffffffff16610970565b6001600160a01b0381165f908152602081905260408120546103ac90600160501b900463ffffffff16610970565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663631adfca6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e89190610e4b565b6001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161031360f41b8152509061053e5760405162461bcd60e51b81526004016105359190610e66565b60405180910390fd5b506105548361054f83850185610ec5565b610985565b505050565b6001600160a01b0381165f908152602081905260408120546103ac9061ffff16610970565b60a08101516001600160a01b03165f908152602081815260408083208151608081018352905461ffff8116825263ffffffff620100008204811694830194909452600160301b8104841692820192909252600160501b9091049091166060820152819081906105ec906108de565b90508360c0015161060557602001515f94909350915050565b6106386040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f6040820152602080830151908201526060850151156106c957846040015185602001518660e0015161066b9190610f54565b6106759190610f67565b808252606086015161068691610f54565b60a08201819052606086015161069b91610bba565b6060820152845160a08201516106bf916106b491610f54565b606087015190610bba565b60808201526106d8565b602001515f9590945092505050565b8151606082015111156107565781515f9061071a90610703906b033b2e3c9fd0803ce8000000610f67565b845160608501516107149190610f67565b90610bba565b606084015190915061072c9082610bf7565b836040015161073b9190610f54565b8260200181815161074c9190610f54565b9052506107869050565b81516060820151604084015161077192916107149190610bf7565b816020018181516107829190610f54565b9052505b6107b4856080015161271061079b9190610f67565b608083015160208401516107ae91610bf7565b90610c39565b60408201819052602090910151909590945092505050565b6001600160a01b0381165f908152602081905260408120546103ac9062010000900463ffffffff16610970565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663631adfca6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610855573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108799190610e4b565b6001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161031360f41b815250906108c65760405162461bcd60e51b81526004016105359190610e66565b506108da8261054f36849003840184610ec5565b5050565b61090560405180608001604052805f81526020015f81526020015f81526020015f81525090565b6040518060800160405280610920845f015161ffff16610970565b8152602001610938846020015163ffffffff16610970565b8152602001610950846040015163ffffffff16610970565b8152602001610968846060015163ffffffff16610970565b905292915050565b5f6103ac8269152d02c7e14af6800000610f7a565b604080518082019091526002815261373760f01b60208201526001600160a01b0383166109c55760405162461bcd60e51b81526004016105359190610e66565b506126ac815f015161ffff16111580156109e757506064815f015161ffff1610155b60405180604001604052806002815260200161383360f01b81525090610a205760405162461bcd60e51b81526004016105359190610e66565b50806060015163ffffffff16816040015163ffffffff16111560405180604001604052806002815260200161393560f01b81525090610a725760405162461bcd60e51b81526004016105359190610e66565b50620186a0816060015163ffffffff16826040015163ffffffff16836020015163ffffffff16610aa29190610f54565b610aac9190610f54565b1115604051806040016040528060028152602001611c9960f11b81525090610ae75760405162461bcd60e51b81526004016105359190610e66565b506001600160a01b0382165f81815260208181526040918290208451815486840151878601516060808a015161ffff90951665ffffffffffff1990941684176201000063ffffffff948516908102919091176dffffffffffffffff0000000000001916600160301b93851693840263ffffffff60501b191617600160501b9490961693840295909517909555865192835294820192909252938401929092528201527f5d123bea2036a4052274206f59d99350b9741e17da56ffae335d809b25ee09429060800160405180910390a25050565b5f81156b033b2e3c9fd0803ce800000060028404190484111715610bdc575f80fd5b506b033b2e3c9fd0803ce80000009190910260028204010490565b5f81156b019d971e4fe8401e740000001983900484111517610c17575f80fd5b506b033b2e3c9fd0803ce800000091026b019d971e4fe8401e74000000010490565b5f81156113881983900484111517610c4f575f80fd5b506127109102611388010490565b6001600160a01b0381168114610c71575f80fd5b50565b5f60208284031215610c84575f80fd5b8135610c8f81610c5d565b9392505050565b5f805f60408486031215610ca8575f80fd5b8335610cb381610c5d565b9250602084013567ffffffffffffffff80821115610ccf575f80fd5b818601915086601f830112610ce2575f80fd5b813581811115610cf0575f80fd5b876020828501011115610d01575f80fd5b6020830194508093505050509250925092565b80358015158114610d23575f80fd5b919050565b5f610100808385031215610d3a575f80fd5b6040519081019067ffffffffffffffff82118183101715610d6957634e487b7160e01b5f52604160045260245ffd5b81604052833581526020840135602082015260408401356040820152606084013560608201526080840135608082015260a08401359150610da982610c5d565b8160a0820152610dbb60c08501610d14565b60c082015260e084013560e0820152809250505092915050565b5f8082840360a0811215610de7575f80fd5b8335610df281610c5d565b92506080601f1982011215610e05575f80fd5b506020830190509250929050565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff818116838216019080821115610e4457610e44610e13565b5092915050565b5f60208284031215610e5b575f80fd5b8151610c8f81610c5d565b5f602080835283518060208501525f5b81811015610e9257858101830151858201604001528201610e76565b505f604082860101526040601f19601f8301168501019250505092915050565b803563ffffffff81168114610d23575f80fd5b5f60808284031215610ed5575f80fd5b6040516080810181811067ffffffffffffffff82111715610f0457634e487b7160e01b5f52604160045260245ffd5b604052823561ffff81168114610f18575f80fd5b8152610f2660208401610eb2565b6020820152610f3760408401610eb2565b6040820152610f4860608401610eb2565b60608201529392505050565b808201808211156103ac576103ac610e13565b818103818111156103ac576103ac610e13565b80820281158282048414176103ac576103ac610e1356fea164736f6c6343000816000a0000000000000000000000004172e6aaec070acb31aace343a58c93e4c70f44d
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063a8d9e56f11610088578063c79ce42e11610063578063c79ce42e1461021d578063cca22ea1146102f2578063f7e0fe6714610305578063fd81bb121461030d575f80fd5b8063a8d9e56f146101cd578063aa33f063146101e2578063b90db31b146101f5575f80fd5b80636a00178e116100c35780636a00178e146101945780637a0c5ebf146101a75780637a24bd7e146101b15780638f4b0d5d146101ba575f80fd5b80630542975c146100e9578063131e889c1461012d5780635b651bae14610173575b5f80fd5b6101107f0000000000000000000000004172e6aaec070acb31aace343a58c93e4c70f44d81565b6040516001600160a01b0390911681526020015b60405180910390f35b61014061013b366004610c74565b610320565b60405161012491908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b610186610181366004610c74565b6103b2565b604051908152602001610124565b6101866101a2366004610c74565b6103e0565b610186620186a081565b6101866126ac81565b6101866101c8366004610c74565b61043a565b6101e06101db366004610c96565b610468565b005b6101866101f0366004610c74565b610559565b610208610203366004610d28565b61057e565b60408051928352602083019190915201610124565b6102ad61022b366004610c74565b604080516080810182525f808252602082018190529181018290526060810191909152506001600160a01b03165f90815260208181526040918290208251608081018452905461ffff8116825263ffffffff620100008204811693830193909352600160301b8104831693820193909352600160501b90920416606082015290565b6040516101249190815161ffff16815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b610186610300366004610c74565b6107cc565b610186606481565b6101e061031b366004610dd5565b6107f9565b61034760405180608001604052805f81526020015f81526020015f81526020015f81525090565b6001600160a01b0382165f90815260208181526040918290208251608081018452905461ffff8116825263ffffffff620100008204811693830193909352600160301b8104831693820193909352600160501b9092041660608201526103ac906108de565b92915050565b6001600160a01b0381165f908152602081905260408120546103ac90600160301b900463ffffffff16610970565b6001600160a01b0381165f908152602081905260408120546103ac9063ffffffff600160501b820481169161042591600160301b820481169162010000900416610e27565b61042f9190610e27565b63ffffffff16610970565b6001600160a01b0381165f908152602081905260408120546103ac90600160501b900463ffffffff16610970565b7f0000000000000000000000004172e6aaec070acb31aace343a58c93e4c70f44d6001600160a01b031663631adfca6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e89190610e4b565b6001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161031360f41b8152509061053e5760405162461bcd60e51b81526004016105359190610e66565b60405180910390fd5b506105548361054f83850185610ec5565b610985565b505050565b6001600160a01b0381165f908152602081905260408120546103ac9061ffff16610970565b60a08101516001600160a01b03165f908152602081815260408083208151608081018352905461ffff8116825263ffffffff620100008204811694830194909452600160301b8104841692820192909252600160501b9091049091166060820152819081906105ec906108de565b90508360c0015161060557602001515f94909350915050565b6106386040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f6040820152602080830151908201526060850151156106c957846040015185602001518660e0015161066b9190610f54565b6106759190610f67565b808252606086015161068691610f54565b60a08201819052606086015161069b91610bba565b6060820152845160a08201516106bf916106b491610f54565b606087015190610bba565b60808201526106d8565b602001515f9590945092505050565b8151606082015111156107565781515f9061071a90610703906b033b2e3c9fd0803ce8000000610f67565b845160608501516107149190610f67565b90610bba565b606084015190915061072c9082610bf7565b836040015161073b9190610f54565b8260200181815161074c9190610f54565b9052506107869050565b81516060820151604084015161077192916107149190610bf7565b816020018181516107829190610f54565b9052505b6107b4856080015161271061079b9190610f67565b608083015160208401516107ae91610bf7565b90610c39565b60408201819052602090910151909590945092505050565b6001600160a01b0381165f908152602081905260408120546103ac9062010000900463ffffffff16610970565b7f0000000000000000000000004172e6aaec070acb31aace343a58c93e4c70f44d6001600160a01b031663631adfca6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610855573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108799190610e4b565b6001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161031360f41b815250906108c65760405162461bcd60e51b81526004016105359190610e66565b506108da8261054f36849003840184610ec5565b5050565b61090560405180608001604052805f81526020015f81526020015f81526020015f81525090565b6040518060800160405280610920845f015161ffff16610970565b8152602001610938846020015163ffffffff16610970565b8152602001610950846040015163ffffffff16610970565b8152602001610968846060015163ffffffff16610970565b905292915050565b5f6103ac8269152d02c7e14af6800000610f7a565b604080518082019091526002815261373760f01b60208201526001600160a01b0383166109c55760405162461bcd60e51b81526004016105359190610e66565b506126ac815f015161ffff16111580156109e757506064815f015161ffff1610155b60405180604001604052806002815260200161383360f01b81525090610a205760405162461bcd60e51b81526004016105359190610e66565b50806060015163ffffffff16816040015163ffffffff16111560405180604001604052806002815260200161393560f01b81525090610a725760405162461bcd60e51b81526004016105359190610e66565b50620186a0816060015163ffffffff16826040015163ffffffff16836020015163ffffffff16610aa29190610f54565b610aac9190610f54565b1115604051806040016040528060028152602001611c9960f11b81525090610ae75760405162461bcd60e51b81526004016105359190610e66565b506001600160a01b0382165f81815260208181526040918290208451815486840151878601516060808a015161ffff90951665ffffffffffff1990941684176201000063ffffffff948516908102919091176dffffffffffffffff0000000000001916600160301b93851693840263ffffffff60501b191617600160501b9490961693840295909517909555865192835294820192909252938401929092528201527f5d123bea2036a4052274206f59d99350b9741e17da56ffae335d809b25ee09429060800160405180910390a25050565b5f81156b033b2e3c9fd0803ce800000060028404190484111715610bdc575f80fd5b506b033b2e3c9fd0803ce80000009190910260028204010490565b5f81156b019d971e4fe8401e740000001983900484111517610c17575f80fd5b506b033b2e3c9fd0803ce800000091026b019d971e4fe8401e74000000010490565b5f81156113881983900484111517610c4f575f80fd5b506127109102611388010490565b6001600160a01b0381168114610c71575f80fd5b50565b5f60208284031215610c84575f80fd5b8135610c8f81610c5d565b9392505050565b5f805f60408486031215610ca8575f80fd5b8335610cb381610c5d565b9250602084013567ffffffffffffffff80821115610ccf575f80fd5b818601915086601f830112610ce2575f80fd5b813581811115610cf0575f80fd5b876020828501011115610d01575f80fd5b6020830194508093505050509250925092565b80358015158114610d23575f80fd5b919050565b5f610100808385031215610d3a575f80fd5b6040519081019067ffffffffffffffff82118183101715610d6957634e487b7160e01b5f52604160045260245ffd5b81604052833581526020840135602082015260408401356040820152606084013560608201526080840135608082015260a08401359150610da982610c5d565b8160a0820152610dbb60c08501610d14565b60c082015260e084013560e0820152809250505092915050565b5f8082840360a0811215610de7575f80fd5b8335610df281610c5d565b92506080601f1982011215610e05575f80fd5b506020830190509250929050565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff818116838216019080821115610e4457610e44610e13565b5092915050565b5f60208284031215610e5b575f80fd5b8151610c8f81610c5d565b5f602080835283518060208501525f5b81811015610e9257858101830151858201604001528201610e76565b505f604082860101526040601f19601f8301168501019250505092915050565b803563ffffffff81168114610d23575f80fd5b5f60808284031215610ed5575f80fd5b6040516080810181811067ffffffffffffffff82111715610f0457634e487b7160e01b5f52604160045260245ffd5b604052823561ffff81168114610f18575f80fd5b8152610f2660208401610eb2565b6020820152610f3760408401610eb2565b6040820152610f4860608401610eb2565b60608201529392505050565b808201808211156103ac576103ac610e13565b818103818111156103ac576103ac610e13565b80820281158282048414176103ac576103ac610e1356fea164736f6c6343000816000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004172e6aaec070acb31aace343a58c93e4c70f44d
-----Decoded View---------------
Arg [0] : provider (address): 0x4172E6aAEC070ACB31aaCE343A58c93E4C70f44D
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000004172e6aaec070acb31aace343a58c93e4c70f44d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.