false
true
0

Contract Address Details

0x746fE703B81EA56499C62A447d67183C850DcAcA

Contract Name
LendingPoolAddressesProvider
Creator
0x64e7ff–1c04a3 at 0x78090b–76a266
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
13 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25879068
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
LendingPoolAddressesProvider




Optimization enabled
true
Compiler version
v0.7.6+commit.7338295f




Optimization runs
200
EVM Version
istanbul




Verified at
2023-07-16T06:30:55.586212Z

Constructor Arguments

0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001450686961742067656e65736973206d61726b6574000000000000000000000000

Arg [0] (string) : Phiat genesis market

              

contracts/protocol/configuration/LendingPoolAddressesProvider.sol

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.6;

import {Ownable} from "../../dependencies/openzeppelin/contracts/Ownable.sol";

// Prettier ignore to prevent buidler flatter bug
// prettier-ignore
import {InitializableImmutableAdminUpgradeabilityProxy} from '../libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol';

import {ILendingPoolAddressesProvider} from "../../interfaces/ILendingPoolAddressesProvider.sol";

/**
 * @title LendingPoolAddressesProvider contract
 * @dev Main registry of addresses part of or connected to the protocol, including permissioned roles
 * - Acting also as factory of proxies and admin of those, so with right to change its implementations
 * - Owned by the Aave Governance
 * @author Aave
 **/
contract LendingPoolAddressesProvider is
    Ownable,
    ILendingPoolAddressesProvider
{
    string private _marketId;
    mapping(bytes32 => address) private _addresses;

    bytes32 private constant LENDING_POOL = "LENDING_POOL";
    bytes32 private constant LENDING_POOL_CONFIGURATOR =
        "LENDING_POOL_CONFIGURATOR";
    bytes32 private constant POOL_ADMIN = "POOL_ADMIN";
    bytes32 private constant EMERGENCY_ADMIN = "EMERGENCY_ADMIN";
    bytes32 private constant LENDING_POOL_COLLATERAL_MANAGER =
        "COLLATERAL_MANAGER";
    bytes32 private constant PRICE_ORACLE = "PRICE_ORACLE";
    bytes32 private constant LENDING_RATE_ORACLE = "LENDING_RATE_ORACLE";
    bytes32 private constant INCENTIVE_CONTROLLER = "INCENTIVE_CONTROLLER";

    constructor(string memory marketId) {
        _setMarketId(marketId);
    }

    /**
     * @dev Returns the id of the Aave market to which this contracts points to
     * @return The market id
     **/
    function getMarketId() external view override returns (string memory) {
        return _marketId;
    }

    /**
     * @dev Allows to set the market which this LendingPoolAddressesProvider represents
     * @param marketId The market id
     */
    function setMarketId(string memory marketId) external override onlyOwner {
        _setMarketId(marketId);
    }

    /**
     * @dev 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 `implementationAddress`
     * 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 implementationAddress The address of the new implementation
     */
    function setAddressAsProxy(bytes32 id, address implementationAddress)
        external
        override
        onlyOwner
    {
        _updateImpl(id, implementationAddress);
        emit AddressSet(id, implementationAddress, true);
    }

    /**
     * @dev Sets an address for an id replacing the address saved in the addresses map
     * 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
        override
        onlyOwner
    {
        _addresses[id] = newAddress;
        emit AddressSet(id, newAddress, false);
    }

    /**
     * @dev Returns an address by id
     * @return The address
     */
    function getAddress(bytes32 id) public view override returns (address) {
        return _addresses[id];
    }

    /**
     * @dev Returns the address of the LendingPool proxy
     * @return The LendingPool proxy address
     **/
    function getLendingPool() external view override returns (address) {
        return getAddress(LENDING_POOL);
    }

    /**
     * @dev Updates the implementation of the LendingPool, or creates the proxy
     * setting the new `pool` implementation on the first time calling it
     * @param pool The new LendingPool implementation
     **/
    function setLendingPoolImpl(address pool) external override onlyOwner {
        _updateImpl(LENDING_POOL, pool);
        emit LendingPoolUpdated(pool);
    }

    /**
     * @dev Returns the address of the LendingPoolConfigurator proxy
     * @return The LendingPoolConfigurator proxy address
     **/
    function getLendingPoolConfigurator()
        external
        view
        override
        returns (address)
    {
        return getAddress(LENDING_POOL_CONFIGURATOR);
    }

    /**
     * @dev Updates the implementation of the LendingPoolConfigurator, or creates the proxy
     * setting the new `configurator` implementation on the first time calling it
     * @param configurator The new LendingPoolConfigurator implementation
     **/
    function setLendingPoolConfiguratorImpl(address configurator)
        external
        override
        onlyOwner
    {
        _updateImpl(LENDING_POOL_CONFIGURATOR, configurator);
        emit LendingPoolConfiguratorUpdated(configurator);
    }

    /**
     * @dev Returns the address of the LendingPoolCollateralManager. Since the manager is used
     * through delegateCall within the LendingPool contract, the proxy contract pattern does not work properly hence
     * the addresses are changed directly
     * @return The address of the LendingPoolCollateralManager
     **/

    function getLendingPoolCollateralManager()
        external
        view
        override
        returns (address)
    {
        return getAddress(LENDING_POOL_COLLATERAL_MANAGER);
    }

    /**
     * @dev Updates the address of the LendingPoolCollateralManager
     * @param manager The new LendingPoolCollateralManager address
     **/
    function setLendingPoolCollateralManager(address manager)
        external
        override
        onlyOwner
    {
        _addresses[LENDING_POOL_COLLATERAL_MANAGER] = manager;
        emit LendingPoolCollateralManagerUpdated(manager);
    }

    /**
     * @dev The functions below are getters/setters of addresses that are outside the context
     * of the protocol hence the upgradable proxy pattern is not used
     **/

    function getPoolAdmin() external view override returns (address) {
        return getAddress(POOL_ADMIN);
    }

    function setPoolAdmin(address admin) external override onlyOwner {
        _addresses[POOL_ADMIN] = admin;
        emit ConfigurationAdminUpdated(admin);
    }

    function getEmergencyAdmin() external view override returns (address) {
        return getAddress(EMERGENCY_ADMIN);
    }

    function setEmergencyAdmin(address emergencyAdmin)
        external
        override
        onlyOwner
    {
        _addresses[EMERGENCY_ADMIN] = emergencyAdmin;
        emit EmergencyAdminUpdated(emergencyAdmin);
    }

    function getPriceOracle() external view override returns (address) {
        return getAddress(PRICE_ORACLE);
    }

    function setPriceOracle(address priceOracle) external override onlyOwner {
        _addresses[PRICE_ORACLE] = priceOracle;
        emit PriceOracleUpdated(priceOracle);
    }

    function getLendingRateOracle() external view override returns (address) {
        return getAddress(LENDING_RATE_ORACLE);
    }

    function setLendingRateOracle(address lendingRateOracle)
        external
        override
        onlyOwner
    {
        _addresses[LENDING_RATE_ORACLE] = lendingRateOracle;
        emit LendingRateOracleUpdated(lendingRateOracle);
    }

    function getIncentivesController()
        external
        view
        override
        returns (address)
    {
        return getAddress(INCENTIVE_CONTROLLER);
    }

    function setIncentivesController(address incentivesController)
        external
        override
        onlyOwner
    {
        _addresses[INCENTIVE_CONTROLLER] = incentivesController;
        emit IncentivesControllerUpdated(incentivesController);
    }

    /**
     * @dev Internal function to update the implementation of a specific proxied component of the protocol
     * - If there is no proxy registered in the given `id`, it creates the proxy setting `newAdress`
     *   as implementation and calls the initialize() function on the proxy
     * - If there is already a proxy registered, it just updates the implementation to `newAddress` and
     *   calls the initialize() function via upgradeToAndCall() in the proxy
     * @param id The id of the proxy to be updated
     * @param newAddress The address of the new implementation
     **/
    function _updateImpl(bytes32 id, address newAddress) internal {
        address payable proxyAddress = payable(_addresses[id]);

        InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy(
                proxyAddress
            );
        bytes memory params = abi.encodeWithSignature(
            "initialize(address)",
            address(this)
        );

        if (proxyAddress == address(0)) {
            proxy = new InitializableImmutableAdminUpgradeabilityProxy(
                address(this)
            );
            proxy.initialize(newAddress, params);
            _addresses[id] = address(proxy);
            emit ProxyCreated(id, address(proxy));
        } else {
            proxy.upgradeToAndCall(newAddress, params);
        }
    }

    function _setMarketId(string memory marketId) internal {
        _marketId = marketId;
        emit MarketIdSet(marketId);
    }
}
        

