ETH Price: $3,035.12 (-6.79%)

Contract

0xEcE3EE44388d4957782445a90290ba41CA3e32c0
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
0x608060401010537032023-05-24 12:38:56325 days ago1684931936IN
 Create: FeeProvider
0 ETH0.000001350.001

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
1075578842023-07-30 10:55:45258 days ago1690714545
0xEcE3EE44...1CA3e32c0
0 ETH
1075578572023-07-30 10:54:51258 days ago1690714491
0xEcE3EE44...1CA3e32c0
0 ETH
1075578572023-07-30 10:54:51258 days ago1690714491
0xEcE3EE44...1CA3e32c0
0 ETH
1075578152023-07-30 10:53:27258 days ago1690714407
0xEcE3EE44...1CA3e32c0
0 ETH
1075577942023-07-30 10:52:45258 days ago1690714365
0xEcE3EE44...1CA3e32c0
0 ETH
1075574512023-07-30 10:41:19258 days ago1690713679
0xEcE3EE44...1CA3e32c0
0 ETH
1075555112023-07-30 9:36:39258 days ago1690709799
0xEcE3EE44...1CA3e32c0
0 ETH
1075531582023-07-30 8:18:13258 days ago1690705093
0xEcE3EE44...1CA3e32c0
0 ETH
1075528332023-07-30 8:07:23258 days ago1690704443
0xEcE3EE44...1CA3e32c0
0 ETH
1075519602023-07-30 7:38:17258 days ago1690702697
0xEcE3EE44...1CA3e32c0
0 ETH
1075510662023-07-30 7:08:29258 days ago1690700909
0xEcE3EE44...1CA3e32c0
0 ETH
1075449812023-07-30 3:45:39259 days ago1690688739
0xEcE3EE44...1CA3e32c0
0 ETH
1075449442023-07-30 3:44:25259 days ago1690688665
0xEcE3EE44...1CA3e32c0
0 ETH
1075432082023-07-30 2:46:33259 days ago1690685193
0xEcE3EE44...1CA3e32c0
0 ETH
1075431862023-07-30 2:45:49259 days ago1690685149
0xEcE3EE44...1CA3e32c0
0 ETH
1075431302023-07-30 2:43:57259 days ago1690685037
0xEcE3EE44...1CA3e32c0
0 ETH
1075360262023-07-29 22:47:09259 days ago1690670829
0xEcE3EE44...1CA3e32c0
0 ETH
1075297832023-07-29 19:19:03259 days ago1690658343
0xEcE3EE44...1CA3e32c0
0 ETH
1075297522023-07-29 19:18:01259 days ago1690658281
0xEcE3EE44...1CA3e32c0
0 ETH
1075296832023-07-29 19:15:43259 days ago1690658143
0xEcE3EE44...1CA3e32c0
0 ETH
1075296832023-07-29 19:15:43259 days ago1690658143
0xEcE3EE44...1CA3e32c0
0 ETH
1075296652023-07-29 19:15:07259 days ago1690658107
0xEcE3EE44...1CA3e32c0
0 ETH
1075296102023-07-29 19:13:17259 days ago1690657997
0xEcE3EE44...1CA3e32c0
0 ETH
1075292442023-07-29 19:01:05259 days ago1690657265
0xEcE3EE44...1CA3e32c0
0 ETH
1075287152023-07-29 18:43:27259 days ago1690656207
0xEcE3EE44...1CA3e32c0
0 ETH
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FeeProvider

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 14 : FeeProvider.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

import "./dependencies/openzeppelin/proxy/utils/Initializable.sol";
import "./storage/FeeProviderStorage.sol";
import "./lib/WadRayMath.sol";

error SenderIsNotGovernor();
error PoolRegistryIsNull();
error NewValueIsSameAsCurrent();
error FeeIsGreaterThanTheMax();
error TierDiscountTooHigh();
error TiersNotOrderedByMin();

/**
 * @title FeeProvider contract
 */
