ETH Price: $2,694.45 (-2.94%)
Gas: 1.63 Gwei

Contract

0x163B890f4892D593945579028Ec44Ef0f20A4633
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer207048142024-09-08 8:51:35151 days ago1725785495IN
0x163B890f...0f20A4633
0 ETH0.000063991.37037991
Transfer188911372023-12-29 12:08:23405 days ago1703851703IN
0x163B890f...0f20A4633
0 ETH0.0008374619.2574021
Approve157516182022-10-15 6:06:59845 days ago1665814019IN
0x163B890f...0f20A4633
0 ETH0.0003884216.05544368
Approve139788842022-01-10 16:37:231123 days ago1641832643IN
0x163B890f...0f20A4633
0 ETH0.0133342288.6128892
Approve139650942022-01-08 13:46:381125 days ago1641649598IN
0x163B890f...0f20A4633
0 ETH0.0044046395.33636444
Approve137077522021-11-29 9:17:121165 days ago1638177432IN
0x163B890f...0f20A4633
0 ETH0.0040625187.93134112
Approve136723542021-11-23 18:10:461171 days ago1637691046IN
0x163B890f...0f20A4633
0 ETH0.0060896131.80669516
Approve136570182021-11-21 8:15:071173 days ago1637482507IN
0x163B890f...0f20A4633
0 ETH0.0035173276.13099559
Approve136544952021-11-20 22:24:401173 days ago1637447080IN
0x163B890f...0f20A4633
0 ETH0.0036621179.26480033
Approve136544882021-11-20 22:23:521173 days ago1637447032IN
0x163B890f...0f20A4633
0 ETH0.0025137295.57543225
Approve136544762021-11-20 22:21:461173 days ago1637446906IN
0x163B890f...0f20A4633
0 ETH0.00532374115.230102
Approve136524182021-11-20 14:30:021174 days ago1637418602IN
0x163B890f...0f20A4633
0 ETH0.0044917497.22181501
Approve136504952021-11-20 7:12:501174 days ago1637392370IN
0x163B890f...0f20A4633
0 ETH0.0044513496.3473439
Approve136485582021-11-19 23:44:461174 days ago1637365486IN
0x163B890f...0f20A4633
0 ETH0.0050437109.16871012
Approve136475412021-11-19 19:59:271174 days ago1637351967IN
0x163B890f...0f20A4633
0 ETH0.00676463146.4176077
Approve136473872021-11-19 19:22:011175 days ago1637349721IN
0x163B890f...0f20A4633
0 ETH0.00274257104.276367
Approve136473812021-11-19 19:20:561175 days ago1637349656IN
0x163B890f...0f20A4633
0 ETH0.0045640798.78743403
Approve136469892021-11-19 17:52:101175 days ago1637344330IN
0x163B890f...0f20A4633
0 ETH0.00595454128.88353256
Approve136469772021-11-19 17:50:001175 days ago1637344200IN
0x163B890f...0f20A4633
0 ETH0.00678304146.81595408
Approve136460262021-11-19 14:19:221175 days ago1637331562IN
0x163B890f...0f20A4633
0 ETH0.00696349150.7217479
Approve136455772021-11-19 12:31:331175 days ago1637325093IN
0x163B890f...0f20A4633
0 ETH0.00515609111.60127516
Approve136455352021-11-19 12:20:381175 days ago1637324438IN
0x163B890f...0f20A4633
0 ETH0.00588816127.44661062

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
135630742021-11-06 12:53:061188 days ago1636203186  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EmpirePair

Compiler Version
v0.6.8+commit.0bbfe453

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 9 : EmpirePair.sol
// SPDX-License-Identifier: Unlicense

pragma solidity =0.6.8;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

import "../interfaces/IEmpirePair.sol";
import "../interfaces/IEmpireFactory.sol";
import "../interfaces/IEmpireCallee.sol";

import "../libraries/dex/UQ112x112.sol";

import "./EmpireERC20.sol";