contracts/dependencies/openzeppelin/contracts/Address.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
          

contracts/dependencies/openzeppelin/contracts/Context.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
          

contracts/dependencies/openzeppelin/contracts/Ownable.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
          

contracts/dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.6;

import "./Proxy.sol";
import "../contracts/Address.sol";

/**
 * @title BaseUpgradeabilityProxy
 * @dev This contract implements a proxy that allows to change the
 * implementation address to which it will delegate.
 * Such a change is called an implementation upgrade.
 */
contract BaseUpgradeabilityProxy is Proxy {
    /**
     * @dev Emitted when the implementation is upgraded.
     * @param implementation Address of the new implementation.
     */
    event Upgraded(address indexed implementation);

    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant IMPLEMENTATION_SLOT =
        0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    /**
     * @dev Returns the current implementation.
     * @return impl Address of the current implementation
     */
    function _implementation() internal view override returns (address impl) {
        bytes32 slot = IMPLEMENTATION_SLOT;
        //solium-disable-next-line
        assembly {
            impl := sload(slot)
        }
    }

    /**
     * @dev Upgrades the proxy to a new implementation.
     * @param newImplementation Address of the new implementation.
     */
    function _upgradeTo(address newImplementation) internal {
        _setImplementation(newImplementation);
        emit Upgraded(newImplementation);
    }

    /**
     * @dev Sets the implementation address of the proxy.
     * @param newImplementation Address of the new implementation.
     */
    function _setImplementation(address newImplementation) internal {
        require(
            Address.isContract(newImplementation),
            "Cannot set a proxy implementation to a non-contract address"
        );

        bytes32 slot = IMPLEMENTATION_SLOT;

        //solium-disable-next-line
        assembly {
            sstore(slot, newImplementation)
        }
    }
}
          

contracts/dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.6;

import "./BaseUpgradeabilityProxy.sol";

/**
 * @title InitializableUpgradeabilityProxy
 * @dev Extends BaseUpgradeabilityProxy with an initializer for initializing
 * implementation and init data.
 */
contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy {
    /**
     * @dev Contract initializer.
     * @param _logic Address of the initial implementation.
     * @param _data Data to send as msg.data to the implementation to initialize the proxied contract.
     * It should include the signature and the parameters of the function to be called, as described in
     * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
     * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped.
     */
    function initialize(address _logic, bytes memory _data) public payable {
        require(_implementation() == address(0));
        assert(
            IMPLEMENTATION_SLOT ==
                bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1)
        );
        _setImplementation(_logic);
        if (_data.length > 0) {
            (bool success, ) = _logic.delegatecall(_data);
            require(success);
        }
    }
}
          

contracts/dependencies/openzeppelin/upgradeability/Proxy.sol

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.6;

/**
 * @title Proxy
 * @dev Implements delegation of calls to other contracts, with proper
 * forwarding of return values and bubbling of failures.
 * It defines a fallback function that delegates all calls to the address
 * returned by the abstract _implementation() internal function.
 */