contract FeeProvider is Initializable, FeeProviderStorageV1 {
    using WadRayMath for uint256;

    string public constant VERSION = "1.2.0";

    uint256 internal constant MAX_FEE_VALUE = 0.25e18; // 25%
    uint256 internal constant MAX_FEE_DISCOUNT = 1e18; // 100%

    /// @notice Emitted when deposit fee is updated
    event DepositFeeUpdated(uint256 oldDepositFee, uint256 newDepositFee);

    /// @notice Emitted when issue fee is updated
    event IssueFeeUpdated(uint256 oldIssueFee, uint256 newIssueFee);

    /// @notice Emitted when liquidator incentive is updated
    event LiquidatorIncentiveUpdated(uint256 oldLiquidatorIncentive, uint256 newLiquidatorIncentive);

    /// @notice Emitted when protocol liquidation fee is updated
    event ProtocolLiquidationFeeUpdated(uint256 oldProtocolLiquidationFee, uint256 newProtocolLiquidationFee);

    /// @notice Emitted when repay fee is updated
    event RepayFeeUpdated(uint256 oldRepayFee, uint256 newRepayFee);

    /// @notice Emitted when swap fee is updated
    event SwapDefaultFeeUpdated(uint256 oldSwapFee, uint256 newSwapFee);

    /// @notice Emitted when tiers are updated
    event TiersUpdated(Tier[] oldTiers, Tier[] newTiers);

    /// @notice Emitted when withdraw fee is updated
    event WithdrawFeeUpdated(uint256 oldWithdrawFee, uint256 newWithdrawFee);

    /**
     * @notice Throws if caller isn't the governor
     */
    modifier onlyGovernor() {
        if (msg.sender != poolRegistry.governor()) revert SenderIsNotGovernor();
        _;
    }

    function initialize(IPoolRegistry poolRegistry_, IESMET esMET_) public initializer {
        if (address(poolRegistry_) == address(0)) revert PoolRegistryIsNull();

        poolRegistry = poolRegistry_;
        esMET = esMET_;

        liquidationFees = LiquidationFees({
            liquidatorIncentive: 1e17, // 10%
            protocolFee: 8e16 // 8%
        });
        defaultSwapFee = 25e14; // 0.25%
    }

    /**
     * @notice Get fee discount tiers
     */
    function getTiers() external view returns (Tier[] memory _tiers) {
        return tiers;
    }

    /**
     * @notice Get the swap fee for a given account
     * Fee discount are applied on top of the default swap fee depending on user's esMET balance
     * @param account_ The account address
     * @return _swapFee The account's swap fee
     */
    function swapFeeFor(address account_) external view override returns (uint256 _swapFee) {
        uint256 _len = tiers.length;

        if (_len == 0) {
            return defaultSwapFee;
        }

        uint256 _balance = esMET.balanceOf(account_);

        if (_balance < tiers[0].min) {
            return defaultSwapFee;
        }

        uint256 i = 1;
        while (i < _len) {
            if (_balance < tiers[i].min) {
                unchecked {
                    // Note: `discount` is always <= `1e18`
                    return defaultSwapFee.wadMul(1e18 - tiers[i - 1].discount);
                }
            }

            unchecked {
                ++i;
            }
        }

        unchecked {
            // Note: `discount` is always <= `1e18`
            return defaultSwapFee.wadMul(1e18 - tiers[_len - 1].discount);
        }
    }

    /**
     * @notice Update deposit fee
     */
    function updateDepositFee(uint256 newDepositFee_) external onlyGovernor {
        if (newDepositFee_ > MAX_FEE_VALUE) revert FeeIsGreaterThanTheMax();
        uint256 _currentDepositFee = depositFee;
        if (newDepositFee_ == _currentDepositFee) revert NewValueIsSameAsCurrent();
        emit DepositFeeUpdated(_currentDepositFee, newDepositFee_);
        depositFee = newDepositFee_;
    }

    /**
     * @notice Update issue fee
     */
    function updateIssueFee(uint256 newIssueFee_) external onlyGovernor {
        if (newIssueFee_ > MAX_FEE_VALUE) revert FeeIsGreaterThanTheMax();
        uint256 _currentIssueFee = issueFee;
        if (newIssueFee_ == _currentIssueFee) revert NewValueIsSameAsCurrent();
        emit IssueFeeUpdated(_currentIssueFee, newIssueFee_);
        issueFee = newIssueFee_;
    }

    /**
     * @notice Update liquidator incentive
     * @dev liquidatorIncentive + protocolFee can't surpass max
     */
    function updateLiquidatorIncentive(uint128 newLiquidatorIncentive_) external onlyGovernor {
        LiquidationFees memory _current = liquidationFees;
        if (newLiquidatorIncentive_ + _current.protocolFee > MAX_FEE_VALUE) revert FeeIsGreaterThanTheMax();
        if (newLiquidatorIncentive_ == _current.liquidatorIncentive) revert NewValueIsSameAsCurrent();
        emit LiquidatorIncentiveUpdated(_current.liquidatorIncentive, newLiquidatorIncentive_);
        liquidationFees.liquidatorIncentive = newLiquidatorIncentive_;
    }

    /**
     * @notice Update protocol liquidation fee
     * @dev liquidatorIncentive + protocolFee can't surpass max
     */
    function updateProtocolLiquidationFee(uint128 newProtocolLiquidationFee_) external onlyGovernor {
        LiquidationFees memory _current = liquidationFees;
        if (newProtocolLiquidationFee_ + _current.liquidatorIncentive > MAX_FEE_VALUE) revert FeeIsGreaterThanTheMax();
        if (newProtocolLiquidationFee_ == _current.protocolFee) revert NewValueIsSameAsCurrent();
        emit ProtocolLiquidationFeeUpdated(_current.protocolFee, newProtocolLiquidationFee_);
        liquidationFees.protocolFee = newProtocolLiquidationFee_;
    }

    /**
     * @notice Update repay fee
     */
    function updateRepayFee(uint256 newRepayFee_) external onlyGovernor {
        if (newRepayFee_ > MAX_FEE_VALUE) revert FeeIsGreaterThanTheMax();
        uint256 _currentRepayFee = repayFee;
        if (newRepayFee_ == _currentRepayFee) revert NewValueIsSameAsCurrent();
        emit RepayFeeUpdated(_currentRepayFee, newRepayFee_);
        repayFee = newRepayFee_;
    }

    /**
     * @notice Update swap fee
     */
    function updateDefaultSwapFee(uint256 newDefaultSwapFee_) external onlyGovernor {
        if (newDefaultSwapFee_ > MAX_FEE_VALUE) revert FeeIsGreaterThanTheMax();
        uint256 _current = defaultSwapFee;
        if (newDefaultSwapFee_ == _current) revert NewValueIsSameAsCurrent();
        emit SwapDefaultFeeUpdated(_current, newDefaultSwapFee_);
        defaultSwapFee = newDefaultSwapFee_;
    }

    /**
     * @notice Update fee discount tiers
     */
    function updateTiers(Tier[] memory tiers_) external onlyGovernor {
        emit TiersUpdated(tiers, tiers_);
        delete tiers;

        uint256 _len = tiers_.length;
        for (uint256 i; i < _len; ++i) {
            Tier memory _tier = tiers_[i];
            if (_tier.discount > MAX_FEE_DISCOUNT) revert TierDiscountTooHigh();
            if (i > 0 && tiers_[i - 1].min > _tier.min) revert TiersNotOrderedByMin();
            tiers.push(_tier);
        }
    }

    /**
     * @notice Update withdraw fee
     */
    function updateWithdrawFee(uint256 newWithdrawFee_) external onlyGovernor {
        if (newWithdrawFee_ > MAX_FEE_VALUE) revert FeeIsGreaterThanTheMax();
        uint256 _currentWithdrawFee = withdrawFee;
        if (newWithdrawFee_ == _currentWithdrawFee) revert NewValueIsSameAsCurrent();
        emit WithdrawFeeUpdated(_currentWithdrawFee, newWithdrawFee_);
        withdrawFee = newWithdrawFee_;
    }
}