contract EmpirePair is IEmpirePair, EmpireERC20 {
    using UQ112x112 for uint224;

    uint256 private constant MINIMUM_LIQUIDITY = 10**3;
    bytes4 private constant TRANSFER_SELECTOR =
        bytes4(keccak256(bytes("transfer(address,uint256)")));
    bytes4 private constant TRANSFER_FROM_SELECTOR =
        bytes4(keccak256(bytes("transferFrom(address,address,uint256)")));

    address public immutable override factory;
    address public override token0;
    address public override token1;

    uint112 private override reserve0; // uses single storage slot, accessible via getReserves
    uint112 private override reserve1; // uses single storage slot, accessible via getReserves
    uint32 private override blockTimestampLast; // uses single storage slot, accessible via getReserves

    uint256 public override price0CumulativeLast;
    uint256 public override price1CumulativeLast;
    uint256 public override kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event

    uint256 public override liquidityLocked; // By default, liquidity is not locked (timestamp is 0)
    address public override sweepableToken; // By default, no token is sweepable
    uint256 public override sweptAmount; // Tracks how many tokens were swept based on the floor price
    PairType public empirePairType; // Tracks pair type
    uint256 public empireLockTime; // Tracks lock time

    uint256 private unlocked = 1;

    modifier lock() {
        require(unlocked == 1, "Empire: LOCKED");
        unlocked = 2;
        _;
        unlocked = 1;
    }

    function getReserves()
        public
        view
        override
        returns (
            uint112 _reserve0,
            uint112 _reserve1,
            uint32 _blockTimestampLast
        )
    {
        _reserve0 = reserve0;
        _reserve1 = reserve1;
        _blockTimestampLast = blockTimestampLast;
    }

    function _safeTransfer(
        address token,
        address to,
        uint256 value
    ) private {
        _safeCall(token, abi.encodeWithSelector(TRANSFER_SELECTOR, to, value));
    }

    function _safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) private {
        _safeCall(
            token,
            abi.encodeWithSelector(TRANSFER_FROM_SELECTOR, from, to, value)
        );
    }

    function _safeCall(address token, bytes memory payload) private {
        (bool success, bytes memory data) = token.call(payload);
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "Empire: TRANSFER_FAILED"
        );
    }

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);
    event Swept(uint256 amount);
    event Unswept(uint256 amount);

    constructor() public {
        factory = msg.sender;
    }

    // called once by the factory at time of deployment
    function initialize(
        address _token0,
        address _token1,
        PairType pairType,
        uint256 unlockTime
    ) external override {
        require(msg.sender == factory, "Empire: FORBIDDEN"); // sufficient check
        token0 = _token0;
        token1 = _token1;

        if (pairType != PairType.Common) {
            liquidityLocked = unlockTime;
            empirePairType = pairType;

            if (pairType == PairType.SweepableToken0) {
                sweepableToken = _token0;
            } else if (pairType == PairType.SweepableToken1) {
                sweepableToken = _token1;
            }
        }

        empireLockTime = unlockTime;
    }

    // update reserves and, on the first call per block, price accumulators
    function _update(
        uint256 balance0,
        uint256 balance1,
        uint112 _reserve0,
        uint112 _reserve1
    ) private {
        require(
            balance0 <= uint112(-1) && balance1 <= uint112(-1),
            "Empire: OVERFLOW"
        );
        uint32 blockTimestamp = uint32(block.timestamp % 2**32);
        uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired
        if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
            // * never overflows, and + overflow is desired
            price0CumulativeLast +=
                uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) *
                timeElapsed;
            price1CumulativeLast +=
                uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) *
                timeElapsed;
        }
        reserve0 = uint112(balance0);
        reserve1 = uint112(balance1);
        blockTimestampLast = blockTimestamp;
        emit Sync(reserve0, reserve1);
    }

    // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)
    function _mintFee(uint112 _reserve0, uint112 _reserve1)
        private
        returns (bool feeOn)
    {
        address feeTo = IEmpireFactory(factory).feeTo();
        feeOn = feeTo != address(0);
        uint256 _kLast = kLast; // gas savings
        if (feeOn) {
            if (_kLast != 0) {
                uint256 rootK = uint256(_reserve0).mul(_reserve1).sqrt();
                uint256 rootKLast = _kLast.sqrt();
                if (rootK > rootKLast) {
                    uint256 numerator = totalSupply.mul(rootK.sub(rootKLast));
                    uint256 denominator = rootK.mul(5).add(rootKLast);
                    uint256 liquidity = numerator / denominator;
                    if (liquidity > 0) _mint(feeTo, liquidity);
                }
            }
        } else if (_kLast != 0) {
            kLast = 0;
        }
    }

    // this low-level function should be called from a contract which performs important safety checks
    function mint(address to)
        external
        override
        lock
        returns (uint256 liquidity)
    {
        (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
        uint256 balance0 = _balanceOfSelf(token0);
        uint256 balance1 = _balanceOfSelf(token1);
        uint256 amount0 = balance0.sub(_reserve0);
        uint256 amount1 = balance1.sub(_reserve1);

        bool feeOn = _mintFee(_reserve0, _reserve1);
        uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        if (_totalSupply == 0) {
            liquidity = amount0.mul(amount1).sqrt().sub(MINIMUM_LIQUIDITY);
            _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
        } else {
            liquidity = (amount0.mul(_totalSupply) / _reserve0).min(
                amount1.mul(_totalSupply) / _reserve1
            );
        }
        require(liquidity > 0, "Empire: INSUFFICIENT_LIQUIDITY_MINTED");
        _mint(to, liquidity);

        _update(balance0, balance1, _reserve0, _reserve1);
        if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
        emit Mint(msg.sender, amount0, amount1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function burn(address to)
        external
        override
        lock
        returns (uint256 amount0, uint256 amount1)
    {
        require(block.timestamp >= liquidityLocked, "Empire: LIQUIDITY_LOCKED");
        (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
        address _token0 = token0; // gas savings
        address _token1 = token1; // gas savings
        uint256 balance0 = _balanceOfSelf(_token0);
        uint256 balance1 = _balanceOfSelf(_token1);
        uint256 liquidity = balanceOf[address(this)];

        bool feeOn = _mintFee(_reserve0, _reserve1);
        uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
        amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
        require(
            amount0 > 0 && amount1 > 0,
            "Empire: INSUFFICIENT_LIQUIDITY_BURNED"
        );
        _burn(address(this), liquidity);
        _safeTransfer(_token0, to, amount0);
        _safeTransfer(_token1, to, amount1);
        balance0 = _balanceOfSelf(_token0);
        balance1 = _balanceOfSelf(_token1);

        _update(balance0, balance1, _reserve0, _reserve1);
        if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
        emit Burn(msg.sender, amount0, amount1, to);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external override lock {
        require(
            amount0Out > 0 || amount1Out > 0,
            "Empire: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
        require(
            amount0Out < _reserve0 && amount1Out < _reserve1,
            "Empire: INSUFFICIENT_LIQUIDITY"
        );

        uint256 balance0;
        uint256 balance1;
        {
            // scope for _token{0,1}, avoids stack too deep errors
            address _token0 = token0;
            address _token1 = token1;
            require(to != _token0 && to != _token1, "Empire: INVALID_TO");
            if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
            if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
            if (data.length > 0)
                IEmpireCallee(to).empireCall(
                    msg.sender,
                    amount0Out,
                    amount1Out,
                    data
                );
            balance0 = _balanceOfSelf(_token0);
            balance1 = _balanceOfSelf(_token1);
        }
        uint256 amount0In =
            balance0 > _reserve0 - amount0Out
                ? balance0 - (_reserve0 - amount0Out)
                : 0;
        uint256 amount1In =
            balance1 > _reserve1 - amount1Out
                ? balance1 - (_reserve1 - amount1Out)
                : 0;
        require(
            amount0In > 0 || amount1In > 0,
            "Empire: INSUFFICIENT_INPUT_AMOUNT"
        );
        {
            // scope for reserve{0,1}Adjusted, avoids stack too deep errors
            uint256 balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));
            uint256 balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));
            require(
                balance0Adjusted.mul(balance1Adjusted) >=
                    uint256(_reserve0).mul(_reserve1).mul(1000**2),
                "Empire: K"
            );
        }

        _update(balance0, balance1, _reserve0, _reserve1);
        emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);
    }

    // force balances to match reserves
    function skim(address to) external override lock {
        address _token0 = token0; // gas savings
        address _token1 = token1; // gas savings
        _safeTransfer(_token0, to, _balanceOfSelf(_token0).sub(reserve0));
        _safeTransfer(_token1, to, _balanceOfSelf(_token1).sub(reserve1));
    }

    // force reserves to match balances
    function sync() external override lock {
        _update(
            _balanceOfSelf(token0),
            _balanceOfSelf(token1),
            reserve0,
            reserve1
        );
    }

    // wrapper ensuring sweeps are accounted for
    function _balanceOfSelf(address token)
        internal
        view
        returns (uint256 balance)
    {
        if (token == sweepableToken) {
            balance = sweptAmount;
        }
        return balance.add(IERC20(token).balanceOf(address(this)));
    }

    // allow sweeping if enabled
    function sweep(uint256 amount, bytes calldata data) external override lock {
        address _token0 = token0;
        address _token1 = token1;
        uint256 _reserveSwept;
        uint256 _reserveSweeper;
        if (msg.sender == _token0) {
            require(sweepableToken == _token1, "Empire: INCORRECT_CALLER");
            _reserveSwept = reserve1;
            _reserveSweeper = reserve0;
        } else {
            require(
                msg.sender == _token1 && sweepableToken == _token0,
                "Empire: INCORRECT_CALLER"
            );
            _reserveSwept = reserve0;
            _reserveSweeper = reserve1;
        }

        // Calculate necessary sweepable token amount for pool to contain full token supply
        uint256 amountIn = IERC20(msg.sender).totalSupply() - _reserveSweeper;
        uint256 numerator = amountIn.mul(_reserveSwept);
        uint256 denominator = _reserveSweeper.mul(1000).add(amountIn);
        uint256 amountOut = numerator / denominator;
        uint256 maxSweepable = _reserveSwept - amountOut;

        uint256 _sweptAmount = sweptAmount.add(amount);

        require(_sweptAmount <= maxSweepable, "Empire: INCORRECT_SWEEP_AMOUNT");

        sweptAmount = _sweptAmount;

        _safeTransfer(sweepableToken, msg.sender, amount);

        IEmpireCallee(msg.sender).empireSweepCall(amount, data);

        emit Swept(amount);
    }

    function unsweep(uint256 amount) external override lock {
        address _token0 = token0;
        address _token1 = token1;
        if (msg.sender == _token0) {
            require(sweepableToken == _token1, "Empire: INCORRECT_CALLER");
        } else {
            require(
                msg.sender == _token1 && sweepableToken == _token0,
                "Empire: INCORRECT_CALLER"
            );
        }

        _safeTransferFrom(sweepableToken, msg.sender, address(this), amount);
        sweptAmount = sweptAmount.sub(amount);

        emit Unswept(amount);
    }

    function getMaxSweepable() external view override returns (uint256) {
        address _token0 = token0;
        address _token1 = token1;
        address _sweeper;
        uint256 _reserveIn;
        uint256 _reserveOut;
        if (sweepableToken == _token0) {
            _sweeper = _token1;
            _reserveIn = reserve1;
            _reserveOut = reserve0;
        } else {
            require(sweepableToken == token1, "Empire: NON_SWEEPABLE_POOL");
            _sweeper = _token0;
            _reserveIn = reserve0;
            _reserveOut = reserve1;
        }

        uint256 amountIn = IERC20(_sweeper).totalSupply() - _reserveIn;
        uint256 amountOut = getAmountOut(amountIn, _reserveIn, _reserveOut);
        return _reserveOut - amountOut;
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        if (amountIn == 0) return 0;

        uint256 amountInWithFee = amountIn.mul(997);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }
}