abstract contract Proxy {
    /**
     * @dev Fallback function.
     * Implemented entirely in `_fallback`.
     */
    fallback() external payable {
        _fallback();
    }

    /**
     * @return The Address of the implementation.
     */
    function _implementation() internal view virtual returns (address);

    /**
     * @dev Delegates execution to an implementation contract.
     * This is a low level function that doesn't return to its internal call site.
     * It will return to the external caller whatever the implementation returns.
     * @param implementation Address to delegate.
     */
    function _delegate(address implementation) internal {
        //solium-disable-next-line
        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
            let result := delegatecall(
                gas(),
                implementation,
                0,
                calldatasize(),
                0,
                0
            )

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }

    /**
     * @dev Function that is run as the first thing in the fallback function.
     * Can be redefined in derived contracts to add functionality.
     * Redefinitions must call super._willFallback().
     */
    function _willFallback() internal virtual {}

    /**
     * @dev fallback implementation.
     * Extracted to enable manual triggering.
     */
    function _fallback() internal {
        _willFallback();
        _delegate(_implementation());
    }
}
          

contracts/interfaces/ILendingPoolAddressesProvider.sol

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.6;

/**
 * @title LendingPoolAddressesProvider contract
 * @dev Main registry of addresses part of or connected to the protocol, including permissioned roles
 * - Acting also as factory of proxies and admin of those, so with right to change its implementations
 * - Owned by the Aave Governance
 * @author Aave
 **/
interface ILendingPoolAddressesProvider {
    event MarketIdSet(string newMarketId);
    event LendingPoolUpdated(address indexed newAddress);
    event ConfigurationAdminUpdated(address indexed newAddress);
    event EmergencyAdminUpdated(address indexed newAddress);
    event LendingPoolConfiguratorUpdated(address indexed newAddress);
    event LendingPoolCollateralManagerUpdated(address indexed newAddress);
    event PriceOracleUpdated(address indexed newAddress);
    event LendingRateOracleUpdated(address indexed newAddress);
    event IncentivesControllerUpdated(address indexed newAddress);
    event ProxyCreated(bytes32 id, address indexed newAddress);
    event AddressSet(bytes32 id, address indexed newAddress, bool hasProxy);

    function getMarketId() external view returns (string memory);

    function setMarketId(string calldata marketId) external;

    function setAddress(bytes32 id, address newAddress) external;

    function setAddressAsProxy(bytes32 id, address impl) external;

    function getAddress(bytes32 id) external view returns (address);

    function getLendingPool() external view returns (address);

    function setLendingPoolImpl(address pool) external;

    function getLendingPoolConfigurator() external view returns (address);

    function setLendingPoolConfiguratorImpl(address configurator) external;

    function getLendingPoolCollateralManager() external view returns (address);

    function setLendingPoolCollateralManager(address manager) external;

    function getPoolAdmin() external view returns (address);

    function setPoolAdmin(address admin) external;

    function getEmergencyAdmin() external view returns (address);

    function setEmergencyAdmin(address admin) external;

    function getPriceOracle() external view returns (address);

    function setPriceOracle(address priceOracle) external;

    function getLendingRateOracle() external view returns (address);

    function setLendingRateOracle(address lendingRateOracle) external;

    function getIncentivesController() external view returns (address);

    function setIncentivesController(address lendingRateOracle) external;
}
          

contracts/protocol/libraries/aave-upgradeability/BaseImmutableAdminUpgradeabilityProxy.sol

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.6;

import "../../../dependencies/openzeppelin/upgradeability/BaseUpgradeabilityProxy.sol";

/**
 * @title BaseImmutableAdminUpgradeabilityProxy
 * @author Aave, inspired by the OpenZeppelin upgradeability proxy pattern
 * @dev This contract combines an upgradeability proxy with an authorization
 * mechanism for administrative tasks. The admin role is stored in an immutable, which
 * helps saving transactions costs
 * All external functions in this contract must be guarded by the
 * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity
 * feature proposal that would enable this to be done automatically.
 */
contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy {
    address immutable ADMIN;

    constructor(address admin) {
        require(admin != address(0), "Admin can not be zero address");
        ADMIN = admin;
    }

    modifier ifAdmin() {
        if (msg.sender == ADMIN) {
            _;
        } else {
            _fallback();
        }
    }

    /**
     * @return The address of the proxy admin.
     */
    function admin() external ifAdmin returns (address) {
        return ADMIN;
    }

    /**
     * @return The address of the implementation.
     */
    function implementation() external ifAdmin returns (address) {
        return _implementation();
    }

    /**
     * @dev Upgrade the backing implementation of the proxy.
     * Only the admin can call this function.
     * @param newImplementation Address of the new implementation.
     */
    function upgradeTo(address newImplementation) external ifAdmin {
        _upgradeTo(newImplementation);
    }

    /**
     * @dev Upgrade the backing implementation of the proxy and call a function
     * on the new implementation.
     * This is useful to initialize the proxied contract.
     * @param newImplementation Address of the new implementation.
     * @param data Data to send as msg.data in the low level call.
     * It should include the signature and the parameters of the function to be called, as described in
     * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
     */
    function upgradeToAndCall(address newImplementation, bytes calldata data)
        external
        payable
        ifAdmin
    {
        _upgradeTo(newImplementation);
        (bool success, ) = newImplementation.delegatecall(data);
        require(success, "Call on new implementation failed");
    }

    /**
     * @dev Only fall back when the sender is not the admin.
     */
    function _willFallback() internal virtual override {
        require(
            msg.sender != ADMIN,
            "Cannot call fallback function from the proxy admin"
        );
        super._willFallback();
    }
}
          

contracts/protocol/libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.6;