File 2 of 14 : Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

File 3 of 14 : IERC20.sol
// 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);
}

File 4 of 14 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 5 of 14 : IDebtToken.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

import "../dependencies/openzeppelin/token/ERC20/extensions/IERC20Metadata.sol";
import "./ISyntheticToken.sol";

interface IDebtToken is IERC20Metadata {
    function lastTimestampAccrued() external view returns (uint256);

    function isActive() external view returns (bool);

    function syntheticToken() external view returns (ISyntheticToken);

    function accrueInterest() external;

    function debtIndex() external returns (uint256 debtIndex_);

    function burn(address from_, uint256 amount_) external;

    function issue(uint256 amount_, address to_) external returns (uint256 _issued, uint256 _fee);

    function flashIssue(address borrower_, uint256 amount_) external returns (uint256 _issued, uint256 _fee);

    function repay(address onBehalfOf_, uint256 amount_) external returns (uint256 _repaid, uint256 _fee);

    function repayAll(address onBehalfOf_) external returns (uint256 _repaid, uint256 _fee);

    function quoteIssueIn(uint256 amountToIssue_) external view returns (uint256 _amount, uint256 _fee);

    function quoteIssueOut(uint256 amount_) external view returns (uint256 _amountToIssue, uint256 _fee);

    function quoteRepayIn(uint256 amountToRepay_) external view returns (uint256 _amount, uint256 _fee);

    function quoteRepayOut(uint256 amount_) external view returns (uint256 _amountToRepay, uint256 _fee);

    function updateMaxTotalSupply(uint256 newMaxTotalSupply_) external;

    function updateInterestRate(uint256 newInterestRate_) external;

    function maxTotalSupply() external view returns (uint256);

    function interestRate() external view returns (uint256);

    function interestRatePerSecond() external view returns (uint256);

    function toggleIsActive() external;
}

File 6 of 14 : IFeeProvider.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

/**
 * @notice FeeProvider interface
 */
interface IFeeProvider {
    struct LiquidationFees {
        uint128 liquidatorIncentive;
        uint128 protocolFee;
    }

    function defaultSwapFee() external view returns (uint256);

    function depositFee() external view returns (uint256);

    function issueFee() external view returns (uint256);

    function liquidationFees() external view returns (uint128 liquidatorIncentive, uint128 protocolFee);

    function repayFee() external view returns (uint256);

    function swapFeeFor(address account_) external view returns (uint256);

    function withdrawFee() external view returns (uint256);
}

File 7 of 14 : IGovernable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

/**
 * @notice Governable interface
 */
interface IGovernable {
    function governor() external view returns (address _governor);

    function transferGovernorship(address _proposedGovernor) external;
}

File 8 of 14 : IPauseable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

interface IPauseable {
    function paused() external view returns (bool);

    function everythingStopped() external view returns (bool);
}

File 9 of 14 : IPoolRegistry.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

import "./external/IMasterOracle.sol";
import "./IPauseable.sol";
import "./IGovernable.sol";
import "./ISyntheticToken.sol";

interface IPoolRegistry is IPauseable, IGovernable {
    function isPoolRegistered(address pool_) external view returns (bool);

    function feeCollector() external view returns (address);

    function nativeTokenGateway() external view returns (address);

    function getPools() external view returns (address[] memory);

    function registerPool(address pool_) external;

    function unregisterPool(address pool_) external;

    function masterOracle() external view returns (IMasterOracle);

    function updateMasterOracle(IMasterOracle newOracle_) external;

    function updateFeeCollector(address newFeeCollector_) external;

    function updateNativeTokenGateway(address newGateway_) external;

    function idOfPool(address pool_) external view returns (uint256);

    function nextPoolId() external view returns (uint256);
}

File 10 of 14 : ISyntheticToken.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

import "../dependencies/openzeppelin/token/ERC20/extensions/IERC20Metadata.sol";
import "./IDebtToken.sol";
import "./IPoolRegistry.sol";

interface ISyntheticToken is IERC20Metadata {
    function isActive() external view returns (bool);

    function mint(address to_, uint256 amount_) external;

    function burn(address from_, uint256 amount) external;

    function poolRegistry() external returns (IPoolRegistry);

    function toggleIsActive() external;

    function seize(address from_, address to_, uint256 amount_) external;

    function updateMaxTotalSupply(uint256 newMaxTotalSupply_) external;

    function maxTotalSupply() external view returns (uint256);
}

File 11 of 14 : IESMET.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

interface IESMET {
    function balanceOf(address account_) external view returns (uint256);