File 2 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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 3 of 9 : EmpireERC20.sol
// SPDX-License-Identifier: Unlicense

pragma solidity =0.6.8;

import "../interfaces/IEmpireERC20.sol";

import "../libraries/common/EmpireMath.sol";

contract EmpireERC20 is IEmpireERC20 {
    using EmpireMath for uint256;

    string public constant override name = "Empire LP";
    string public constant override symbol = "EMP-LP";
    uint8 public constant override decimals = 18;
    uint256 public override totalSupply;
    mapping(address => uint256) public override balanceOf;
    mapping(address => mapping(address => uint256)) public override allowance;

    uint256 private immutable CACHED_CHAIN_ID;
    bytes32 private immutable CACHED_DOMAIN_SEPARATOR;
    bytes32 private constant EIP712_DOMAIN =
        keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
    bytes32 private constant PERMIT_TYPEHASH =
        keccak256(
            "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
        );
    mapping(address => uint256) public override nonces;

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    constructor() public {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        CACHED_CHAIN_ID = chainId;
        CACHED_DOMAIN_SEPARATOR = _computeSeparator(chainId);
    }

    function _mint(address to, uint256 value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint256 value) internal {
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(
        address owner,
        address spender,
        uint256 value
    ) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) private {
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function approve(address spender, uint256 value)
        external
        override
        returns (bool)
    {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint256 value)
        external
        override
        returns (bool)
    {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override returns (bool) {
        if (allowance[from][msg.sender] != uint256(-1)) {
            allowance[from][msg.sender] = allowance[from][msg.sender].sub(
                value
            );
        }
        _transfer(from, to, value);
        return true;
    }

    function _computeSeparator(uint256 chainId)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    EIP712_DOMAIN,
                    keccak256(bytes(name)),
                    keccak256(bytes("1")),
                    chainId,
                    address(this)
                )
            );
    }

    function _getDigest(bytes32 payload) internal view returns (bytes32) {
        uint256 chainId;

        assembly {
            chainId := chainid()
        }

        bytes32 domainSeparator =
            chainId != CACHED_CHAIN_ID
                ? _computeSeparator(chainId)
                : CACHED_DOMAIN_SEPARATOR;

        return
            keccak256(abi.encodePacked("\x19\x01", domainSeparator, payload));
    }

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external override {
        require(deadline >= block.timestamp, "Empire: EXPIRED");
        bytes32 digest =
            _getDigest(
                keccak256(
                    abi.encode(
                        PERMIT_TYPEHASH,
                        owner,
                        spender,
                        value,
                        nonces[owner]++,
                        deadline
                    )
                )
            );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(
            recoveredAddress != address(0) && recoveredAddress == owner,
            "Empire: INVALID_SIGNATURE"
        );
        _approve(owner, spender, value);
    }
}

File 4 of 9 : IEmpireCallee.sol
// SPDX-License-Identifier: Unlicense

pragma solidity =0.6.8;

interface IEmpireCallee {
    function empireCall(
        address sender,
        uint256 amount0,
        uint256 amount1,
        bytes calldata data
    ) external;

    function empireSweepCall(uint256 amountSwept, bytes calldata data) external;
}

File 5 of 9 : IEmpireERC20.sol
// SPDX-License-Identifier: Unlicense

pragma solidity =0.6.8;

interface IEmpireERC20 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

File 6 of 9 : IEmpireFactory.sol
// SPDX-License-Identifier: Unlicense

pragma solidity =0.6.8;

import "./IEmpirePair.sol";

interface IEmpireFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function createPair(
        address tokenA,
        address tokenB,
        PairType pairType,
        uint256 unlockTime
    ) external returns (address pair);

    function createEmpirePair(
        address tokenA,
        address tokenB,
        PairType pairType,
        uint256 unlockTime
    ) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

File 7 of 9 : IEmpirePair.sol
// SPDX-License-Identifier: Unlicense

pragma solidity =0.6.8;

enum PairType {Common, LiquidityLocked, SweepableToken0, SweepableToken1}

interface IEmpirePair {
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function sweptAmount() external view returns (uint256);

    function sweepableToken() external view returns (address);

    function liquidityLocked() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(
        address,
        address,
        PairType,
        uint256
    ) external;

    function sweep(uint256 amount, bytes calldata data) external;

    function unsweep(uint256 amount) external;

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

File 8 of 9 : EmpireMath.sol
// SPDX-License-Identifier: Unlicense

pragma solidity =0.6.8;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library EmpireMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "ds-math-sub-underflow");
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

File 9 of 9 : UQ112x112.sol
// SPDX-License-Identifier: Unlicense

pragma solidity =0.6.8;

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))

// range: [0, 2**112 - 1]
// resolution: 1 / 2**112