import "./BaseImmutableAdminUpgradeabilityProxy.sol";
import "../../../dependencies/openzeppelin/upgradeability/InitializableUpgradeabilityProxy.sol";

/**
 * @title InitializableAdminUpgradeabilityProxy
 * @dev Extends BaseAdminUpgradeabilityProxy with an initializer function
 */
contract InitializableImmutableAdminUpgradeabilityProxy is
    BaseImmutableAdminUpgradeabilityProxy,
    InitializableUpgradeabilityProxy
{
    constructor(address admin) BaseImmutableAdminUpgradeabilityProxy(admin) {}

    /**
     * @dev Only fall back when the sender is not the admin.
     */
    function _willFallback()
        internal
        override(BaseImmutableAdminUpgradeabilityProxy, Proxy)
    {
        BaseImmutableAdminUpgradeabilityProxy._willFallback();
    }
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"istanbul"}
              

Contract ABI

[{"type":"constructor","inputs":[{"type":"string","name":"marketId","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getAddress","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getEmergencyAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getIncentivesController","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLendingPool","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLendingPoolCollateralManager","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLendingPoolConfigurator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLendingRateOracle","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getMarketId","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getPoolAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getPriceOracle","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAddress","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"},{"type":"address","name":"newAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAddressAsProxy","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"},{"type":"address","name":"implementationAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setEmergencyAdmin","inputs":[{"type":"address","name":"emergencyAdmin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIncentivesController","inputs":[{"type":"address","name":"incentivesController","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLendingPoolCollateralManager","inputs":[{"type":"address","name":"manager","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLendingPoolConfiguratorImpl","inputs":[{"type":"address","name":"configurator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLendingPoolImpl","inputs":[{"type":"address","name":"pool","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLendingRateOracle","inputs":[{"type":"address","name":"lendingRateOracle","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMarketId","inputs":[{"type":"string","name":"marketId","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPoolAdmin","inputs":[{"type":"address","name":"admin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPriceOracle","inputs":[{"type":"address","name":"priceOracle","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"event","name":"AddressSet","inputs":[{"type":"bytes32","name":"id","indexed":false},{"type":"address","name":"newAddress","indexed":true},{"type":"bool","name":"hasProxy","indexed":false}],"anonymous":false},{"type":"event","name":"ConfigurationAdminUpdated","inputs":[{"type":"address","name":"newAddress","indexed":true}],"anonymous":false},{"type":"event","name":"EmergencyAdminUpdated","inputs":[{"type":"address","name":"newAddress","indexed":true}],"anonymous":false},{"type":"event","name":"IncentivesControllerUpdated","inputs":[{"type":"address","name":"newAddress","indexed":true}],"anonymous":false},{"type":"event","name":"LendingPoolCollateralManagerUpdated","inputs":[{"type":"address","name":"newAddress","indexed":true}],"anonymous":false},{"type":"event","name":"LendingPoolConfiguratorUpdated","inputs":[{"type":"address","name":"newAddress","indexed":true}],"anonymous":false},{"type":"event","name":"LendingPoolUpdated","inputs":[{"type":"address","name":"newAddress","indexed":true}],"anonymous":false},{"type":"event","name":"LendingRateOracleUpdated","inputs":[{"type":"address","name":"newAddress","indexed":true}],"anonymous":false},{"type":"event","name":"MarketIdSet","inputs":[{"type":"string","name":"newMarketId","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false},{"type":"event","name":"PriceOracleUpdated","inputs":[{"type":"address","name":"newAddress","indexed":true}],"anonymous":false},{"type":"event","name":"ProxyCreated","inputs":[{"type":"bytes32","name":"id","indexed":false},{"type":"address","name":"newAddress","indexed":true}],"anonymous":false}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b506040516200202d3803806200202d833981810160405260208110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b506040525050506000620000ff6200015b60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000154816200015f565b50620002c0565b3390565b80516200017490600190602084019062000214565b507f5e667c32fd847cf8bce48ab3400175cbf107bdc82b2dea62e3364909dfaee799816040518080602001828103825283818151815260200191508051906020019080838360005b83811015620001d6578181015183820152602001620001bc565b50505050905090810190601f168015620002045780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200024c576000855562000297565b82601f106200026757805160ff191683800117855562000297565b8280016001018555821562000297579182015b82811115620002975782518255916020019190600101906200027a565b50620002a5929150620002a9565b5090565b5b80821115620002a55760008155600101620002aa565b611d5d80620002d06000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806375d26413116100c3578063ca446dd91161007c578063ca446dd91461038b578063ddcaa9ea146103b7578063e655dbd8146103bf578063f2fde38b146103e5578063f67b18471461040b578063fca513a8146104b157610158565b806375d264131461031f578063820d12741461032757806385c858b11461034d5780638da5cb5b14610355578063aecda3781461035d578063c12542df1461036557610158565b8063530e784f11610115578063530e784f1461021a578063568ef470146102405780635aef021f146102bd5780635dcc528c146102e3578063712d91711461030f578063715018a61461031757610158565b80630261bf8b1461015d57806321f8a72114610181578063283d62ad1461019e57806335da3394146101c65780633618abba146101ec578063398e5553146101f4575b600080fd5b6101656104b9565b604080516001600160a01b039092168252519081900360200190f35b6101656004803603602081101561019757600080fd5b50356104d8565b6101c4600480360360208110156101b457600080fd5b50356001600160a01b03166104f3565b005b6101c4600480360360208110156101dc57600080fd5b50356001600160a01b03166105d5565b6101656106bc565b6101c46004803603602081101561020a57600080fd5b50356001600160a01b03166106dd565b6101c46004803603602081101561023057600080fd5b50356001600160a01b03166107c7565b6102486108ab565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028257818101518382015260200161026a565b50505050905090810190601f1680156102af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c4600480360360208110156102d357600080fd5b50356001600160a01b0316610940565b6101c4600480360360408110156102f957600080fd5b50803590602001356001600160a01b03166109f2565b610165610aa5565b6101c4610ac5565b610165610b71565b6101c46004803603602081101561033d57600080fd5b50356001600160a01b0316610b93565b610165610c7e565b610165610ca5565b610165610cb4565b6101c46004803603602081101561037b57600080fd5b50356001600160a01b0316610ccc565b6101c4600480360360408110156103a157600080fd5b50803590602001356001600160a01b0316610d8b565b610165610e56565b6101c4600480360360208110156103d557600080fd5b50356001600160a01b0316610e73565b6101c4600480360360208110156103fb57600080fd5b50356001600160a01b0316610f5f565b6101c46004803603602081101561042157600080fd5b81019060208101813564010000000081111561043c57600080fd5b82018360208201111561044e57600080fd5b8035906020019184600183028401116401000000008311171561047057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611061945050505050565b6101656110cf565b60006104d36b13115391125391d7d413d3d360a21b6104d8565b905090565b6000908152600260205260409020546001600160a01b031690565b6104fb6110e9565b6001600160a01b031661050c610ca5565b6001600160a01b031614610555576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b692827a7a62fa0a226a4a760b11b600090815260026020527f8625fbc469bac10fd11de1d783dcd446542784dbcc535ef64a1da61860fda74c80546001600160a01b0319166001600160a01b03841690811790915560405190917fc20a317155a9e7d84e06b716b4b355d47742ab9f8c5d630e7f556553f582430d91a250565b6105dd6110e9565b6001600160a01b03166105ee610ca5565b6001600160a01b031614610637576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b6e22a6a2a923a2a721acafa0a226a4a760891b600090815260026020527f767aa9c986e1d88108b2558f00fbd21b689a0397581446e2e868cd70421026cc80546001600160a01b0319166001600160a01b03841690811790915560405190917fe19673fc861bfeb894cf2d6b7662505497ef31c0f489b742db24ee331082691691a250565b60006104d3724c454e44494e475f524154455f4f5241434c4560681b6104d8565b6106e56110e9565b6001600160a01b03166106f6610ca5565b6001600160a01b03161461073f576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b7121a7a62620aa22a920a62fa6a0a720a3a2a960711b600090815260026020527f65e3f3080e9127c1765503a54b8dbb495249e66169f096dfc87ee63bed17e22c80546001600160a01b0319166001600160a01b03841690811790915560405190917f991888326f0eab3df6084aadb82bee6781b5c9aa75379e8bc50ae8693454163891a250565b6107cf6110e9565b6001600160a01b03166107e0610ca5565b6001600160a01b031614610829576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b6b50524943455f4f5241434c4560a01b600090815260026020527f740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd6380546001600160a01b0319166001600160a01b03841690811790915560405190917fefe8ab924ca486283a79dc604baa67add51afb82af1db8ac386ebbba643cdffd91a250565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156109365780601f1061090b57610100808354040283529160200191610936565b820191906000526020600020905b81548152906001019060200180831161091957829003601f168201915b5050505050905090565b6109486110e9565b6001600160a01b0316610959610ca5565b6001600160a01b0316146109a2576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b6109bb6b13115391125391d7d413d3d360a21b826110ed565b6040516001600160a01b038216907fc4e6c6cdf28d0edbd8bcf071d724d33cc2e7a30be7d06443925656e9cb492aa490600090a250565b6109fa6110e9565b6001600160a01b0316610a0b610ca5565b6001600160a01b031614610a54576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b610a5e82826110ed565b604080518381526001602082015281516001600160a01b038416927ff2689d5d5cd0c639e137642cae5d40afced201a1a0327e7ac9358461dc9fff31928290030190a25050565b60006104d37121a7a62620aa22a920a62fa6a0a720a3a2a960711b6104d8565b610acd6110e9565b6001600160a01b0316610ade610ca5565b6001600160a01b031614610b27576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60006104d37324a721a2a72a24ab22afa1a7a72a2927a62622a960611b6104d8565b610b9b6110e9565b6001600160a01b0316610bac610ca5565b6001600160a01b031614610bf5576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b724c454e44494e475f524154455f4f5241434c4560681b600090815260026020527f10f0e20294ece4bd93e7a467dbf22ab9ab1740ebd0a532cc53066601e880c0cf80546001600160a01b0319166001600160a01b03841690811790915560405190917f5c29179aba6942020a8a2d38f65de02fb6b7f784e7f049ed3a3cab97621859b591a250565b60006104d3782622a72224a723afa827a7a62fa1a7a72324a3aaa920aa27a960391b6104d8565b6000546001600160a01b031690565b60006104d3692827a7a62fa0a226a4a760b11b6104d8565b610cd46110e9565b6001600160a01b0316610ce5610ca5565b6001600160a01b031614610d2e576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b610d54782622a72224a723afa827a7a62fa1a7a72324a3aaa920aa27a960391b826110ed565b6040516001600160a01b038216907fdfabe479bad36782fb1e77fbfddd4e382671713527e4786cfc93a022ae76372990600090a250565b610d936110e9565b6001600160a01b0316610da4610ca5565b6001600160a01b031614610ded576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b600082815260026020908152604080832080546001600160a01b0319166001600160a01b03861690811790915581518681529283019390935280517ff2689d5d5cd0c639e137642cae5d40afced201a1a0327e7ac9358461dc9fff319281900390910190a25050565b60006104d36e22a6a2a923a2a721acafa0a226a4a760891b6104d8565b610e7b6110e9565b6001600160a01b0316610e8c610ca5565b6001600160a01b031614610ed5576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b7324a721a2a72a24ab22afa1a7a72a2927a62622a960611b600090815260026020527f7ed433551fd4611d998c68af1230e9dab6dacfa96d9b0734bff7f4dddd7903e480546001600160a01b0319166001600160a01b03841690811790915560405190917f403ef00a4bbd70ab05a0358b1a65c9f58c25a689bfdbe212b2fa6e9e6b19b0e091a250565b610f676110e9565b6001600160a01b0316610f78610ca5565b6001600160a01b031614610fc1576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b6001600160a01b0381166110065760405162461bcd60e51b8152600401808060200182810382526026815260200180611ce26026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6110696110e9565b6001600160a01b031661107a610ca5565b6001600160a01b0316146110c3576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b6110cc81611395565b50565b60006104d36b50524943455f4f5241434c4560a01b6104d8565b3390565b6000828152600260209081526040918290205482513060248083019190915284518083039091018152604490910190935290820180516001600160e01b031663189acdbd60e31b1790526001600160a01b0316908190816112bc573060405161115590611445565b6001600160a01b03909116815260405190819003602001906000f080158015611182573d6000803e3d6000fd5b509150816001600160a01b031663d1f5789485836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156111f15781810151838201526020016111d9565b50505050905090810190601f16801561121e5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561123e57600080fd5b505af1158015611252573d6000803e3d6000fd5b50505060008681526002602090815260409182902080546001600160a01b0319166001600160a01b038716908117909155825189815292519093507f1eb35cb4b5bbb23d152f3b4016a5a46c37a07ae930ed0956aba951e2311424389281900390910190a261138e565b816001600160a01b0316634f1ef28685836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611328578181015183820152602001611310565b50505050905090810190601f1680156113555780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561137557600080fd5b505af1158015611389573d6000803e3d6000fd5b505050505b5050505050565b80516113a8906001906020840190611452565b507f5e667c32fd847cf8bce48ab3400175cbf107bdc82b2dea62e3364909dfaee799816040518080602001828103825283818151815260200191508051906020019080838360005b838110156114085781810151838201526020016113f0565b50505050905090810190601f1680156114355780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b6107ee806114f483390190565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261148857600085556114ce565b82601f106114a157805160ff19168380011785556114ce565b828001600101855582156114ce579182015b828111156114ce5782518255916020019190600101906114b3565b506114da9291506114de565b5090565b5b808211156114da57600081556001016114df56fe60a060405234801561001057600080fd5b506040516107ee3803806107ee8339818101604052602081101561003357600080fd5b5051806001600160a01b038116610091576040805162461bcd60e51b815260206004820152601d60248201527f41646d696e2063616e206e6f74206265207a65726f2061646472657373000000604482015290519081900360640190fd5b606081901b6001600160601b0319166080526001600160a01b031690506107106100de6000398061022852806102725280610363528061049052806104b952806105e152506107106000f3fe60806040526004361061004a5760003560e01c80633659cfe6146100545780634f1ef286146100875780635c60da1b14610107578063d1f5789414610138578063f851a440146101ee575b610052610203565b005b34801561006057600080fd5b506100526004803603602081101561007757600080fd5b50356001600160a01b031661021d565b6100526004803603604081101561009d57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100c857600080fd5b8201836020820111156100da57600080fd5b803590602001918460018302840111640100000000831117156100fc57600080fd5b509092509050610267565b34801561011357600080fd5b5061011c610356565b604080516001600160a01b039092168252519081900360200190f35b6100526004803603604081101561014e57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103a3945050505050565b3480156101fa57600080fd5b5061011c610483565b61020b6104dd565b61021b6102166104e5565b61050a565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561025c576102578161052e565b610264565b610264610203565b50565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610349576102a18361052e565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d80600081146102fe576040519150601f19603f3d011682016040523d82523d6000602084013e610303565b606091505b50509050806103435760405162461bcd60e51b815260040180806020018281038252602181526020018061067f6021913960400191505060405180910390fd5b50610351565b610351610203565b505050565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610398576103916104e5565b90506103a0565b6103a0610203565b90565b60006103ad6104e5565b6001600160a01b0316146103c057600080fd5b6103c98261056e565b80511561047f576000826001600160a01b0316826040518082805190602001908083835b6020831061040c5780518252601f1990920191602091820191016103ed565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461046c576040519150601f19603f3d011682016040523d82523d6000602084013e610471565b606091505b505090508061035157600080fd5b5050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561039857507f00000000000000000000000000000000000000000000000000000000000000006103a0565b61021b6105d6565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e808015610529573d6000f35b3d6000fd5b6105378161056e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b61057781610646565b6105b25760405162461bcd60e51b815260040180806020018281038252603b8152602001806106a0603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561063e5760405162461bcd60e51b815260040180806020018281038252603281526020018061064d6032913960400191505060405180910390fd5b61021b61021b565b3b15159056fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616c6c206f6e206e657720696d706c656d656e746174696f6e206661696c656443616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212209c50b5838b1b84381df7b2464c9a76546c7d18cf1c0ec6e3b6b0e91d66b1074664736f6c634300070600334f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122092d9d4f98bd0da2d388b190c468cb3a30662fce93c882cbf90aec09d7450e15a64736f6c634300070600330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001450686961742067656e65736973206d61726b6574000000000000000000000000

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c806375d26413116100c3578063ca446dd91161007c578063ca446dd91461038b578063ddcaa9ea146103b7578063e655dbd8146103bf578063f2fde38b146103e5578063f67b18471461040b578063fca513a8146104b157610158565b806375d264131461031f578063820d12741461032757806385c858b11461034d5780638da5cb5b14610355578063aecda3781461035d578063c12542df1461036557610158565b8063530e784f11610115578063530e784f1461021a578063568ef470146102405780635aef021f146102bd5780635dcc528c146102e3578063712d91711461030f578063715018a61461031757610158565b80630261bf8b1461015d57806321f8a72114610181578063283d62ad1461019e57806335da3394146101c65780633618abba146101ec578063398e5553146101f4575b600080fd5b6101656104b9565b604080516001600160a01b039092168252519081900360200190f35b6101656004803603602081101561019757600080fd5b50356104d8565b6101c4600480360360208110156101b457600080fd5b50356001600160a01b03166104f3565b005b6101c4600480360360208110156101dc57600080fd5b50356001600160a01b03166105d5565b6101656106bc565b6101c46004803603602081101561020a57600080fd5b50356001600160a01b03166106dd565b6101c46004803603602081101561023057600080fd5b50356001600160a01b03166107c7565b6102486108ab565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028257818101518382015260200161026a565b50505050905090810190601f1680156102af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c4600480360360208110156102d357600080fd5b50356001600160a01b0316610940565b6101c4600480360360408110156102f957600080fd5b50803590602001356001600160a01b03166109f2565b610165610aa5565b6101c4610ac5565b610165610b71565b6101c46004803603602081101561033d57600080fd5b50356001600160a01b0316610b93565b610165610c7e565b610165610ca5565b610165610cb4565b6101c46004803603602081101561037b57600080fd5b50356001600160a01b0316610ccc565b6101c4600480360360408110156103a157600080fd5b50803590602001356001600160a01b0316610d8b565b610165610e56565b6101c4600480360360208110156103d557600080fd5b50356001600160a01b0316610e73565b6101c4600480360360208110156103fb57600080fd5b50356001600160a01b0316610f5f565b6101c46004803603602081101561042157600080fd5b81019060208101813564010000000081111561043c57600080fd5b82018360208201111561044e57600080fd5b8035906020019184600183028401116401000000008311171561047057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611061945050505050565b6101656110cf565b60006104d36b13115391125391d7d413d3d360a21b6104d8565b905090565b6000908152600260205260409020546001600160a01b031690565b6104fb6110e9565b6001600160a01b031661050c610ca5565b6001600160a01b031614610555576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b692827a7a62fa0a226a4a760b11b600090815260026020527f8625fbc469bac10fd11de1d783dcd446542784dbcc535ef64a1da61860fda74c80546001600160a01b0319166001600160a01b03841690811790915560405190917fc20a317155a9e7d84e06b716b4b355d47742ab9f8c5d630e7f556553f582430d91a250565b6105dd6110e9565b6001600160a01b03166105ee610ca5565b6001600160a01b031614610637576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b6e22a6a2a923a2a721acafa0a226a4a760891b600090815260026020527f767aa9c986e1d88108b2558f00fbd21b689a0397581446e2e868cd70421026cc80546001600160a01b0319166001600160a01b03841690811790915560405190917fe19673fc861bfeb894cf2d6b7662505497ef31c0f489b742db24ee331082691691a250565b60006104d3724c454e44494e475f524154455f4f5241434c4560681b6104d8565b6106e56110e9565b6001600160a01b03166106f6610ca5565b6001600160a01b03161461073f576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b7121a7a62620aa22a920a62fa6a0a720a3a2a960711b600090815260026020527f65e3f3080e9127c1765503a54b8dbb495249e66169f096dfc87ee63bed17e22c80546001600160a01b0319166001600160a01b03841690811790915560405190917f991888326f0eab3df6084aadb82bee6781b5c9aa75379e8bc50ae8693454163891a250565b6107cf6110e9565b6001600160a01b03166107e0610ca5565b6001600160a01b031614610829576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b6b50524943455f4f5241434c4560a01b600090815260026020527f740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd6380546001600160a01b0319166001600160a01b03841690811790915560405190917fefe8ab924ca486283a79dc604baa67add51afb82af1db8ac386ebbba643cdffd91a250565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156109365780601f1061090b57610100808354040283529160200191610936565b820191906000526020600020905b81548152906001019060200180831161091957829003601f168201915b5050505050905090565b6109486110e9565b6001600160a01b0316610959610ca5565b6001600160a01b0316146109a2576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b6109bb6b13115391125391d7d413d3d360a21b826110ed565b6040516001600160a01b038216907fc4e6c6cdf28d0edbd8bcf071d724d33cc2e7a30be7d06443925656e9cb492aa490600090a250565b6109fa6110e9565b6001600160a01b0316610a0b610ca5565b6001600160a01b031614610a54576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b610a5e82826110ed565b604080518381526001602082015281516001600160a01b038416927ff2689d5d5cd0c639e137642cae5d40afced201a1a0327e7ac9358461dc9fff31928290030190a25050565b60006104d37121a7a62620aa22a920a62fa6a0a720a3a2a960711b6104d8565b610acd6110e9565b6001600160a01b0316610ade610ca5565b6001600160a01b031614610b27576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60006104d37324a721a2a72a24ab22afa1a7a72a2927a62622a960611b6104d8565b610b9b6110e9565b6001600160a01b0316610bac610ca5565b6001600160a01b031614610bf5576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b724c454e44494e475f524154455f4f5241434c4560681b600090815260026020527f10f0e20294ece4bd93e7a467dbf22ab9ab1740ebd0a532cc53066601e880c0cf80546001600160a01b0319166001600160a01b03841690811790915560405190917f5c29179aba6942020a8a2d38f65de02fb6b7f784e7f049ed3a3cab97621859b591a250565b60006104d3782622a72224a723afa827a7a62fa1a7a72324a3aaa920aa27a960391b6104d8565b6000546001600160a01b031690565b60006104d3692827a7a62fa0a226a4a760b11b6104d8565b610cd46110e9565b6001600160a01b0316610ce5610ca5565b6001600160a01b031614610d2e576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b610d54782622a72224a723afa827a7a62fa1a7a72324a3aaa920aa27a960391b826110ed565b6040516001600160a01b038216907fdfabe479bad36782fb1e77fbfddd4e382671713527e4786cfc93a022ae76372990600090a250565b610d936110e9565b6001600160a01b0316610da4610ca5565b6001600160a01b031614610ded576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b600082815260026020908152604080832080546001600160a01b0319166001600160a01b03861690811790915581518681529283019390935280517ff2689d5d5cd0c639e137642cae5d40afced201a1a0327e7ac9358461dc9fff319281900390910190a25050565b60006104d36e22a6a2a923a2a721acafa0a226a4a760891b6104d8565b610e7b6110e9565b6001600160a01b0316610e8c610ca5565b6001600160a01b031614610ed5576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b7324a721a2a72a24ab22afa1a7a72a2927a62622a960611b600090815260026020527f7ed433551fd4611d998c68af1230e9dab6dacfa96d9b0734bff7f4dddd7903e480546001600160a01b0319166001600160a01b03841690811790915560405190917f403ef00a4bbd70ab05a0358b1a65c9f58c25a689bfdbe212b2fa6e9e6b19b0e091a250565b610f676110e9565b6001600160a01b0316610f78610ca5565b6001600160a01b031614610fc1576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b6001600160a01b0381166110065760405162461bcd60e51b8152600401808060200182810382526026815260200180611ce26026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6110696110e9565b6001600160a01b031661107a610ca5565b6001600160a01b0316146110c3576040805162461bcd60e51b81526020600482018190526024820152600080516020611d08833981519152604482015290519081900360640190fd5b6110cc81611395565b50565b60006104d36b50524943455f4f5241434c4560a01b6104d8565b3390565b6000828152600260209081526040918290205482513060248083019190915284518083039091018152604490910190935290820180516001600160e01b031663189acdbd60e31b1790526001600160a01b0316908190816112bc573060405161115590611445565b6001600160a01b03909116815260405190819003602001906000f080158015611182573d6000803e3d6000fd5b509150816001600160a01b031663d1f5789485836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156111f15781810151838201526020016111d9565b50505050905090810190601f16801561121e5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561123e57600080fd5b505af1158015611252573d6000803e3d6000fd5b50505060008681526002602090815260409182902080546001600160a01b0319166001600160a01b038716908117909155825189815292519093507f1eb35cb4b5bbb23d152f3b4016a5a46c37a07ae930ed0956aba951e2311424389281900390910190a261138e565b816001600160a01b0316634f1ef28685836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611328578181015183820152602001611310565b50505050905090810190601f1680156113555780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561137557600080fd5b505af1158015611389573d6000803e3d6000fd5b505050505b5050505050565b80516113a8906001906020840190611452565b507f5e667c32fd847cf8bce48ab3400175cbf107bdc82b2dea62e3364909dfaee799816040518080602001828103825283818151815260200191508051906020019080838360005b838110156114085781810151838201526020016113f0565b50505050905090810190601f1680156114355780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b6107ee806114f483390190565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261148857600085556114ce565b82601f106114a157805160ff19168380011785556114ce565b828001600101855582156114ce579182015b828111156114ce5782518255916020019190600101906114b3565b506114da9291506114de565b5090565b5b808211156114da57600081556001016114df56fe60a060405234801561001057600080fd5b506040516107ee3803806107ee8339818101604052602081101561003357600080fd5b5051806001600160a01b038116610091576040805162461bcd60e51b815260206004820152601d60248201527f41646d696e2063616e206e6f74206265207a65726f2061646472657373000000604482015290519081900360640190fd5b606081901b6001600160601b0319166080526001600160a01b031690506107106100de6000398061022852806102725280610363528061049052806104b952806105e152506107106000f3fe60806040526004361061004a5760003560e01c80633659cfe6146100545780634f1ef286146100875780635c60da1b14610107578063d1f5789414610138578063f851a440146101ee575b610052610203565b005b34801561006057600080fd5b506100526004803603602081101561007757600080fd5b50356001600160a01b031661021d565b6100526004803603604081101561009d57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100c857600080fd5b8201836020820111156100da57600080fd5b803590602001918460018302840111640100000000831117156100fc57600080fd5b509092509050610267565b34801561011357600080fd5b5061011c610356565b604080516001600160a01b039092168252519081900360200190f35b6100526004803603604081101561014e57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103a3945050505050565b3480156101fa57600080fd5b5061011c610483565b61020b6104dd565b61021b6102166104e5565b61050a565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561025c576102578161052e565b610264565b610264610203565b50565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610349576102a18361052e565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d80600081146102fe576040519150601f19603f3d011682016040523d82523d6000602084013e610303565b606091505b50509050806103435760405162461bcd60e51b815260040180806020018281038252602181526020018061067f6021913960400191505060405180910390fd5b50610351565b610351610203565b505050565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610398576103916104e5565b90506103a0565b6103a0610203565b90565b60006103ad6104e5565b6001600160a01b0316146103c057600080fd5b6103c98261056e565b80511561047f576000826001600160a01b0316826040518082805190602001908083835b6020831061040c5780518252601f1990920191602091820191016103ed565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461046c576040519150601f19603f3d011682016040523d82523d6000602084013e610471565b606091505b505090508061035157600080fd5b5050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561039857507f00000000000000000000000000000000000000000000000000000000000000006103a0565b61021b6105d6565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e808015610529573d6000f35b3d6000fd5b6105378161056e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b61057781610646565b6105b25760405162461bcd60e51b815260040180806020018281038252603b8152602001806106a0603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561063e5760405162461bcd60e51b815260040180806020018281038252603281526020018061064d6032913960400191505060405180910390fd5b61021b61021b565b3b15159056fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616c6c206f6e206e657720696d706c656d656e746174696f6e206661696c656443616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212209c50b5838b1b84381df7b2464c9a76546c7d18cf1c0ec6e3b6b0e91d66b1074664736f6c634300070600334f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122092d9d4f98bd0da2d388b190c468cb3a30662fce93c882cbf90aec09d7450e15a64736f6c63430007060033