    function lock(uint256 amount_, uint256 lockPeriod_) external;
}

File 12 of 14 : IMasterOracle.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

interface IMasterOracle {
    function quoteTokenToUsd(address _asset, uint256 _amount) external view returns (uint256 _amountInUsd);

    function quoteUsdToToken(address _asset, uint256 _amountInUsd) external view returns (uint256 _amount);

    function quote(address _assetIn, address _assetOut, uint256 _amountIn) external view returns (uint256 _amountOut);
}

File 13 of 14 : WadRayMath.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

/**
 * @title Math library
 * @dev Provides mul and div function for wads (decimal numbers with 18 digits precision) and rays (decimals with 27 digits)
 * @dev Based on https://github.com/dapphub/ds-math/blob/master/src/math.sol
 */
library WadRayMath {
    uint256 internal constant WAD = 1e18;
    uint256 internal constant HALF_WAD = WAD / 2;

    uint256 internal constant RAY = 1e27;
    uint256 internal constant HALF_RAY = RAY / 2;

    uint256 internal constant WAD_RAY_RATIO = 1e9;

    /**
     * @dev Multiplies two wad, rounding half up to the nearest wad
     * @param a Wad
     * @param b Wad
     * @return The result of a*b, in wad
     */
    function wadMul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0 || b == 0) {
            return 0;
        }

        return (a * b + HALF_WAD) / WAD;
    }

    /**
     * @dev Divides two wad, rounding half up to the nearest wad
     * @param a Wad
     * @param b Wad
     * @return The result of a/b, in wad
     */
    function wadDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return (a * WAD + b / 2) / b;
    }
}

File 14 of 14 : FeeProviderStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

import "../interfaces/IFeeProvider.sol";
import "../interfaces/IPoolRegistry.sol";
import "../interfaces/external/IESMET.sol";