library UQ112x112 {
    uint224 private constant Q112 = 2**112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 y) internal pure returns (uint224 z) {
        z = uint224(y) * Q112; // never overflows
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
        z = x / uint224(y);
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Swept","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unswept","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"empireLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"empirePairType","outputs":[{"internalType":"enum PairType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSweepable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"enum PairType","name":"pairType","type":"uint8"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sweepableToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweptAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unsweep","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e06040526001600f5534801561001557600080fd5b5046608081905261002e816001600160e01b0361003e16565b60a052503360601b60c05261010e565b6000604051808062002b746052913960408051918290036052018220828201825260098352680456d70697265204c560bc1b6020938401528151808301835260018152603160f81b908401528151808401919091527f2f521cff6f8a1416a02f0455c70bc850a9c90063ca4463d44dd97a783ee14463818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018690523060a0808301919091528251808303909101815260c09091019091528051910120915050919050565b60805160a05160c05160601c612a2c6200014860003980610c95528061169052806122125250806126075250806125df5250612a2c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80637464fc3d1161010f578063c1226988116100a2578063d505accf11610071578063d505accf1461065c578063dd62ed3e146106ad578063f96e16fc146106db578063fff6cae9146106e3576101f0565b8063c1226988146105a9578063c45a0155146105d5578063d21220a7146105dd578063d2ae9a0d146105e5576101f0565b806395d89b41116100de57806395d89b4114610532578063a9059cbb1461053a578063ae84637f14610566578063bc25cf7714610583576101f0565b80637464fc3d146104bd5780637ecebe00146104c557806389afcb44146104eb5780638b15bb871461052a576101f0565b806357976fb41161018757806363004c1b1161015657806363004c1b146104615780636a627842146104695780636b1be4bb1461048f57806370a0823114610497576101f0565b806357976fb41461040a5780635909c0d5146104125780635a3d54931461041a57806360d780ee14610422576101f0565b80630dfe1681116101c35780630dfe16811461037857806318160ddd1461039c57806323b872dd146103b6578063313ce567146103ec576101f0565b8063022c0d9f146101f557806306fdde03146102835780630902f1ac14610300578063095ea7b314610338575b600080fd5b6102816004803603608081101561020b57600080fd5b8135916020810135916001600160a01b03604083013516919081019060808101606082013564010000000081111561024257600080fd5b82018360208201111561025457600080fd5b8035906020019184600183028401116401000000008311171561027657600080fd5b5090925090506106eb565b005b61028b610b5d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c55781810151838201526020016102ad565b50505050905090810190601f1680156102f25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610308610b82565b604080516001600160701b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b6103646004803603604081101561034e57600080fd5b506001600160a01b038135169060200135610bac565b604080519115158252519081900360200190f35b610380610bc3565b604080516001600160a01b039092168252519081900360200190f35b6103a4610bd2565b60408051918252519081900360200190f35b610364600480360360608110156103cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610bd8565b6103f4610c73565b6040805160ff9092168252519081900360200190f35b6103a4610c78565b6103a4610c7e565b6103a4610c84565b6102816004803603608081101561043857600080fd5b506001600160a01b03813581169160208101359091169060ff6040820135169060600135610c8a565b6103a4610dcd565b6103a46004803603602081101561047f57600080fd5b50356001600160a01b0316610f1e565b6103a461115e565b6103a4600480360360208110156104ad57600080fd5b50356001600160a01b0316611164565b6103a4611176565b6103a4600480360360208110156104db57600080fd5b50356001600160a01b031661117c565b6105116004803603602081101561050157600080fd5b50356001600160a01b031661118e565b6040805192835260208301919091528051918290030190f35b6103806113e6565b61028b6113f5565b6103646004803603604081101561055057600080fd5b506001600160a01b038135169060200135611417565b6102816004803603602081101561057c57600080fd5b5035611424565b6102816004803603602081101561059957600080fd5b50356001600160a01b03166115ca565b6105b1611685565b604051808260038111156105c157fe5b60ff16815260200191505060405180910390f35b61038061168e565b6103806116b2565b610281600480360360408110156105fb57600080fd5b8135919081019060408101602082013564010000000081111561061d57600080fd5b82018360208201111561062f57600080fd5b8035906020019184600183028401116401000000008311171561065157600080fd5b5090925090506116c1565b610281600480360360e081101561067257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611a50565b6103a4600480360360408110156106c357600080fd5b506001600160a01b0381358116916020013516611c22565b6103a4611c3f565b610281611c45565b600f54600114610733576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f55841515806107465750600084115b6107815760405162461bcd60e51b81526004018080602001828103825260228152602001806129b46022913960400191505060405180910390fd5b60008061078c610b82565b5091509150816001600160701b0316871080156107b15750806001600160701b031686105b610802576040805162461bcd60e51b815260206004820152601e60248201527f456d706972653a20494e53554646494349454e545f4c49515549444954590000604482015290519081900360640190fd5b60045460055460009182916001600160a01b039182169190811690891682148015906108405750806001600160a01b0316896001600160a01b031614155b610886576040805162461bcd60e51b8152602060048201526012602482015271456d706972653a20494e56414c49445f544f60701b604482015290519081900360640190fd5b8a1561089757610897828a8d611ce3565b89156108a8576108a8818a8c611ce3565b861561096357886001600160a01b031663f05ffd30338d8d8c8c6040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b15801561094a57600080fd5b505af115801561095e573d6000803e3d6000fd5b505050505b61096c82611d6a565b935061097781611d6a565b92505050600089856001600160701b03160383116109965760006109a5565b89856001600160701b03160383035b9050600089856001600160701b03160383116109c25760006109d1565b89856001600160701b03160383035b905060008211806109e25750600081115b610a1d5760405162461bcd60e51b81526004018080602001828103825260218152602001806129d66021913960400191505060405180910390fd5b6000610a51610a3384600363ffffffff611e1416565b610a45876103e863ffffffff611e1416565b9063ffffffff611e7716565b90506000610a69610a3384600363ffffffff611e1416565b9050610a9a620f4240610a8e6001600160701b038b8116908b1663ffffffff611e1416565b9063ffffffff611e1416565b610aaa838363ffffffff611e1416565b1015610ae9576040805162461bcd60e51b8152602060048201526009602482015268456d706972653a204b60b81b604482015290519081900360640190fd5b5050610af784848888611ec7565b60408051838152602081018390528082018d9052606081018c905290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600f55505050505050505050565b604051806040016040528060098152602001680456d70697265204c560bc1b81525081565b6006546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b6000610bb9338484612089565b5060015b92915050565b6004546001600160a01b031681565b60005481565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610c5d576001600160a01b0384166000908152600260209081526040808320338452909152902054610c38908363ffffffff611e7716565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610c688484846120eb565b5060015b9392505050565b601281565b600a5481565b60075481565b60085481565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfb576040805162461bcd60e51b815260206004820152601160248201527022b6b834b9329d102327a92124a22222a760791b604482015290519081900360640190fd5b600480546001600160a01b038087166001600160a01b03199283161790925560058054928616929091169190911790556000826003811115610d3957fe5b14610dc557600a819055600d805483919060ff19166001836003811115610d5c57fe5b02179055506002826003811115610d6f57fe5b1415610d9557600b80546001600160a01b0319166001600160a01b038616179055610dc5565b6003826003811115610da357fe5b1415610dc557600b80546001600160a01b0319166001600160a01b0385161790555b600e55505050565b600454600554600b546000926001600160a01b039081169281169184918291829116851415610e165750506006548291506001600160701b03600160701b820481169116610e98565b600554600b546001600160a01b03908116911614610e7b576040805162461bcd60e51b815260206004820152601a60248201527f456d706972653a204e4f4e5f535745455041424c455f504f4f4c000000000000604482015290519081900360640190fd5b50506006548391506001600160701b0380821691600160701b9004165b600082846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed457600080fd5b505afa158015610ee8573d6000803e3d6000fd5b505050506040513d6020811015610efe57600080fd5b50510390506000610f108285856121a5565b909203965050505050505090565b6000600f54600114610f68576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f55600080610f78610b82565b506004549193509150600090610f96906001600160a01b0316611d6a565b600554909150600090610fb1906001600160a01b0316611d6a565b90506000610fce836001600160701b03871663ffffffff611e7716565b90506000610feb836001600160701b03871663ffffffff611e7716565b90506000610ff9878761220d565b60005490915080611036576110226103e8610a4561101d878763ffffffff611e1416565b61236a565b985061103160006103e86123bb565b61108c565b6110896001600160701b038816611053858463ffffffff611e1416565b8161105a57fe5b046001600160701b038a16611075878563ffffffff611e1416565b8161107c57fe5b049063ffffffff61245116565b98505b600089116110cb5760405162461bcd60e51b81526004018080602001828103825260258152602001806128c66025913960400191505060405180910390fd5b6110d58a8a6123bb565b6110e186868a8a611ec7565b81156111115760065461110d906001600160701b0380821691600160701b90041663ffffffff611e1416565b6009555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600f5550949695505050505050565b600c5481565b60016020526000908152604090205481565b60095481565b60036020526000908152604090205481565b600080600f546001146111d9576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f55600a54421015611235576040805162461bcd60e51b815260206004820152601860248201527f456d706972653a204c49515549444954595f4c4f434b45440000000000000000604482015290519081900360640190fd5b600080611240610b82565b506004546005549294509092506001600160a01b039081169116600061126583611d6a565b9050600061127283611d6a565b3060009081526001602052604081205491925061128f888861220d565b600054909150806112a6848763ffffffff611e1416565b816112ad57fe5b049a50806112c1848663ffffffff611e1416565b816112c857fe5b04995060008b1180156112db575060008a115b6113165760405162461bcd60e51b81526004018080602001828103825260258152602001806128a16025913960400191505060405180910390fd5b6113203084612467565b61132b878d8d611ce3565b611336868d8c611ce3565b61133f87611d6a565b945061134a86611d6a565b935061135885858b8b611ec7565b811561138857600654611384906001600160701b0380821691600160701b90041663ffffffff611e1416565b6009555b604080518c8152602081018c905281516001600160a01b038f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600f81905550915091565b600b546001600160a01b031681565b604051806040016040528060068152602001650454d502d4c560d41b81525081565b6000610bb93384846120eb565b600f5460011461146c576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f556004546005546001600160a01b039182169116338214156114ee57600b546001600160a01b038281169116146114e9576040805162461bcd60e51b815260206004820152601860248201527722b6b834b9329d1024a721a7a92922a1aa2fa1a0a62622a960411b604482015290519081900360640190fd5b61155f565b336001600160a01b0382161480156115135750600b546001600160a01b038381169116145b61155f576040805162461bcd60e51b815260206004820152601860248201527722b6b834b9329d1024a721a7a92922a1aa2fa1a0a62622a960411b604482015290519081900360640190fd5b600b54611577906001600160a01b0316333086612505565b600c5461158a908463ffffffff611e7716565b600c556040805184815290517f712e640bd8c63092eadcdc525c0943175b70eb42a4680684e56ecda9efde45e69181900360200190a150506001600f5550565b600f54600114611612576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f556004546005546006546001600160a01b039283169290911690611653908390859061164e906001600160701b0316610a4584611d6a565b611ce3565b60065461167b908290859061164e90600160701b90046001600160701b0316610a4584611d6a565b50506001600f5550565b600d5460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6005546001600160a01b031681565b600f54600114611709576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f556004546005546001600160a01b039182169116600080338414156117a657600b546001600160a01b03848116911614611789576040805162461bcd60e51b815260206004820152601860248201527722b6b834b9329d1024a721a7a92922a1aa2fa1a0a62622a960411b604482015290519081900360640190fd5b50506006546001600160701b03600160701b820481169116611831565b336001600160a01b0384161480156117cb5750600b546001600160a01b038581169116145b611817576040805162461bcd60e51b815260206004820152601860248201527722b6b834b9329d1024a721a7a92922a1aa2fa1a0a62622a960411b604482015290519081900360640190fd5b50506006546001600160701b0380821691600160701b9004165b600081336001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561186d57600080fd5b505afa158015611881573d6000803e3d6000fd5b505050506040513d602081101561189757600080fd5b505103905060006118ae828563ffffffff611e1416565b905060006118d4836118c8866103e863ffffffff611e1416565b9063ffffffff61258a16565b905060008183816118e157fe5b600c54919004915081870390600090611900908e63ffffffff61258a16565b905081811115611957576040805162461bcd60e51b815260206004820152601e60248201527f456d706972653a20494e434f52524543545f53574545505f414d4f554e540000604482015290519081900360640190fd5b600c819055600b54611973906001600160a01b0316338f611ce3565b336001600160a01b03166311d7ed828e8e8e6040518463ffffffff1660e01b815260040180848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050945050505050600060405180830381600087803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b505050507f7f221332ee403570bf4d61630b58189ea566ff1635269001e9df6a890f413dd88d6040518082815260200191505060405180910390a150506001600f555050505050505050505050565b42841015611a97576040805162461bcd60e51b815260206004820152600f60248201526e115b5c1a5c994e8811561412549151608a1b604482015290519081900360640190fd5b6000611b24604051808061291060529139604080519182900360520182206001600160a01b03808e16600081815260036020908152908590208054600181019091558187019490945285850191909152908d166060850152608084018c905260a084019190915260c08084018b90528251808503909101815260e0909301909152815191012090506125d9565b9050600060018286868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611b85573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611bbb5750886001600160a01b0316816001600160a01b0316145b611c0c576040805162461bcd60e51b815260206004820152601960248201527f456d706972653a20494e56414c49445f5349474e415455524500000000000000604482015290519081900360640190fd5b611c17898989612089565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600e5481565b600f54600114611c8d576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f55600454611cdc90611cab906001600160a01b0316611d6a565b600554611cc0906001600160a01b0316611d6a565b6006546001600160701b0380821691600160701b900416611ec7565b6001600f55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b03851660248201526044808201859052835180830390910181526064909101909252810180516001600160e01b031663a9059cbb60e01b179052611d65908490612676565b505050565b600b546000906001600160a01b0383811691161415611d885750600c545b604080516370a0823160e01b81523060048201529051611e0c916001600160a01b038516916370a0823191602480820192602092909190829003018186803b158015611dd357600080fd5b505afa158015611de7573d6000803e3d6000fd5b505050506040513d6020811015611dfd57600080fd5b5051829063ffffffff61258a16565b90505b919050565b6000811580611e2f57505080820282828281611e2c57fe5b04145b610bbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820382811115610bbd576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6001600160701b038411801590611ee557506001600160701b038311155b611f29576040805162461bcd60e51b815260206004820152601060248201526f456d706972653a204f564552464c4f5760801b604482015290519081900360640190fd5b60065463ffffffff42811691600160e01b90048116820390811615801590611f5957506001600160701b03841615155b8015611f6d57506001600160701b03831615155b15611fde578063ffffffff16611f9b85611f868661279a565b6001600160e01b03169063ffffffff6127ac16565b600780546001600160e01b03929092169290920201905563ffffffff8116611fc684611f868761279a565b600880546001600160e01b0392909216929092020190555b600680546dffffffffffffffffffffffffffff19166001600160701b03888116919091176dffffffffffffffffffffffffffff60701b1916600160701b8883168102919091176001600160e01b0316600160e01b63ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316600090815260016020526040902054612114908263ffffffff611e7716565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612149908263ffffffff61258a16565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000836121b457506000610c6c565b60006121c8856103e563ffffffff611e1416565b905060006121dc828563ffffffff611e1416565b905060006121f6836118c8886103e863ffffffff611e1416565b905080828161220157fe5b04979650505050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561226957600080fd5b505afa15801561227d573d6000803e3d6000fd5b505050506040513d602081101561229357600080fd5b50516009546001600160a01b0382161580159450919250906123565780156123515760006122d661101d6001600160701b0388811690881663ffffffff611e1416565b905060006122e38361236a565b90508082111561234e576000612311612302848463ffffffff611e7716565b6000549063ffffffff611e1416565b9050600061232a836118c886600563ffffffff611e1416565b9050600081838161233757fe5b049050801561234a5761234a87826123bb565b5050505b50505b612362565b80156123625760006009555b505092915050565b600060038211156123ad575080600160028204015b818110156123a75780915060028182858161239657fe5b04018161239f57fe5b04905061237f565b50611e0f565b8115611e0f57506001919050565b6000546123ce908263ffffffff61258a16565b60009081556001600160a01b0383168152600160205260409020546123f9908263ffffffff61258a16565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183106124605781610c6c565b5090919050565b6001600160a01b038216600090815260016020526040902054612490908263ffffffff611e7716565b6001600160a01b038316600090815260016020526040812091909155546124bd908263ffffffff611e7716565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b612584846040518060600160405280602581526020016128eb602591398051602091820120604080516001600160a01b03808a16602483015288166044820152606480820188905282518083039091018152608490910190915291820180516001600160e01b03166001600160e01b0319909216919091179052612676565b50505050565b80820182811015610bbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b600046817f000000000000000000000000000000000000000000000000000000000000000082141561262b577f0000000000000000000000000000000000000000000000000000000000000000612634565b612634826127d1565b6040805161190160f01b602080830191909152602282019390935260428082019790975281518082039097018752606201905284519401939093209392505050565b60006060836001600160a01b0316836040518082805190602001908083835b602083106126b45780518252601f199092019160209182019101612695565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612716576040519150601f19603f3d011682016040523d82523d6000602084013e61271b565b606091505b5091509150818015612749575080511580612749575080806020019051602081101561274657600080fd5b50515b612584576040805162461bcd60e51b815260206004820152601760248201527f456d706972653a205452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b6001600160701b0316600160701b0290565b60006001600160701b0382166001600160e01b038416816127c957fe5b049392505050565b600060405180806129626052913960408051918290036052018220828201825260098352680456d70697265204c560bc1b6020938401528151808301835260018152603160f81b908401528151808401919091527f2f521cff6f8a1416a02f0455c70bc850a9c90063ca4463d44dd97a783ee14463818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018690523060a0808301919091528251808303909101815260c0909101909152805191012091505091905056fe456d706972653a20494e53554646494349454e545f4c49515549444954595f4255524e4544456d706972653a20494e53554646494349454e545f4c49515549444954595f4d494e5445447472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536295065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429456d706972653a20494e53554646494349454e545f4f55545055545f414d4f554e54456d706972653a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220bf71ab7b8f26f1ffa8c4b48cf3862fff6c174dfeaef8bf4c45c29bc04d6e3cd864736f6c63430006080033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80637464fc3d1161010f578063c1226988116100a2578063d505accf11610071578063d505accf1461065c578063dd62ed3e146106ad578063f96e16fc146106db578063fff6cae9146106e3576101f0565b8063c1226988146105a9578063c45a0155146105d5578063d21220a7146105dd578063d2ae9a0d146105e5576101f0565b806395d89b41116100de57806395d89b4114610532578063a9059cbb1461053a578063ae84637f14610566578063bc25cf7714610583576101f0565b80637464fc3d146104bd5780637ecebe00146104c557806389afcb44146104eb5780638b15bb871461052a576101f0565b806357976fb41161018757806363004c1b1161015657806363004c1b146104615780636a627842146104695780636b1be4bb1461048f57806370a0823114610497576101f0565b806357976fb41461040a5780635909c0d5146104125780635a3d54931461041a57806360d780ee14610422576101f0565b80630dfe1681116101c35780630dfe16811461037857806318160ddd1461039c57806323b872dd146103b6578063313ce567146103ec576101f0565b8063022c0d9f146101f557806306fdde03146102835780630902f1ac14610300578063095ea7b314610338575b600080fd5b6102816004803603608081101561020b57600080fd5b8135916020810135916001600160a01b03604083013516919081019060808101606082013564010000000081111561024257600080fd5b82018360208201111561025457600080fd5b8035906020019184600183028401116401000000008311171561027657600080fd5b5090925090506106eb565b005b61028b610b5d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c55781810151838201526020016102ad565b50505050905090810190601f1680156102f25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610308610b82565b604080516001600160701b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b6103646004803603604081101561034e57600080fd5b506001600160a01b038135169060200135610bac565b604080519115158252519081900360200190f35b610380610bc3565b604080516001600160a01b039092168252519081900360200190f35b6103a4610bd2565b60408051918252519081900360200190f35b610364600480360360608110156103cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610bd8565b6103f4610c73565b6040805160ff9092168252519081900360200190f35b6103a4610c78565b6103a4610c7e565b6103a4610c84565b6102816004803603608081101561043857600080fd5b506001600160a01b03813581169160208101359091169060ff6040820135169060600135610c8a565b6103a4610dcd565b6103a46004803603602081101561047f57600080fd5b50356001600160a01b0316610f1e565b6103a461115e565b6103a4600480360360208110156104ad57600080fd5b50356001600160a01b0316611164565b6103a4611176565b6103a4600480360360208110156104db57600080fd5b50356001600160a01b031661117c565b6105116004803603602081101561050157600080fd5b50356001600160a01b031661118e565b6040805192835260208301919091528051918290030190f35b6103806113e6565b61028b6113f5565b6103646004803603604081101561055057600080fd5b506001600160a01b038135169060200135611417565b6102816004803603602081101561057c57600080fd5b5035611424565b6102816004803603602081101561059957600080fd5b50356001600160a01b03166115ca565b6105b1611685565b604051808260038111156105c157fe5b60ff16815260200191505060405180910390f35b61038061168e565b6103806116b2565b610281600480360360408110156105fb57600080fd5b8135919081019060408101602082013564010000000081111561061d57600080fd5b82018360208201111561062f57600080fd5b8035906020019184600183028401116401000000008311171561065157600080fd5b5090925090506116c1565b610281600480360360e081101561067257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611a50565b6103a4600480360360408110156106c357600080fd5b506001600160a01b0381358116916020013516611c22565b6103a4611c3f565b610281611c45565b600f54600114610733576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f55841515806107465750600084115b6107815760405162461bcd60e51b81526004018080602001828103825260228152602001806129b46022913960400191505060405180910390fd5b60008061078c610b82565b5091509150816001600160701b0316871080156107b15750806001600160701b031686105b610802576040805162461bcd60e51b815260206004820152601e60248201527f456d706972653a20494e53554646494349454e545f4c49515549444954590000604482015290519081900360640190fd5b60045460055460009182916001600160a01b039182169190811690891682148015906108405750806001600160a01b0316896001600160a01b031614155b610886576040805162461bcd60e51b8152602060048201526012602482015271456d706972653a20494e56414c49445f544f60701b604482015290519081900360640190fd5b8a1561089757610897828a8d611ce3565b89156108a8576108a8818a8c611ce3565b861561096357886001600160a01b031663f05ffd30338d8d8c8c6040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b15801561094a57600080fd5b505af115801561095e573d6000803e3d6000fd5b505050505b61096c82611d6a565b935061097781611d6a565b92505050600089856001600160701b03160383116109965760006109a5565b89856001600160701b03160383035b9050600089856001600160701b03160383116109c25760006109d1565b89856001600160701b03160383035b905060008211806109e25750600081115b610a1d5760405162461bcd60e51b81526004018080602001828103825260218152602001806129d66021913960400191505060405180910390fd5b6000610a51610a3384600363ffffffff611e1416565b610a45876103e863ffffffff611e1416565b9063ffffffff611e7716565b90506000610a69610a3384600363ffffffff611e1416565b9050610a9a620f4240610a8e6001600160701b038b8116908b1663ffffffff611e1416565b9063ffffffff611e1416565b610aaa838363ffffffff611e1416565b1015610ae9576040805162461bcd60e51b8152602060048201526009602482015268456d706972653a204b60b81b604482015290519081900360640190fd5b5050610af784848888611ec7565b60408051838152602081018390528082018d9052606081018c905290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600f55505050505050505050565b604051806040016040528060098152602001680456d70697265204c560bc1b81525081565b6006546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b6000610bb9338484612089565b5060015b92915050565b6004546001600160a01b031681565b60005481565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610c5d576001600160a01b0384166000908152600260209081526040808320338452909152902054610c38908363ffffffff611e7716565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610c688484846120eb565b5060015b9392505050565b601281565b600a5481565b60075481565b60085481565b336001600160a01b037f000000000000000000000000d674b01e778cf43d3e6544985f893355f46a74a51614610cfb576040805162461bcd60e51b815260206004820152601160248201527022b6b834b9329d102327a92124a22222a760791b604482015290519081900360640190fd5b600480546001600160a01b038087166001600160a01b03199283161790925560058054928616929091169190911790556000826003811115610d3957fe5b14610dc557600a819055600d805483919060ff19166001836003811115610d5c57fe5b02179055506002826003811115610d6f57fe5b1415610d9557600b80546001600160a01b0319166001600160a01b038616179055610dc5565b6003826003811115610da357fe5b1415610dc557600b80546001600160a01b0319166001600160a01b0385161790555b600e55505050565b600454600554600b546000926001600160a01b039081169281169184918291829116851415610e165750506006548291506001600160701b03600160701b820481169116610e98565b600554600b546001600160a01b03908116911614610e7b576040805162461bcd60e51b815260206004820152601a60248201527f456d706972653a204e4f4e5f535745455041424c455f504f4f4c000000000000604482015290519081900360640190fd5b50506006548391506001600160701b0380821691600160701b9004165b600082846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed457600080fd5b505afa158015610ee8573d6000803e3d6000fd5b505050506040513d6020811015610efe57600080fd5b50510390506000610f108285856121a5565b909203965050505050505090565b6000600f54600114610f68576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f55600080610f78610b82565b506004549193509150600090610f96906001600160a01b0316611d6a565b600554909150600090610fb1906001600160a01b0316611d6a565b90506000610fce836001600160701b03871663ffffffff611e7716565b90506000610feb836001600160701b03871663ffffffff611e7716565b90506000610ff9878761220d565b60005490915080611036576110226103e8610a4561101d878763ffffffff611e1416565b61236a565b985061103160006103e86123bb565b61108c565b6110896001600160701b038816611053858463ffffffff611e1416565b8161105a57fe5b046001600160701b038a16611075878563ffffffff611e1416565b8161107c57fe5b049063ffffffff61245116565b98505b600089116110cb5760405162461bcd60e51b81526004018080602001828103825260258152602001806128c66025913960400191505060405180910390fd5b6110d58a8a6123bb565b6110e186868a8a611ec7565b81156111115760065461110d906001600160701b0380821691600160701b90041663ffffffff611e1416565b6009555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600f5550949695505050505050565b600c5481565b60016020526000908152604090205481565b60095481565b60036020526000908152604090205481565b600080600f546001146111d9576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f55600a54421015611235576040805162461bcd60e51b815260206004820152601860248201527f456d706972653a204c49515549444954595f4c4f434b45440000000000000000604482015290519081900360640190fd5b600080611240610b82565b506004546005549294509092506001600160a01b039081169116600061126583611d6a565b9050600061127283611d6a565b3060009081526001602052604081205491925061128f888861220d565b600054909150806112a6848763ffffffff611e1416565b816112ad57fe5b049a50806112c1848663ffffffff611e1416565b816112c857fe5b04995060008b1180156112db575060008a115b6113165760405162461bcd60e51b81526004018080602001828103825260258152602001806128a16025913960400191505060405180910390fd5b6113203084612467565b61132b878d8d611ce3565b611336868d8c611ce3565b61133f87611d6a565b945061134a86611d6a565b935061135885858b8b611ec7565b811561138857600654611384906001600160701b0380821691600160701b90041663ffffffff611e1416565b6009555b604080518c8152602081018c905281516001600160a01b038f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600f81905550915091565b600b546001600160a01b031681565b604051806040016040528060068152602001650454d502d4c560d41b81525081565b6000610bb93384846120eb565b600f5460011461146c576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f556004546005546001600160a01b039182169116338214156114ee57600b546001600160a01b038281169116146114e9576040805162461bcd60e51b815260206004820152601860248201527722b6b834b9329d1024a721a7a92922a1aa2fa1a0a62622a960411b604482015290519081900360640190fd5b61155f565b336001600160a01b0382161480156115135750600b546001600160a01b038381169116145b61155f576040805162461bcd60e51b815260206004820152601860248201527722b6b834b9329d1024a721a7a92922a1aa2fa1a0a62622a960411b604482015290519081900360640190fd5b600b54611577906001600160a01b0316333086612505565b600c5461158a908463ffffffff611e7716565b600c556040805184815290517f712e640bd8c63092eadcdc525c0943175b70eb42a4680684e56ecda9efde45e69181900360200190a150506001600f5550565b600f54600114611612576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f556004546005546006546001600160a01b039283169290911690611653908390859061164e906001600160701b0316610a4584611d6a565b611ce3565b60065461167b908290859061164e90600160701b90046001600160701b0316610a4584611d6a565b50506001600f5550565b600d5460ff1681565b7f000000000000000000000000d674b01e778cf43d3e6544985f893355f46a74a581565b6005546001600160a01b031681565b600f54600114611709576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f556004546005546001600160a01b039182169116600080338414156117a657600b546001600160a01b03848116911614611789576040805162461bcd60e51b815260206004820152601860248201527722b6b834b9329d1024a721a7a92922a1aa2fa1a0a62622a960411b604482015290519081900360640190fd5b50506006546001600160701b03600160701b820481169116611831565b336001600160a01b0384161480156117cb5750600b546001600160a01b038581169116145b611817576040805162461bcd60e51b815260206004820152601860248201527722b6b834b9329d1024a721a7a92922a1aa2fa1a0a62622a960411b604482015290519081900360640190fd5b50506006546001600160701b0380821691600160701b9004165b600081336001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561186d57600080fd5b505afa158015611881573d6000803e3d6000fd5b505050506040513d602081101561189757600080fd5b505103905060006118ae828563ffffffff611e1416565b905060006118d4836118c8866103e863ffffffff611e1416565b9063ffffffff61258a16565b905060008183816118e157fe5b600c54919004915081870390600090611900908e63ffffffff61258a16565b905081811115611957576040805162461bcd60e51b815260206004820152601e60248201527f456d706972653a20494e434f52524543545f53574545505f414d4f554e540000604482015290519081900360640190fd5b600c819055600b54611973906001600160a01b0316338f611ce3565b336001600160a01b03166311d7ed828e8e8e6040518463ffffffff1660e01b815260040180848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050945050505050600060405180830381600087803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b505050507f7f221332ee403570bf4d61630b58189ea566ff1635269001e9df6a890f413dd88d6040518082815260200191505060405180910390a150506001600f555050505050505050505050565b42841015611a97576040805162461bcd60e51b815260206004820152600f60248201526e115b5c1a5c994e8811561412549151608a1b604482015290519081900360640190fd5b6000611b24604051808061291060529139604080519182900360520182206001600160a01b03808e16600081815260036020908152908590208054600181019091558187019490945285850191909152908d166060850152608084018c905260a084019190915260c08084018b90528251808503909101815260e0909301909152815191012090506125d9565b9050600060018286868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611b85573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611bbb5750886001600160a01b0316816001600160a01b0316145b611c0c576040805162461bcd60e51b815260206004820152601960248201527f456d706972653a20494e56414c49445f5349474e415455524500000000000000604482015290519081900360640190fd5b611c17898989612089565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600e5481565b600f54600114611c8d576040805162461bcd60e51b815260206004820152600e60248201526d115b5c1a5c994e881313d0d2d15160921b604482015290519081900360640190fd5b6002600f55600454611cdc90611cab906001600160a01b0316611d6a565b600554611cc0906001600160a01b0316611d6a565b6006546001600160701b0380821691600160701b900416611ec7565b6001600f55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b03851660248201526044808201859052835180830390910181526064909101909252810180516001600160e01b031663a9059cbb60e01b179052611d65908490612676565b505050565b600b546000906001600160a01b0383811691161415611d885750600c545b604080516370a0823160e01b81523060048201529051611e0c916001600160a01b038516916370a0823191602480820192602092909190829003018186803b158015611dd357600080fd5b505afa158015611de7573d6000803e3d6000fd5b505050506040513d6020811015611dfd57600080fd5b5051829063ffffffff61258a16565b90505b919050565b6000811580611e2f57505080820282828281611e2c57fe5b04145b610bbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820382811115610bbd576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6001600160701b038411801590611ee557506001600160701b038311155b611f29576040805162461bcd60e51b815260206004820152601060248201526f456d706972653a204f564552464c4f5760801b604482015290519081900360640190fd5b60065463ffffffff42811691600160e01b90048116820390811615801590611f5957506001600160701b03841615155b8015611f6d57506001600160701b03831615155b15611fde578063ffffffff16611f9b85611f868661279a565b6001600160e01b03169063ffffffff6127ac16565b600780546001600160e01b03929092169290920201905563ffffffff8116611fc684611f868761279a565b600880546001600160e01b0392909216929092020190555b600680546dffffffffffffffffffffffffffff19166001600160701b03888116919091176dffffffffffffffffffffffffffff60701b1916600160701b8883168102919091176001600160e01b0316600160e01b63ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316600090815260016020526040902054612114908263ffffffff611e7716565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612149908263ffffffff61258a16565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000836121b457506000610c6c565b60006121c8856103e563ffffffff611e1416565b905060006121dc828563ffffffff611e1416565b905060006121f6836118c8886103e863ffffffff611e1416565b905080828161220157fe5b04979650505050505050565b6000807f000000000000000000000000d674b01e778cf43d3e6544985f893355f46a74a56001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561226957600080fd5b505afa15801561227d573d6000803e3d6000fd5b505050506040513d602081101561229357600080fd5b50516009546001600160a01b0382161580159450919250906123565780156123515760006122d661101d6001600160701b0388811690881663ffffffff611e1416565b905060006122e38361236a565b90508082111561234e576000612311612302848463ffffffff611e7716565b6000549063ffffffff611e1416565b9050600061232a836118c886600563ffffffff611e1416565b9050600081838161233757fe5b049050801561234a5761234a87826123bb565b5050505b50505b612362565b80156123625760006009555b505092915050565b600060038211156123ad575080600160028204015b818110156123a75780915060028182858161239657fe5b04018161239f57fe5b04905061237f565b50611e0f565b8115611e0f57506001919050565b6000546123ce908263ffffffff61258a16565b60009081556001600160a01b0383168152600160205260409020546123f9908263ffffffff61258a16565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183106124605781610c6c565b5090919050565b6001600160a01b038216600090815260016020526040902054612490908263ffffffff611e7716565b6001600160a01b038316600090815260016020526040812091909155546124bd908263ffffffff611e7716565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b612584846040518060600160405280602581526020016128eb602591398051602091820120604080516001600160a01b03808a16602483015288166044820152606480820188905282518083039091018152608490910190915291820180516001600160e01b03166001600160e01b0319909216919091179052612676565b50505050565b80820182811015610bbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b600046817f000000000000000000000000000000000000000000000000000000000000000182141561262b577f722aed1ee929c28480be23f635e33b7167c69c7d06d2a479abc4588e1e1e53e5612634565b612634826127d1565b6040805161190160f01b602080830191909152602282019390935260428082019790975281518082039097018752606201905284519401939093209392505050565b60006060836001600160a01b0316836040518082805190602001908083835b602083106126b45780518252601f199092019160209182019101612695565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612716576040519150601f19603f3d011682016040523d82523d6000602084013e61271b565b606091505b5091509150818015612749575080511580612749575080806020019051602081101561274657600080fd5b50515b612584576040805162461bcd60e51b815260206004820152601760248201527f456d706972653a205452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b6001600160701b0316600160701b0290565b60006001600160701b0382166001600160e01b038416816127c957fe5b049392505050565b600060405180806129626052913960408051918290036052018220828201825260098352680456d70697265204c560bc1b6020938401528151808301835260018152603160f81b908401528151808401919091527f2f521cff6f8a1416a02f0455c70bc850a9c90063ca4463d44dd97a783ee14463818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018690523060a0808301919091528251808303909101815260c0909101909152805191012091505091905056fe456d706972653a20494e53554646494349454e545f4c49515549444954595f4255524e4544456d706972653a20494e53554646494349454e545f4c49515549444954595f4d494e5445447472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536295065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429456d706972653a20494e53554646494349454e545f4f55545055545f414d4f554e54456d706972653a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220bf71ab7b8f26f1ffa8c4b48cf3862fff6c174dfeaef8bf4c45c29bc04d6e3cd864736f6c63430006080033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.