abstract contract FeeProviderStorageV1 is IFeeProvider {
    struct Tier {
        uint128 min; // esMET min balance needed to be eligible for `discount`
        uint128 discount; // discount in percentage to apply. Use 18 decimals (e.g. 1e16 = 1%)
    }

    /**
     * @notice The fee discount tiers
     */
    Tier[] public tiers;

    /**
     * @notice The default fee charged when swapping synthetic tokens
     * @dev Use 18 decimals (e.g. 1e16 = 1%)
     */
    uint256 public override defaultSwapFee;

    /**
     * @notice The fee charged when depositing collateral
     * @dev Use 18 decimals (e.g. 1e16 = 1%)
     */
    uint256 public override depositFee;

    /**
     * @notice The fee charged when minting a synthetic token
     * @dev Use 18 decimals (e.g. 1e16 = 1%)
     */
    uint256 public override issueFee;

    /**
     * @notice The fee charged when withdrawing collateral
     * @dev Use 18 decimals (e.g. 1e16 = 1%)
     */
    uint256 public override withdrawFee;

    /**
     * @notice The fee charged when repaying debt
     * @dev Use 18 decimals (e.g. 1e16 = 1%)
     */
    uint256 public override repayFee;

    /**
     * @notice The fees charged when liquidating a position
     * @dev Use 18 decimals (e.g. 1e16 = 1%)
     */
    LiquidationFees public override liquidationFees;

    /**
     * @dev The Pool Registry
     */
    IPoolRegistry public poolRegistry;

    /**
     * @notice The esMET contract
     */
    IESMET public esMET;
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"FeeIsGreaterThanTheMax","type":"error"},{"inputs":[],"name":"NewValueIsSameAsCurrent","type":"error"},{"inputs":[],"name":"PoolRegistryIsNull","type":"error"},{"inputs":[],"name":"SenderIsNotGovernor","type":"error"},{"inputs":[],"name":"TierDiscountTooHigh","type":"error"},{"inputs":[],"name":"TiersNotOrderedByMin","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldDepositFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDepositFee","type":"uint256"}],"name":"DepositFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldIssueFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newIssueFee","type":"uint256"}],"name":"IssueFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldLiquidatorIncentive","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLiquidatorIncentive","type":"uint256"}],"name":"LiquidatorIncentiveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldProtocolLiquidationFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newProtocolLiquidationFee","type":"uint256"}],"name":"ProtocolLiquidationFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldRepayFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRepayFee","type":"uint256"}],"name":"RepayFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldSwapFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSwapFee","type":"uint256"}],"name":"SwapDefaultFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint128","name":"min","type":"uint128"},{"internalType":"uint128","name":"discount","type":"uint128"}],"indexed":false,"internalType":"struct FeeProviderStorageV1.Tier[]","name":"oldTiers","type":"tuple[]"},{"components":[{"internalType":"uint128","name":"min","type":"uint128"},{"internalType":"uint128","name":"discount","type":"uint128"}],"indexed":false,"internalType":"struct FeeProviderStorageV1.Tier[]","name":"newTiers","type":"tuple[]"}],"name":"TiersUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldWithdrawFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWithdrawFee","type":"uint256"}],"name":"WithdrawFeeUpdated","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"esMET","outputs":[{"internalType":"contract IESMET","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTiers","outputs":[{"components":[{"internalType":"uint128","name":"min","type":"uint128"},{"internalType":"uint128","name":"discount","type":"uint128"}],"internalType":"struct FeeProviderStorageV1.Tier[]","name":"_tiers","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IPoolRegistry","name":"poolRegistry_","type":"address"},{"internalType":"contract IESMET","name":"esMET_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"issueFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidationFees","outputs":[{"internalType":"uint128","name":"liquidatorIncentive","type":"uint128"},{"internalType":"uint128","name":"protocolFee","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolRegistry","outputs":[{"internalType":"contract IPoolRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repayFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"swapFeeFor","outputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tiers","outputs":[{"internalType":"uint128","name":"min","type":"uint128"},{"internalType":"uint128","name":"discount","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDefaultSwapFee_","type":"uint256"}],"name":"updateDefaultSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDepositFee_","type":"uint256"}],"name":"updateDepositFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newIssueFee_","type":"uint256"}],"name":"updateIssueFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newLiquidatorIncentive_","type":"uint128"}],"name":"updateLiquidatorIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newProtocolLiquidationFee_","type":"uint128"}],"name":"updateProtocolLiquidationFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRepayFee_","type":"uint256"}],"name":"updateRepayFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint128","name":"min","type":"uint128"},{"internalType":"uint128","name":"discount","type":"uint128"}],"internalType":"struct FeeProviderStorageV1.Tier[]","name":"tiers_","type":"tuple[]"}],"name":"updateTiers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWithdrawFee_","type":"uint256"}],"name":"updateWithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b5061179d806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80637c0f59f4116100b8578063cfc0c69f1161007c578063cfc0c69f1461027e578063d2d6b5a31461029c578063daf635de146102af578063de170570146102c2578063e941fa78146102d7578063ffa1ad74146102e057600080fd5b80637c0f59f41461022957806388156a351461023257806388c2c07f14610245578063a8ffba6414610258578063afcff50f1461026b57600080fd5b806336407921116100ff57806336407921146101d4578063485cc955146101e757806357f2e581146101fa5780635cd24fd21461020d57806367a527931461022057600080fd5b8063017def571461013c578063039af9eb1461015157806303df739614610189578063285a7674146101a05780632a9133c1146101cb575b600080fd5b61014f61014a366004611320565b610311565b005b61016461015f366004611320565b610454565b604080516001600160801b039384168152929091166020830152015b60405180910390f35b61019260025481565b604051908152602001610180565b6009546101b3906001600160a01b031681565b6040516001600160a01b039091168152602001610180565b61019260045481565b61014f6101e23660046113c5565b610489565b61014f6101f53660046114b6565b6106b6565b61014f610208366004611320565b610810565b61014f61021b3660046114ef565b610953565b61019260035481565b61019260065481565b61014f610240366004611320565b610b18565b61014f610253366004611320565b610c5b565b61014f6102663660046114ef565b610d9e565b6008546101b3906001600160a01b031681565b600754610164906001600160801b0380821691600160801b90041682565b6101926102aa36600461150a565b610f5b565b61014f6102bd366004611320565b6110d8565b6102ca61121b565b6040516101809190611581565b61019260055481565b610304604051806040016040528060058152602001640312e322e360dc1b81525081565b6040516101809190611594565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561035f57600080fd5b505afa158015610373573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039791906115e9565b6001600160a01b0316336001600160a01b0316146103c857604051634b98449160e11b815260040160405180910390fd5b6703782dace9d900008111156103f1576040516361b716bb60e11b815260040160405180910390fd5b6003548181141561041557604051630333a68160e41b815260040160405180910390fd5b60408051828152602081018490527f828cf983933545af35b9ba46eec951db1cb4c5433c3ec403aeced2963c264790910160405180910390a150600355565b6001818154811061046457600080fd5b6000918252602090912001546001600160801b038082169250600160801b9091041682565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156104d757600080fd5b505afa1580156104eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050f91906115e9565b6001600160a01b0316336001600160a01b03161461054057604051634b98449160e11b815260040160405180910390fd5b7f69e7d03bdd0009aaf816649f3df4329250186771260691fa1b13bae6419ead54600182604051610572929190611606565b60405180910390a1610586600160006112e6565b805160005b818110156106b15760008382815181106105a7576105a761166c565b60200260200101519050670de0b6b3a764000081602001516001600160801b031611156105e7576040516350e630a760e01b815260040160405180910390fd5b600082118015610630575080516001600160801b031684610609600185611698565b815181106106195761061961166c565b6020026020010151600001516001600160801b0316115b1561064e576040516344eff01160e11b815260040160405180910390fd5b60018054808201825560009190915281516020909201516001600160801b03908116600160801b029216919091177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6909101556106aa816116af565b905061058b565b505050565b600054610100900460ff16806106cf575060005460ff16155b6107365760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015610758576000805461ffff19166101011790555b6001600160a01b03831661077f57604051637cb62f2b60e11b815260040160405180910390fd5b600880546001600160a01b038086166001600160a01b03199283161790925560098054928516929091169190911790556040805180820190915267016345785d8a0000815267011c37937e08000060209091015277011c37937e0800000000000000000000016345785d8a00006007556608e1bc9bf0400060025580156106b1576000805461ff0019169055505050565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561085e57600080fd5b505afa158015610872573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089691906115e9565b6001600160a01b0316336001600160a01b0316146108c757604051634b98449160e11b815260040160405180910390fd5b6703782dace9d900008111156108f0576040516361b716bb60e11b815260040160405180910390fd5b6004548181141561091457604051630333a68160e41b815260040160405180910390fd5b60408051828152602081018490527f7aef17a0caeda11810cdf2a40c79ac1340553588671fb35d5cc8d0a3fe2883be910160405180910390a150600455565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156109a157600080fd5b505afa1580156109b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d991906115e9565b6001600160a01b0316336001600160a01b031614610a0a57604051634b98449160e11b815260040160405180910390fd5b604080518082019091526007546001600160801b03808216808452600160801b9092041660208301526703782dace9d9000090610a4790846116ca565b6001600160801b03161115610a6f576040516361b716bb60e11b815260040160405180910390fd5b80602001516001600160801b0316826001600160801b03161415610aa657604051630333a68160e41b815260040160405180910390fd5b7fe0dac1dcc46eceed1fdb7416944e7161273637fb346a67d6f0fce8de3e952f2f816020015183604051610af09291906001600160801b0392831681529116602082015260400190565b60405180910390a150600780546001600160801b03928316600160801b029216919091179055565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6657600080fd5b505afa158015610b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9e91906115e9565b6001600160a01b0316336001600160a01b031614610bcf57604051634b98449160e11b815260040160405180910390fd5b6703782dace9d90000811115610bf8576040516361b716bb60e11b815260040160405180910390fd5b60065481811415610c1c57604051630333a68160e41b815260040160405180910390fd5b60408051828152602081018490527fdd45ca427fa57d0870314eb55586e91bcdd31d7cd393e3278caaae9dfb749688910160405180910390a150600655565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610ca957600080fd5b505afa158015610cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce191906115e9565b6001600160a01b0316336001600160a01b031614610d1257604051634b98449160e11b815260040160405180910390fd5b6703782dace9d90000811115610d3b576040516361b716bb60e11b815260040160405180910390fd5b60025481811415610d5f57604051630333a68160e41b815260040160405180910390fd5b60408051828152602081018490527f1c2986e5350a71fed3feb3bdcbc3a7aaafd924f4b3dc18d90c17ccb885636be8910160405180910390a150600255565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610dec57600080fd5b505afa158015610e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2491906115e9565b6001600160a01b0316336001600160a01b031614610e5557604051634b98449160e11b815260040160405180910390fd5b604080518082019091526007546001600160801b038082168352600160801b90910416602082018190526703782dace9d9000090610e9390846116ca565b6001600160801b03161115610ebb576040516361b716bb60e11b815260040160405180910390fd5b80516001600160801b0383811691161415610ee957604051630333a68160e41b815260040160405180910390fd5b8051604080516001600160801b03928316815291841660208301527f400289ff508344720ca1c0ffff41672b308ae46b4c8227282c2dea56d8595671910160405180910390a150600780546fffffffffffffffffffffffffffffffff19166001600160801b0392909216919091179055565b60015460009080610f70575050600254919050565b6009546040516370a0823160e01b81526001600160a01b03858116600483015260009216906370a082319060240160206040518083038186803b158015610fb657600080fd5b505afa158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee91906116f5565b905060016000815481106110045761100461166c565b6000918252602090912001546001600160801b031681101561102b57505060025492915050565b60015b828110156110c057600181815481106110495761104961166c565b6000918252602090912001546001600160801b03168210156110b8576110af60018083038154811061107d5761107d61166c565b600091825260209091200154600254906001600160801b03600160801b9091048116670de0b6b3a76400000316611291565b95945050505050565b60010161102e565b6110af60018085038154811061107d5761107d61166c565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561112657600080fd5b505afa15801561113a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115e91906115e9565b6001600160a01b0316336001600160a01b03161461118f57604051634b98449160e11b815260040160405180910390fd5b6703782dace9d900008111156111b8576040516361b716bb60e11b815260040160405180910390fd5b600554818114156111dc57604051630333a68160e41b815260040160405180910390fd5b60408051828152602081018490527f733071ab8253b372ed26a6d1b04aec71c4bfcd209c93397df32bb77478cdd2c8910160405180910390a150600555565b60606001805480602002602001604051908101604052809291908181526020016000905b8282101561128857600084815260209081902060408051808201909152908401546001600160801b038082168352600160801b909104168183015282526001909201910161123f565b50505050905090565b600082158061129e575081155b156112ab575060006112e0565b670de0b6b3a76400006112bf60028261170e565b6112c98486611730565b6112d3919061174f565b6112dd919061170e565b90505b92915050565b50805460008255906000526020600020908101906113049190611307565b50565b5b8082111561131c5760008155600101611308565b5090565b60006020828403121561133257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561137257611372611339565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156113a1576113a1611339565b604052919050565b80356001600160801b03811681146113c057600080fd5b919050565b600060208083850312156113d857600080fd5b823567ffffffffffffffff808211156113f057600080fd5b818501915085601f83011261140457600080fd5b81358181111561141657611416611339565b611424848260051b01611378565b818152848101925060069190911b83018401908782111561144457600080fd5b928401925b8184101561149657604084890312156114625760008081fd5b61146a61134f565b611473856113a9565b81526114808686016113a9565b8187015283526040939093019291840191611449565b979650505050505050565b6001600160a01b038116811461130457600080fd5b600080604083850312156114c957600080fd5b82356114d4816114a1565b915060208301356114e4816114a1565b809150509250929050565b60006020828403121561150157600080fd5b6112dd826113a9565b60006020828403121561151c57600080fd5b8135611527816114a1565b9392505050565b600081518084526020808501945080840160005b8381101561157657815180516001600160801b03908116895290840151168388015260409096019590820190600101611542565b509495945050505050565b6020815260006112dd602083018461152e565b600060208083528351808285015260005b818110156115c1578581018301518582016040015282016115a5565b818111156115d3576000604083870101525b50601f01601f1916929092016040019392505050565b6000602082840312156115fb57600080fd5b8151611527816114a1565b6000604080830181845280865480835260608601915087600052602092508260002060005b828110156116585781546001600160801b038116855260801c85850152928501926001918201910161162b565b50505084810382860152611496818761152e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156116aa576116aa611682565b500390565b60006000198214156116c3576116c3611682565b5060010190565b60006001600160801b038083168185168083038211156116ec576116ec611682565b01949350505050565b60006020828403121561170757600080fd5b5051919050565b60008261172b57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561174a5761174a611682565b500290565b6000821982111561176257611762611682565b50019056fea2646970667358221220025a5a2510ee856b0a4eeb89e9484816a96d734d1633883a1ef52286e6c9ee4364736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c80637c0f59f4116100b8578063cfc0c69f1161007c578063cfc0c69f1461027e578063d2d6b5a31461029c578063daf635de146102af578063de170570146102c2578063e941fa78146102d7578063ffa1ad74146102e057600080fd5b80637c0f59f41461022957806388156a351461023257806388c2c07f14610245578063a8ffba6414610258578063afcff50f1461026b57600080fd5b806336407921116100ff57806336407921146101d4578063485cc955146101e757806357f2e581146101fa5780635cd24fd21461020d57806367a527931461022057600080fd5b8063017def571461013c578063039af9eb1461015157806303df739614610189578063285a7674146101a05780632a9133c1146101cb575b600080fd5b61014f61014a366004611320565b610311565b005b61016461015f366004611320565b610454565b604080516001600160801b039384168152929091166020830152015b60405180910390f35b61019260025481565b604051908152602001610180565b6009546101b3906001600160a01b031681565b6040516001600160a01b039091168152602001610180565b61019260045481565b61014f6101e23660046113c5565b610489565b61014f6101f53660046114b6565b6106b6565b61014f610208366004611320565b610810565b61014f61021b3660046114ef565b610953565b61019260035481565b61019260065481565b61014f610240366004611320565b610b18565b61014f610253366004611320565b610c5b565b61014f6102663660046114ef565b610d9e565b6008546101b3906001600160a01b031681565b600754610164906001600160801b0380821691600160801b90041682565b6101926102aa36600461150a565b610f5b565b61014f6102bd366004611320565b6110d8565b6102ca61121b565b6040516101809190611581565b61019260055481565b610304604051806040016040528060058152602001640312e322e360dc1b81525081565b6040516101809190611594565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561035f57600080fd5b505afa158015610373573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039791906115e9565b6001600160a01b0316336001600160a01b0316146103c857604051634b98449160e11b815260040160405180910390fd5b6703782dace9d900008111156103f1576040516361b716bb60e11b815260040160405180910390fd5b6003548181141561041557604051630333a68160e41b815260040160405180910390fd5b60408051828152602081018490527f828cf983933545af35b9ba46eec951db1cb4c5433c3ec403aeced2963c264790910160405180910390a150600355565b6001818154811061046457600080fd5b6000918252602090912001546001600160801b038082169250600160801b9091041682565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156104d757600080fd5b505afa1580156104eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050f91906115e9565b6001600160a01b0316336001600160a01b03161461054057604051634b98449160e11b815260040160405180910390fd5b7f69e7d03bdd0009aaf816649f3df4329250186771260691fa1b13bae6419ead54600182604051610572929190611606565b60405180910390a1610586600160006112e6565b805160005b818110156106b15760008382815181106105a7576105a761166c565b60200260200101519050670de0b6b3a764000081602001516001600160801b031611156105e7576040516350e630a760e01b815260040160405180910390fd5b600082118015610630575080516001600160801b031684610609600185611698565b815181106106195761061961166c565b6020026020010151600001516001600160801b0316115b1561064e576040516344eff01160e11b815260040160405180910390fd5b60018054808201825560009190915281516020909201516001600160801b03908116600160801b029216919091177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6909101556106aa816116af565b905061058b565b505050565b600054610100900460ff16806106cf575060005460ff16155b6107365760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015610758576000805461ffff19166101011790555b6001600160a01b03831661077f57604051637cb62f2b60e11b815260040160405180910390fd5b600880546001600160a01b038086166001600160a01b03199283161790925560098054928516929091169190911790556040805180820190915267016345785d8a0000815267011c37937e08000060209091015277011c37937e0800000000000000000000016345785d8a00006007556608e1bc9bf0400060025580156106b1576000805461ff0019169055505050565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561085e57600080fd5b505afa158015610872573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089691906115e9565b6001600160a01b0316336001600160a01b0316146108c757604051634b98449160e11b815260040160405180910390fd5b6703782dace9d900008111156108f0576040516361b716bb60e11b815260040160405180910390fd5b6004548181141561091457604051630333a68160e41b815260040160405180910390fd5b60408051828152602081018490527f7aef17a0caeda11810cdf2a40c79ac1340553588671fb35d5cc8d0a3fe2883be910160405180910390a150600455565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156109a157600080fd5b505afa1580156109b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d991906115e9565b6001600160a01b0316336001600160a01b031614610a0a57604051634b98449160e11b815260040160405180910390fd5b604080518082019091526007546001600160801b03808216808452600160801b9092041660208301526703782dace9d9000090610a4790846116ca565b6001600160801b03161115610a6f576040516361b716bb60e11b815260040160405180910390fd5b80602001516001600160801b0316826001600160801b03161415610aa657604051630333a68160e41b815260040160405180910390fd5b7fe0dac1dcc46eceed1fdb7416944e7161273637fb346a67d6f0fce8de3e952f2f816020015183604051610af09291906001600160801b0392831681529116602082015260400190565b60405180910390a150600780546001600160801b03928316600160801b029216919091179055565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6657600080fd5b505afa158015610b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9e91906115e9565b6001600160a01b0316336001600160a01b031614610bcf57604051634b98449160e11b815260040160405180910390fd5b6703782dace9d90000811115610bf8576040516361b716bb60e11b815260040160405180910390fd5b60065481811415610c1c57604051630333a68160e41b815260040160405180910390fd5b60408051828152602081018490527fdd45ca427fa57d0870314eb55586e91bcdd31d7cd393e3278caaae9dfb749688910160405180910390a150600655565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610ca957600080fd5b505afa158015610cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce191906115e9565b6001600160a01b0316336001600160a01b031614610d1257604051634b98449160e11b815260040160405180910390fd5b6703782dace9d90000811115610d3b576040516361b716bb60e11b815260040160405180910390fd5b60025481811415610d5f57604051630333a68160e41b815260040160405180910390fd5b60408051828152602081018490527f1c2986e5350a71fed3feb3bdcbc3a7aaafd924f4b3dc18d90c17ccb885636be8910160405180910390a150600255565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610dec57600080fd5b505afa158015610e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2491906115e9565b6001600160a01b0316336001600160a01b031614610e5557604051634b98449160e11b815260040160405180910390fd5b604080518082019091526007546001600160801b038082168352600160801b90910416602082018190526703782dace9d9000090610e9390846116ca565b6001600160801b03161115610ebb576040516361b716bb60e11b815260040160405180910390fd5b80516001600160801b0383811691161415610ee957604051630333a68160e41b815260040160405180910390fd5b8051604080516001600160801b03928316815291841660208301527f400289ff508344720ca1c0ffff41672b308ae46b4c8227282c2dea56d8595671910160405180910390a150600780546fffffffffffffffffffffffffffffffff19166001600160801b0392909216919091179055565b60015460009080610f70575050600254919050565b6009546040516370a0823160e01b81526001600160a01b03858116600483015260009216906370a082319060240160206040518083038186803b158015610fb657600080fd5b505afa158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee91906116f5565b905060016000815481106110045761100461166c565b6000918252602090912001546001600160801b031681101561102b57505060025492915050565b60015b828110156110c057600181815481106110495761104961166c565b6000918252602090912001546001600160801b03168210156110b8576110af60018083038154811061107d5761107d61166c565b600091825260209091200154600254906001600160801b03600160801b9091048116670de0b6b3a76400000316611291565b95945050505050565b60010161102e565b6110af60018085038154811061107d5761107d61166c565b600860009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561112657600080fd5b505afa15801561113a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115e91906115e9565b6001600160a01b0316336001600160a01b03161461118f57604051634b98449160e11b815260040160405180910390fd5b6703782dace9d900008111156111b8576040516361b716bb60e11b815260040160405180910390fd5b600554818114156111dc57604051630333a68160e41b815260040160405180910390fd5b60408051828152602081018490527f733071ab8253b372ed26a6d1b04aec71c4bfcd209c93397df32bb77478cdd2c8910160405180910390a150600555565b60606001805480602002602001604051908101604052809291908181526020016000905b8282101561128857600084815260209081902060408051808201909152908401546001600160801b038082168352600160801b909104168183015282526001909201910161123f565b50505050905090565b600082158061129e575081155b156112ab575060006112e0565b670de0b6b3a76400006112bf60028261170e565b6112c98486611730565b6112d3919061174f565b6112dd919061170e565b90505b92915050565b50805460008255906000526020600020908101906113049190611307565b50565b5b8082111561131c5760008155600101611308565b5090565b60006020828403121561133257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561137257611372611339565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156113a1576113a1611339565b604052919050565b80356001600160801b03811681146113c057600080fd5b919050565b600060208083850312156113d857600080fd5b823567ffffffffffffffff808211156113f057600080fd5b818501915085601f83011261140457600080fd5b81358181111561141657611416611339565b611424848260051b01611378565b818152848101925060069190911b83018401908782111561144457600080fd5b928401925b8184101561149657604084890312156114625760008081fd5b61146a61134f565b611473856113a9565b81526114808686016113a9565b8187015283526040939093019291840191611449565b979650505050505050565b6001600160a01b038116811461130457600080fd5b600080604083850312156114c957600080fd5b82356114d4816114a1565b915060208301356114e4816114a1565b809150509250929050565b60006020828403121561150157600080fd5b6112dd826113a9565b60006020828403121561151c57600080fd5b8135611527816114a1565b9392505050565b600081518084526020808501945080840160005b8381101561157657815180516001600160801b03908116895290840151168388015260409096019590820190600101611542565b509495945050505050565b6020815260006112dd602083018461152e565b600060208083528351808285015260005b818110156115c1578581018301518582016040015282016115a5565b818111156115d3576000604083870101525b50601f01601f1916929092016040019392505050565b6000602082840312156115fb57600080fd5b8151611527816114a1565b6000604080830181845280865480835260608601915087600052602092508260002060005b828110156116585781546001600160801b038116855260801c85850152928501926001918201910161162b565b50505084810382860152611496818761152e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156116aa576116aa611682565b500390565b60006000198214156116c3576116c3611682565b5060010190565b60006001600160801b038083168185168083038211156116ec576116ec611682565b01949350505050565b60006020828403121561170757600080fd5b5051919050565b60008261172b57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561174a5761174a611682565b500290565b6000821982111561176257611762611682565b50019056fea2646970667358221220025a5a2510ee856b0a4eeb89e9484816a96d734d1633883a1ef52286e6c9ee4364736f6c63430008090033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ 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.