BNB Price: $717.60 (+0.28%)
Gas: 1 GWei
 

Overview

BNB Balance

BNB Smart Chain LogoBNB Smart Chain LogoBNB Smart Chain Logo0 BNB

BNB Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Taker Withdraw447185422024-12-09 9:28:596 days ago1733736539IN
Mdex: Swap Mining
0 BNB0.000548973
Taker Withdraw446790162024-12-08 0:32:027 days ago1733617922IN
Mdex: Swap Mining
0 BNB0.000492082
Taker Withdraw446553312024-12-07 4:47:478 days ago1733546867IN
Mdex: Swap Mining
0 BNB0.000341983
Taker Withdraw446553042024-12-07 4:46:268 days ago1733546786IN
Mdex: Swap Mining
0 BNB0.000738133
Taker Withdraw446101062024-12-05 15:06:1310 days ago1733411173IN
Mdex: Swap Mining
0 BNB0.000738133
Taker Withdraw445941072024-12-05 1:45:4810 days ago1733363148IN
Mdex: Swap Mining
0 BNB0.000391671
Taker Withdraw445322452024-12-02 22:12:3013 days ago1733177550IN
Mdex: Swap Mining
0 BNB0.000201281.1
Taker Withdraw444697582024-11-30 18:08:0515 days ago1732990085IN
Mdex: Swap Mining
0 BNB0.000182991
Taker Withdraw444122702024-11-28 18:13:3117 days ago1732817611IN
Mdex: Swap Mining
0 BNB0.000231611
Taker Withdraw444047652024-11-28 11:58:1617 days ago1732795096IN
Mdex: Swap Mining
0 BNB0.000200091
Taker Withdraw443669262024-11-27 4:25:5018 days ago1732681550IN
Mdex: Swap Mining
0 BNB0.000217261.01280275
Taker Withdraw443643952024-11-27 2:19:1718 days ago1732673957IN
Mdex: Swap Mining
0 BNB0.000113991
Taker Withdraw443643912024-11-27 2:19:0518 days ago1732673945IN
Mdex: Swap Mining
0 BNB0.000277571
Taker Withdraw443520442024-11-26 16:01:4419 days ago1732636904IN
Mdex: Swap Mining
0 BNB0.000561861.5
Taker Withdraw442510542024-11-23 3:52:0822 days ago1732333928IN
Mdex: Swap Mining
0 BNB0.000233931.01
Taker Withdraw442480182024-11-23 1:20:2022 days ago1732324820IN
Mdex: Swap Mining
0 BNB0.000217381.01336666
Taker Withdraw442065162024-11-21 14:44:5724 days ago1732200297IN
Mdex: Swap Mining
0 BNB0.000231611
Taker Withdraw441774362024-11-20 14:30:5625 days ago1732113056IN
Mdex: Swap Mining
0 BNB0.000280351.01
Taker Withdraw441056942024-11-18 2:43:4627 days ago1731897826IN
Mdex: Swap Mining
0 BNB0.000312111.002
Taker Withdraw440914032024-11-17 14:49:1328 days ago1731854953IN
Mdex: Swap Mining
0 BNB0.000216661.01
Taker Withdraw439781182024-11-13 16:24:5032 days ago1731515090IN
Mdex: Swap Mining
0 BNB0.000214941.002
Set Halving Peri...439668602024-11-13 7:01:5432 days ago1731481314IN
Mdex: Swap Mining
0 BNB0.00007162.5
Taker Withdraw439139002024-11-11 10:53:4334 days ago1731322423IN
Mdex: Swap Mining
0 BNB0.000266431.012525
Taker Withdraw438333132024-11-08 15:44:0337 days ago1731080643IN
Mdex: Swap Mining
0 BNB0.000326211
Taker Withdraw437593322024-11-06 1:53:2639 days ago1730858006IN
Mdex: Swap Mining
0 BNB0.000452381
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SwapMining

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-04-08
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;

contract Ownable {
    address private _owner;

    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function isOwner(address account) public view returns (bool) {
        return account == _owner;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }


    modifier onlyOwner() {
        require(isOwner(msg.sender), "Ownable: caller is not the owner");
        _;
    }

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

library SafeMath {
    uint256 constant WAD = 10 ** 18;
    uint256 constant RAY = 10 ** 27;

    function wad() public pure returns (uint256) {
        return WAD;
    }

    function ray() public pure returns (uint256) {
        return RAY;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a <= b ? a : b;
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    function sqrt(uint256 a) internal pure returns (uint256 b) {
        if (a > 3) {
            b = a;
            uint256 x = a / 2 + 1;
            while (x < b) {
                b = x;
                x = (a / x + x) / 2;
            }
        } else if (a != 0) {
            b = 1;
        }
    }

    function wmul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b) / WAD;
    }

    function wmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, b), WAD / 2) / WAD;
    }

    function rmul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b) / RAY;
    }

    function rmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, b), RAY / 2) / RAY;
    }

    function wdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(mul(a, WAD), b);
    }

    function wdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, WAD), b / 2) / b;
    }

    function rdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(mul(a, RAY), b);
    }

    function rdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, RAY), b / 2) / b;
    }

    function wpow(uint256 x, uint256 n) internal pure returns (uint256) {
        uint256 result = WAD;
        while (n > 0) {
            if (n % 2 != 0) {
                result = wmul(result, x);
            }
            x = wmul(x, x);
            n /= 2;
        }
        return result;
    }

    function rpow(uint256 x, uint256 n) internal pure returns (uint256) {
        uint256 result = RAY;
        while (n > 0) {
            if (n % 2 != 0) {
                result = rmul(result, x);
            }
            x = rmul(x, x);
            n /= 2;
        }
        return result;
    }
}

library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {// Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1;
            // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint256(_at(set._inner, index)));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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

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

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

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint);

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

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

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

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

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

interface IMdx is IERC20 {
    function mint(address to, uint256 amount) external returns (bool);
}

interface IMdexFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function FEE_RATE_DENOMINATOR() external view returns (uint256);

    function feeRateNumerator() external view returns (uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function feeToRate() external view returns (uint256);

    function initCodeHash() external view returns (bytes32);

    function pairFeeToRate(address) external view returns (uint256);

    function pairFees(address) external view returns (uint256);

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

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

    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function addPair(address) external returns (bool);

    function delPair(address) external returns (bool);

    function getSupportListLength() external view returns (uint256);

    function isSupportPair(address pair) external view returns (bool);

    function getSupportPair(uint256 index) external view returns (address);

    function setFeeRateNumerator(uint256) external;

    function setPairFees(address pair, uint256 fee) external;

    function setDefaultFeeToRate(uint256) external;

    function setPairFeeToRate(address pair, uint256 rate) external;

    function getPairFees(address) external view returns (uint256);

    function getPairRate(address) external view returns (uint256);

    function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1);

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

    function getReserves(address tokenA, address tokenB) external view returns (uint256 reserveA, uint256 reserveB);

    function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB);

    function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, address token0, address token1) external view returns (uint256 amountOut);

    function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, address token0, address token1) external view returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}

interface IMdexPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    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 (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IOracle {
    function consult(address tokenIn, uint amountIn, address tokenOut) external view returns (uint amountOut);
}

contract SwapMining is Ownable {
    using SafeMath for uint256;
    using EnumerableSet for EnumerableSet.AddressSet;
    EnumerableSet.AddressSet private _whitelist;

    // MDX tokens created per block
    uint256 public mdxPerBlock;
    // The block number when MDX mining starts.
    uint256 public startBlock;
    // How many blocks are halved
    uint256 public halvingPeriod = 1670400;
    // Total allocation points
    uint256 public totalAllocPoint = 0;
    IOracle public oracle;
    // router address
    address public router;
    // factory address
    IMdexFactory public factory;
    // mdx token address
    IMdx public mdx;
    // Calculate price based on BUSD-T
    address public targetToken;
    // pair corresponding pid
    mapping(address => uint256) public pairOfPid;

    constructor(
        IMdx _mdx,
        IMdexFactory _factory,
        IOracle _oracle,
        address _router,
        address _targetToken,
        uint256 _mdxPerBlock,
        uint256 _startBlock
    ) public {
        mdx = _mdx;
        factory = _factory;
        oracle = _oracle;
        router = _router;
        targetToken = _targetToken;
        mdxPerBlock = _mdxPerBlock;
        startBlock = _startBlock;
    }

    struct UserInfo {
        uint256 quantity;       // How many LP tokens the user has provided
        uint256 blockNumber;    // Last transaction block
    }

    struct PoolInfo {
        address pair;           // Trading pairs that can be mined
        uint256 quantity;       // Current amount of LPs
        uint256 totalQuantity;  // All quantity
        uint256 allocPoint;     // How many allocation points assigned to this pool
        uint256 allocMdxAmount; // How many MDXs
        uint256 lastRewardBlock;// Last transaction block
    }

    PoolInfo[] public poolInfo;
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;


    function poolLength() public view returns (uint256) {
        return poolInfo.length;
    }


    function addPair(uint256 _allocPoint, address _pair, bool _withUpdate) public onlyOwner {
        require(_pair != address(0), "_pair is the zero address");
        if (_withUpdate) {
            massMintPools();
        }
        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        poolInfo.push(PoolInfo({
        pair : _pair,
        quantity : 0,
        totalQuantity : 0,
        allocPoint : _allocPoint,
        allocMdxAmount : 0,
        lastRewardBlock : lastRewardBlock
        }));
        pairOfPid[_pair] = poolLength() - 1;
    }

    // Update the allocPoint of the pool
    function setPair(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner {
        if (_withUpdate) {
            massMintPools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
    }

    // Set the number of mdx produced by each block
    function setMdxPerBlock(uint256 _newPerBlock) public onlyOwner {
        massMintPools();
        mdxPerBlock = _newPerBlock;
    }

    // Only tokens in the whitelist can be mined MDX
    function addWhitelist(address _addToken) public onlyOwner returns (bool) {
        require(_addToken != address(0), "SwapMining: token is the zero address");
        return EnumerableSet.add(_whitelist, _addToken);
    }

    function delWhitelist(address _delToken) public onlyOwner returns (bool) {
        require(_delToken != address(0), "SwapMining: token is the zero address");
        return EnumerableSet.remove(_whitelist, _delToken);
    }

    function getWhitelistLength() public view returns (uint256) {
        return EnumerableSet.length(_whitelist);
    }

    function isWhitelist(address _token) public view returns (bool) {
        return EnumerableSet.contains(_whitelist, _token);
    }

    function getWhitelist(uint256 _index) public view returns (address){
        require(_index <= getWhitelistLength() - 1, "SwapMining: index out of bounds");
        return EnumerableSet.at(_whitelist, _index);
    }

    function setHalvingPeriod(uint256 _block) public onlyOwner {
        halvingPeriod = _block;
    }

    function setRouter(address newRouter) public onlyOwner {
        require(newRouter != address(0), "SwapMining: new router is the zero address");
        router = newRouter;
    }

    function setOracle(IOracle _oracle) public onlyOwner {
        require(address(_oracle) != address(0), "SwapMining: new oracle is the zero address");
        oracle = _oracle;
    }

    // At what phase
    function phase(uint256 blockNumber) public view returns (uint256) {
        if (halvingPeriod == 0) {
            return 0;
        }
        if (blockNumber > startBlock) {
            return (blockNumber.sub(startBlock).sub(1)).div(halvingPeriod);
        }
        return 0;
    }

    function phase() public view returns (uint256) {
        return phase(block.number);
    }

    function reward(uint256 blockNumber) public view returns (uint256) {
        uint256 _phase = phase(blockNumber);
        return mdxPerBlock.div(2 ** _phase);
    }

    function reward() public view returns (uint256) {
        return reward(block.number);
    }

    // Rewards for the current block
    function getMdxReward(uint256 _lastRewardBlock) public view returns (uint256) {
        require(_lastRewardBlock <= block.number, "SwapMining: must little than the current block number");
        uint256 blockReward = 0;
        uint256 n = phase(_lastRewardBlock);
        uint256 m = phase(block.number);
        // If it crosses the cycle
        while (n < m) {
            n++;
            // Get the last block of the previous cycle
            uint256 r = n.mul(halvingPeriod).add(startBlock);
            // Get rewards from previous periods
            blockReward = blockReward.add((r.sub(_lastRewardBlock)).mul(reward(r)));
            _lastRewardBlock = r;
        }
        blockReward = blockReward.add((block.number.sub(_lastRewardBlock)).mul(reward(block.number)));
        return blockReward;
    }

    // Update all pools Called when updating allocPoint and setting new blocks
    function massMintPools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            mint(pid);
        }
    }

    function mint(uint256 _pid) public returns (bool) {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.number <= pool.lastRewardBlock) {
            return false;
        }
        uint256 blockReward = getMdxReward(pool.lastRewardBlock);
        if (blockReward <= 0) {
            return false;
        }
        // Calculate the rewards obtained by the pool based on the allocPoint
        uint256 mdxReward = blockReward.mul(pool.allocPoint).div(totalAllocPoint);
        mdx.mint(address(this), mdxReward);
        // Increase the number of tokens in the current pool
        pool.allocMdxAmount = pool.allocMdxAmount.add(mdxReward);
        pool.lastRewardBlock = block.number;
        return true;
    }

    // swapMining only router
    function swap(address account, address input, address output, uint256 amount) public onlyRouter returns (bool) {
        require(account != address(0), "SwapMining: taker swap account is the zero address");
        require(input != address(0), "SwapMining: taker swap input is the zero address");
        require(output != address(0), "SwapMining: taker swap output is the zero address");

        if (poolLength() <= 0) {
            return false;
        }

        if (!isWhitelist(input) || !isWhitelist(output)) {
            return false;
        }

        address pair = IMdexFactory(factory).pairFor(input, output);

        PoolInfo storage pool = poolInfo[pairOfPid[pair]];
        // If it does not exist or the allocPoint is 0 then return
        if (pool.pair != pair || pool.allocPoint <= 0) {
            return false;
        }

        uint256 quantity = getQuantity(output, amount, targetToken);
        if (quantity <= 0) {
            return false;
        }

        mint(pairOfPid[pair]);

        pool.quantity = pool.quantity.add(quantity);
        pool.totalQuantity = pool.totalQuantity.add(quantity);
        UserInfo storage user = userInfo[pairOfPid[pair]][account];
        user.quantity = user.quantity.add(quantity);
        user.blockNumber = block.number;
        return true;
    }

    // The user withdraws all the transaction rewards of the pool
    function takerWithdraw() public {
        uint256 userSub;
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            PoolInfo storage pool = poolInfo[pid];
            UserInfo storage user = userInfo[pid][msg.sender];
            if (user.quantity > 0) {
                mint(pid);
                // The reward held by the user in this pool
                uint256 userReward = pool.allocMdxAmount.mul(user.quantity).div(pool.quantity);
                pool.quantity = pool.quantity.sub(user.quantity);
                pool.allocMdxAmount = pool.allocMdxAmount.sub(userReward);
                user.quantity = 0;
                user.blockNumber = block.number;
                userSub = userSub.add(userReward);
            }
        }
        if (userSub <= 0) {
            return;
        }
        mdx.transfer(msg.sender, userSub);
    }

    // Get rewards from users in the current pool
    function getUserReward(uint256 _pid) public view returns (uint256, uint256){
        require(_pid <= poolInfo.length - 1, "SwapMining: Not find this pool");
        uint256 userSub;
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo memory user = userInfo[_pid][msg.sender];
        if (user.quantity > 0) {
            uint256 blockReward = getMdxReward(pool.lastRewardBlock);
            uint256 mdxReward = blockReward.mul(pool.allocPoint).div(totalAllocPoint);
            userSub = userSub.add((pool.allocMdxAmount.add(mdxReward)).mul(user.quantity).div(pool.quantity));
        }
        //Mdx available to users, User transaction amount
        return (userSub, user.quantity);
    }

    // Get details of the pool
    function getPoolInfo(uint256 _pid) public view returns (address, address, uint256, uint256, uint256, uint256){
        require(_pid <= poolInfo.length - 1, "SwapMining: Not find this pool");
        PoolInfo memory pool = poolInfo[_pid];
        address token0 = IMdexPair(pool.pair).token0();
        address token1 = IMdexPair(pool.pair).token1();
        uint256 mdxAmount = pool.allocMdxAmount;
        uint256 blockReward = getMdxReward(pool.lastRewardBlock);
        uint256 mdxReward = blockReward.mul(pool.allocPoint).div(totalAllocPoint);
        mdxAmount = mdxAmount.add(mdxReward);
        //token0,token1,Pool remaining reward,Total /Current transaction volume of the pool
        return (token0, token1, mdxAmount, pool.totalQuantity, pool.quantity, pool.allocPoint);
    }

    modifier onlyRouter() {
        require(msg.sender == router, "SwapMining: caller is not the router");
        _;
    }

    function getQuantity(address outputToken, uint256 outputAmount, address anchorToken) public view returns (uint256) {
        uint256 quantity = 0;
        if (outputToken == anchorToken) {
            quantity = outputAmount;
        } else if (IMdexFactory(factory).getPair(outputToken, anchorToken) != address(0)) {
            quantity = IOracle(oracle).consult(outputToken, outputAmount, anchorToken);
        } else {
            uint256 length = getWhitelistLength();
            for (uint256 index = 0; index < length; index++) {
                address intermediate = getWhitelist(index);
                if (IMdexFactory(factory).getPair(outputToken, intermediate) != address(0) && IMdexFactory(factory).getPair(intermediate, anchorToken) != address(0)) {
                    uint256 interQuantity = IOracle(oracle).consult(outputToken, outputAmount, intermediate);
                    quantity = IOracle(oracle).consult(intermediate, interQuantity, anchorToken);
                    break;
                }
            }
        }
        return quantity;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IMdx","name":"_mdx","type":"address"},{"internalType":"contract IMdexFactory","name":"_factory","type":"address"},{"internalType":"contract IOracle","name":"_oracle","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_targetToken","type":"address"},{"internalType":"uint256","name":"_mdxPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"addPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addToken","type":"address"}],"name":"addWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delToken","type":"address"}],"name":"delWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IMdexFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastRewardBlock","type":"uint256"}],"name":"getMdxReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"outputToken","type":"address"},{"internalType":"uint256","name":"outputAmount","type":"uint256"},{"internalType":"address","name":"anchorToken","type":"address"}],"name":"getQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getUserReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getWhitelist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"halvingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massMintPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mdx","outputs":[{"internalType":"contract IMdx","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mdxPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pairOfPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"phase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"totalQuantity","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"allocMdxAmount","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"setHalvingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPerBlock","type":"uint256"}],"name":"setMdxPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOracle","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"input","type":"address"},{"internalType":"address","name":"output","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"takerWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"targetToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405262197d00600555600060065534801561001c57600080fd5b506040516126c93803806126c9833981810160405260e081101561003f57600080fd5b50805160208201516040808401516060850151608086015160a087015160c090970151600080546001600160a01b031916331780825595519798969794969395929491926001600160a01b0316917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600a80546001600160a01b03199081166001600160a01b03998a1617909155600980548216978916979097179096556007805487169588169590951790945560088054861693871693909317909255600b80549094169416939093179091556003919091556004556125a0806101296000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806396db752a1161013b578063b5ec5c99116100b8578063e377fe351161007c578063e377fe3514610658578063f2fde38b14610675578063f80f5dd51461069b578063f887ea40146106c1578063f9d181f9146106c957610248565b8063b5ec5c99146105df578063b872dd0e146105fc578063c0d7865514610604578063c45a01551461062a578063c683630d1461063257610248565b8063a13202e9116100ff578063a13202e914610540578063a7ef67f614610548578063a9678a181461057e578063a9fb763c146105ba578063b1c9fe6e146105d757610248565b806396db752a146104bb57806397ecfaab146104d85780639f4ece2e146104fe5780639fb08cb714610506578063a0712d681461052357610248565b806348cd4cb1116101c95780637adbf9731161018d5780637adbf973146104385780637dc0d1d01461045e5780638da5cb5b146104665780638fa39a881461046e57806393f1a40b1461047657610248565b806348cd4cb1146103fb5780635672ab55146104035780635a3e251f1461040b578063715018a614610413578063791ba3741461041b57610248565b8063190cf6c911610210578063190cf6c91461030c578063228cb733146103395780632f380b35146103415780632f54bf6e1461039d578063327107f7146103d757610248565b80630495de501461024d578063081e3eda14610285578063135f8aa71461028d5780631526fe27146102aa57806317caf6f114610304575b600080fd5b6102736004803603602081101561026357600080fd5b50356001600160a01b03166106fd565b60408051918252519081900360200190f35b61027361070f565b610273600480360360208110156102a357600080fd5b5035610715565b6102c7600480360360208110156102c057600080fd5b5035610770565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6102736107bd565b6103376004803603606081101561032257600080fd5b508035906020810135906040013515156107c3565b005b610273610884565b61035e6004803603602081101561035757600080fd5b5035610894565b604080516001600160a01b039788168152959096166020860152848601939093526060840191909152608083015260a082015290519081900360c00190f35b6103c3600480360360208110156103b357600080fd5b50356001600160a01b0316610ab0565b604080519115158252519081900360200190f35b6103df610ac4565b604080516001600160a01b039092168252519081900360200190f35b610273610ad3565b6103df610ad9565b610273610ae8565b610337610aee565b6103376004803603602081101561043157600080fd5b5035610b80565b6103376004803603602081101561044e57600080fd5b50356001600160a01b0316610bd5565b6103df610c84565b6103df610c93565b610273610ca2565b6104a26004803603604081101561048c57600080fd5b50803590602001356001600160a01b0316610ca8565b6040805192835260208301919091528051918290030190f35b6103df600480360360208110156104d157600080fd5b5035610ccc565b6103c3600480360360208110156104ee57600080fd5b50356001600160a01b0316610d3e565b610337610dd8565b6104a26004803603602081101561051c57600080fd5b5035610dfc565b6103c36004803603602081101561053957600080fd5b5035610f90565b6102736110b0565b6102736004803603606081101561055e57600080fd5b506001600160a01b038135811691602081013591604090910135166110bc565b6103c36004803603608081101561059457600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561147f565b610273600480360360208110156105d057600080fd5b5035611796565b6102736117c3565b610337600480360360208110156105f557600080fd5b50356117ce565b61033761181b565b6103376004803603602081101561061a57600080fd5b50356001600160a01b031661197c565b6103df611a2b565b6103c36004803603602081101561064857600080fd5b50356001600160a01b0316611a3a565b6102736004803603602081101561066e57600080fd5b5035611a47565b6103376004803603602081101561068b57600080fd5b50356001600160a01b0316611b1f565b6103c3600480360360208110156106b157600080fd5b50356001600160a01b0316611b73565b6103df611c0d565b610337600480360360608110156106df57600080fd5b508035906001600160a01b0360208201351690604001351515611c1c565b600c6020526000908152604090205481565b600d5490565b60006005546000141561072a5750600061076b565b6004548211156107675761076060055461075a600161075460045487611e6a90919063ffffffff16565b90611e6a565b90611eac565b905061076b565b5060005b919050565b600d818154811061077d57fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909286565b60065481565b6107cc33610ab0565b61080b576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b801561081957610819610dd8565b61085682610850600d868154811061082d57fe5b906000526020600020906006020160030154600654611e6a90919063ffffffff16565b90611eee565b60068190555081600d848154811061086a57fe5b906000526020600020906006020160030181905550505050565b600061088f43611796565b905090565b6000806000806000806001600d80549050038711156108fa576040805162461bcd60e51b815260206004820152601e60248201527f537761704d696e696e673a204e6f742066696e64207468697320706f6f6c0000604482015290519081900360640190fd5b610902612323565b600d888154811061090f57fe5b600091825260208083206040805160c081018252600690940290910180546001600160a01b031680855260018201548585015260028201548584015260038201546060860152600480830154608087015260059092015460a08601528251630dfe168160e01b8152925194965093630dfe16819383830193909290829003018186803b15801561099e57600080fd5b505afa1580156109b2573d6000803e3d6000fd5b505050506040513d60208110156109c857600080fd5b505182516040805163d21220a760e01b815290519293506000926001600160a01b039092169163d21220a791600480820192602092909190829003018186803b158015610a1457600080fd5b505afa158015610a28573d6000803e3d6000fd5b505050506040513d6020811015610a3e57600080fd5b5051608084015160a085015191925090600090610a5a90611a47565b90506000610a7b60065461075a886060015185611f4890919063ffffffff16565b9050610a878382611eee565b60408701516020880151606090980151969f959e50909c509a5094985092965090945050505050565b6000546001600160a01b0390811691161490565b600b546001600160a01b031681565b60045481565b600a546001600160a01b031681565b60055481565b610af733610ab0565b610b36576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610b8933610ab0565b610bc8576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b610bd0610dd8565b600355565b610bde33610ab0565b610c1d576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b6001600160a01b038116610c625760405162461bcd60e51b815260040180806020018281038252602a81526020018061247a602a913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b6000546001600160a01b031690565b60035481565b600e6020908152600092835260408084209091529082529020805460019091015482565b60006001610cd86110b0565b03821115610d2d576040805162461bcd60e51b815260206004820152601f60248201527f537761704d696e696e673a20696e646578206f7574206f6620626f756e647300604482015290519081900360640190fd5b610d38600183611fa1565b92915050565b6000610d4933610ab0565b610d88576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b6001600160a01b038216610dcd5760405162461bcd60e51b81526004018080602001828103825260258152602001806124246025913960400191505060405180910390fd5b610d38600183611fad565b600d5460005b81811015610df857610def81610f90565b50600101610dde565b5050565b600d54600090819060001901831115610e5c576040805162461bcd60e51b815260206004820152601e60248201527f537761704d696e696e673a204e6f742066696e64207468697320706f6f6c0000604482015290519081900360640190fd5b6000610e66612323565b600d8581548110610e7357fe5b60009182526020918290206040805160c081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460a08201529050610edb612362565b506000858152600e60209081526040808320338452825291829020825180840190935280548084526001909101549183019190915215610f83576000610f248360a00151611a47565b90506000610f4560065461075a866060015185611f4890919063ffffffff16565b9050610f7e610f77856020015161075a8660000151610f71868a60800151611eee90919063ffffffff16565b90611f48565b8690611eee565b945050505b5191935090915050915091565b600080600d8381548110610fa057fe5b9060005260206000209060060201905080600501544311610fc557600091505061076b565b6000610fd48260050154611a47565b905060008111610fe95760009250505061076b565b600061100860065461075a856003015485611f4890919063ffffffff16565b600a54604080516340c10f1960e01b81523060048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505050506040513d602081101561108957600080fd5b5050600483015461109a9082611eee565b6004840155505043600590910155506001919050565b600061088f6001611fc2565b6000806001600160a01b0385811690841614156110da575082611477565b6009546040805163e6a4390560e01b81526001600160a01b038881166004830152868116602483015291516000939092169163e6a4390591604480820192602092909190829003018186803b15801561113257600080fd5b505afa158015611146573d6000803e3d6000fd5b505050506040513d602081101561115c57600080fd5b50516001600160a01b0316146111fb5760075460408051632321bc7960e21b81526001600160a01b03888116600483015260248201889052868116604483015291519190921691638c86f1e4916064808301926020929190829003018186803b1580156111c857600080fd5b505afa1580156111dc573d6000803e3d6000fd5b505050506040513d60208110156111f257600080fd5b50519050611477565b60006112056110b0565b905060005b8181101561147457600061121d82610ccc565b6009546040805163e6a4390560e01b81526001600160a01b038c8116600483015284811660248301529151939450600093919092169163e6a43905916044808301926020929190829003018186803b15801561127857600080fd5b505afa15801561128c573d6000803e3d6000fd5b505050506040513d60208110156112a257600080fd5b50516001600160a01b03161480159061134657506009546040805163e6a4390560e01b81526001600160a01b038481166004830152898116602483015291516000939092169163e6a4390591604480820192602092909190829003018186803b15801561130e57600080fd5b505afa158015611322573d6000803e3d6000fd5b505050506040513d602081101561133857600080fd5b50516001600160a01b031614155b1561146b5760075460408051632321bc7960e21b81526001600160a01b038b81166004830152602482018b9052848116604483015291516000939290921691638c86f1e491606480820192602092909190829003018186803b1580156113ab57600080fd5b505afa1580156113bf573d6000803e3d6000fd5b505050506040513d60208110156113d557600080fd5b505160075460408051632321bc7960e21b81526001600160a01b038681166004830152602482018590528b811660448301529151939450911691638c86f1e491606480820192602092909190829003018186803b15801561143557600080fd5b505afa158015611449573d6000803e3d6000fd5b505050506040513d602081101561145f57600080fd5b50519450611474915050565b5060010161120a565b50505b949350505050565b6008546000906001600160a01b031633146114cb5760405162461bcd60e51b81526004018080602001828103825260248152602001806124a46024913960400191505060405180910390fd5b6001600160a01b0385166115105760405162461bcd60e51b81526004018080602001828103825260328152602001806125096032913960400191505060405180910390fd5b6001600160a01b0384166115555760405162461bcd60e51b815260040180806020018281038252603081526020018061253b6030913960400191505060405180910390fd5b6001600160a01b03831661159a5760405162461bcd60e51b81526004018080602001828103825260318152602001806124496031913960400191505060405180910390fd5b60006115a461070f565b116115b157506000611477565b6115ba84611a3a565b15806115cc57506115ca83611a3a565b155b156115d957506000611477565b600954604080516396ed28f960e01b81526001600160a01b0387811660048301528681166024830152915160009392909216916396ed28f991604480820192602092909190829003018186803b15801561163257600080fd5b505afa158015611646573d6000803e3d6000fd5b505050506040513d602081101561165c57600080fd5b50516001600160a01b0381166000908152600c6020526040812054600d80549394509192811061168857fe5b6000918252602090912060069091020180549091506001600160a01b0383811691161415806116b957506003810154155b156116c957600092505050611477565b600b546000906116e590879087906001600160a01b03166110bc565b9050600081116116fb5760009350505050611477565b6001600160a01b0383166000908152600c602052604090205461171d90610f90565b50600182015461172d9082611eee565b600183015560028201546117419082611eee565b60028301556001600160a01b038084166000908152600c60209081526040808320548352600e8252808320938c1683529290522080546117819083611eee565b81554360019182015598975050505050505050565b6000806117a283610715565b90506117bc8160020a600354611eac90919063ffffffff16565b9392505050565b600061088f43610715565b6117d733610ab0565b611816576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b600555565b600d54600090815b818110156118e7576000600d828154811061183a57fe5b60009182526020808320858452600e825260408085203386529092529220805460069092029092019250156118dd5761187283610f90565b506000611898836001015461075a84600001548660040154611f4890919063ffffffff16565b825460018501549192506118ac9190611e6a565b600184015560048301546118c09082611e6a565b6004840155600082554360018301556118d98682611eee565b9550505b5050600101611823565b50600082116118f757505061197a565b600a546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561194b57600080fd5b505af115801561195f573d6000803e3d6000fd5b505050506040513d602081101561197557600080fd5b505050505b565b61198533610ab0565b6119c4576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b6001600160a01b038116611a095760405162461bcd60e51b815260040180806020018281038252602a81526020018061239f602a913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031681565b6000610d38600183611fcd565b600043821115611a885760405162461bcd60e51b81526004018080602001828103825260358152602001806123ef6035913960400191505060405180910390fd5b600080611a9484610715565b90506000611aa143610715565b90505b80821015611af657600454600554600190930192600091611aca91610850908690611f48565b9050611aec611ae5611adb83611796565b610f71848a611e6a565b8590611eee565b9095509250611aa4565b611b16611b0f611b0543611796565b610f714389611e6a565b8490611eee565b95945050505050565b611b2833610ab0565b611b67576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b611b7081611fe2565b50565b6000611b7e33610ab0565b611bbd576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b6001600160a01b038216611c025760405162461bcd60e51b81526004018080602001828103825260258152602001806124246025913960400191505060405180910390fd5b610d38600183612082565b6008546001600160a01b031681565b611c2533610ab0565b611c64576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b6001600160a01b038216611cbf576040805162461bcd60e51b815260206004820152601960248201527f5f7061697220697320746865207a65726f206164647265737300000000000000604482015290519081900360640190fd5b8015611ccd57611ccd610dd8565b60006004544311611ce057600454611ce2565b435b600654909150611cf29085611eee565b60069081556040805160c0810182526001600160a01b038681168252600060208301818152938301818152606084018a81526080850183815260a08601898152600d8054600180820183559190965296517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59590990294850180546001600160a01b031916999096169890981790945594517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb6830155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb782015592517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb8840155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb983015591517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eba90910155611e4761070f565b6001600160a01b039094166000908152600c602052604090209303909255505050565b60006117bc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612097565b60006117bc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061212e565b6000828201838110156117bc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611f5757506000610d38565b82820282848281611f6457fe5b04146117bc5760405162461bcd60e51b81526004018080602001828103825260218152602001806124c86021913960400191505060405180910390fd5b60006117bc8383612193565b60006117bc836001600160a01b0384166121f7565b6000610d38826122bd565b60006117bc836001600160a01b0384166122c1565b6001600160a01b0381166120275760405162461bcd60e51b81526004018080602001828103825260268152602001806123c96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006117bc836001600160a01b0384166122d9565b600081848411156121265760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120eb5781810151838201526020016120d3565b50505050905090810190601f1680156121185780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361217d5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156120eb5781810151838201526020016120d3565b50600083858161218957fe5b0495945050505050565b815460009082106121d55760405162461bcd60e51b815260040180806020018281038252602281526020018061237d6022913960400191505060405180910390fd5b8260000182815481106121e457fe5b9060005260206000200154905092915050565b600081815260018301602052604081205480156122b3578354600019808301919081019060009087908390811061222a57fe5b906000526020600020015490508087600001848154811061224757fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061227757fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610d38565b6000915050610d38565b5490565b60009081526001919091016020526040902054151590565b60006122e583836122c1565b61231b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d38565b506000610d38565b6040518060c0016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180604001604052806000815260200160008152509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473537761704d696e696e673a206e657720726f7574657220697320746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537761704d696e696e673a206d757374206c6974746c65207468616e207468652063757272656e7420626c6f636b206e756d626572537761704d696e696e673a20746f6b656e20697320746865207a65726f2061646472657373537761704d696e696e673a2074616b65722073776170206f757470757420697320746865207a65726f2061646472657373537761704d696e696e673a206e6577206f7261636c6520697320746865207a65726f2061646472657373537761704d696e696e673a2063616c6c6572206973206e6f742074686520726f75746572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572537761704d696e696e673a2074616b65722073776170206163636f756e7420697320746865207a65726f2061646472657373537761704d696e696e673a2074616b6572207377617020696e70757420697320746865207a65726f2061646472657373a2646970667358221220e7e40616c339d8f4178fc2818f8b8349f7faf87b1dfb3b84ad02f0c6bbf2e10664736f6c634300060c00330000000000000000000000009c65ab58d8d978db963e63f2bfb7121627e3a7390000000000000000000000003cd1c46068daea5ebb0d3f55f6915b10648062b800000000000000000000000017c77d7203a7deeb44754c6bc143f249969456f50000000000000000000000007dae51bd3e3376b8c7c4900e9107f12be3af1ba800000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000617416

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102485760003560e01c806396db752a1161013b578063b5ec5c99116100b8578063e377fe351161007c578063e377fe3514610658578063f2fde38b14610675578063f80f5dd51461069b578063f887ea40146106c1578063f9d181f9146106c957610248565b8063b5ec5c99146105df578063b872dd0e146105fc578063c0d7865514610604578063c45a01551461062a578063c683630d1461063257610248565b8063a13202e9116100ff578063a13202e914610540578063a7ef67f614610548578063a9678a181461057e578063a9fb763c146105ba578063b1c9fe6e146105d757610248565b806396db752a146104bb57806397ecfaab146104d85780639f4ece2e146104fe5780639fb08cb714610506578063a0712d681461052357610248565b806348cd4cb1116101c95780637adbf9731161018d5780637adbf973146104385780637dc0d1d01461045e5780638da5cb5b146104665780638fa39a881461046e57806393f1a40b1461047657610248565b806348cd4cb1146103fb5780635672ab55146104035780635a3e251f1461040b578063715018a614610413578063791ba3741461041b57610248565b8063190cf6c911610210578063190cf6c91461030c578063228cb733146103395780632f380b35146103415780632f54bf6e1461039d578063327107f7146103d757610248565b80630495de501461024d578063081e3eda14610285578063135f8aa71461028d5780631526fe27146102aa57806317caf6f114610304575b600080fd5b6102736004803603602081101561026357600080fd5b50356001600160a01b03166106fd565b60408051918252519081900360200190f35b61027361070f565b610273600480360360208110156102a357600080fd5b5035610715565b6102c7600480360360208110156102c057600080fd5b5035610770565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6102736107bd565b6103376004803603606081101561032257600080fd5b508035906020810135906040013515156107c3565b005b610273610884565b61035e6004803603602081101561035757600080fd5b5035610894565b604080516001600160a01b039788168152959096166020860152848601939093526060840191909152608083015260a082015290519081900360c00190f35b6103c3600480360360208110156103b357600080fd5b50356001600160a01b0316610ab0565b604080519115158252519081900360200190f35b6103df610ac4565b604080516001600160a01b039092168252519081900360200190f35b610273610ad3565b6103df610ad9565b610273610ae8565b610337610aee565b6103376004803603602081101561043157600080fd5b5035610b80565b6103376004803603602081101561044e57600080fd5b50356001600160a01b0316610bd5565b6103df610c84565b6103df610c93565b610273610ca2565b6104a26004803603604081101561048c57600080fd5b50803590602001356001600160a01b0316610ca8565b6040805192835260208301919091528051918290030190f35b6103df600480360360208110156104d157600080fd5b5035610ccc565b6103c3600480360360208110156104ee57600080fd5b50356001600160a01b0316610d3e565b610337610dd8565b6104a26004803603602081101561051c57600080fd5b5035610dfc565b6103c36004803603602081101561053957600080fd5b5035610f90565b6102736110b0565b6102736004803603606081101561055e57600080fd5b506001600160a01b038135811691602081013591604090910135166110bc565b6103c36004803603608081101561059457600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561147f565b610273600480360360208110156105d057600080fd5b5035611796565b6102736117c3565b610337600480360360208110156105f557600080fd5b50356117ce565b61033761181b565b6103376004803603602081101561061a57600080fd5b50356001600160a01b031661197c565b6103df611a2b565b6103c36004803603602081101561064857600080fd5b50356001600160a01b0316611a3a565b6102736004803603602081101561066e57600080fd5b5035611a47565b6103376004803603602081101561068b57600080fd5b50356001600160a01b0316611b1f565b6103c3600480360360208110156106b157600080fd5b50356001600160a01b0316611b73565b6103df611c0d565b610337600480360360608110156106df57600080fd5b508035906001600160a01b0360208201351690604001351515611c1c565b600c6020526000908152604090205481565b600d5490565b60006005546000141561072a5750600061076b565b6004548211156107675761076060055461075a600161075460045487611e6a90919063ffffffff16565b90611e6a565b90611eac565b905061076b565b5060005b919050565b600d818154811061077d57fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909286565b60065481565b6107cc33610ab0565b61080b576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b801561081957610819610dd8565b61085682610850600d868154811061082d57fe5b906000526020600020906006020160030154600654611e6a90919063ffffffff16565b90611eee565b60068190555081600d848154811061086a57fe5b906000526020600020906006020160030181905550505050565b600061088f43611796565b905090565b6000806000806000806001600d80549050038711156108fa576040805162461bcd60e51b815260206004820152601e60248201527f537761704d696e696e673a204e6f742066696e64207468697320706f6f6c0000604482015290519081900360640190fd5b610902612323565b600d888154811061090f57fe5b600091825260208083206040805160c081018252600690940290910180546001600160a01b031680855260018201548585015260028201548584015260038201546060860152600480830154608087015260059092015460a08601528251630dfe168160e01b8152925194965093630dfe16819383830193909290829003018186803b15801561099e57600080fd5b505afa1580156109b2573d6000803e3d6000fd5b505050506040513d60208110156109c857600080fd5b505182516040805163d21220a760e01b815290519293506000926001600160a01b039092169163d21220a791600480820192602092909190829003018186803b158015610a1457600080fd5b505afa158015610a28573d6000803e3d6000fd5b505050506040513d6020811015610a3e57600080fd5b5051608084015160a085015191925090600090610a5a90611a47565b90506000610a7b60065461075a886060015185611f4890919063ffffffff16565b9050610a878382611eee565b60408701516020880151606090980151969f959e50909c509a5094985092965090945050505050565b6000546001600160a01b0390811691161490565b600b546001600160a01b031681565b60045481565b600a546001600160a01b031681565b60055481565b610af733610ab0565b610b36576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610b8933610ab0565b610bc8576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b610bd0610dd8565b600355565b610bde33610ab0565b610c1d576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b6001600160a01b038116610c625760405162461bcd60e51b815260040180806020018281038252602a81526020018061247a602a913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b6000546001600160a01b031690565b60035481565b600e6020908152600092835260408084209091529082529020805460019091015482565b60006001610cd86110b0565b03821115610d2d576040805162461bcd60e51b815260206004820152601f60248201527f537761704d696e696e673a20696e646578206f7574206f6620626f756e647300604482015290519081900360640190fd5b610d38600183611fa1565b92915050565b6000610d4933610ab0565b610d88576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b6001600160a01b038216610dcd5760405162461bcd60e51b81526004018080602001828103825260258152602001806124246025913960400191505060405180910390fd5b610d38600183611fad565b600d5460005b81811015610df857610def81610f90565b50600101610dde565b5050565b600d54600090819060001901831115610e5c576040805162461bcd60e51b815260206004820152601e60248201527f537761704d696e696e673a204e6f742066696e64207468697320706f6f6c0000604482015290519081900360640190fd5b6000610e66612323565b600d8581548110610e7357fe5b60009182526020918290206040805160c081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460a08201529050610edb612362565b506000858152600e60209081526040808320338452825291829020825180840190935280548084526001909101549183019190915215610f83576000610f248360a00151611a47565b90506000610f4560065461075a866060015185611f4890919063ffffffff16565b9050610f7e610f77856020015161075a8660000151610f71868a60800151611eee90919063ffffffff16565b90611f48565b8690611eee565b945050505b5191935090915050915091565b600080600d8381548110610fa057fe5b9060005260206000209060060201905080600501544311610fc557600091505061076b565b6000610fd48260050154611a47565b905060008111610fe95760009250505061076b565b600061100860065461075a856003015485611f4890919063ffffffff16565b600a54604080516340c10f1960e01b81523060048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505050506040513d602081101561108957600080fd5b5050600483015461109a9082611eee565b6004840155505043600590910155506001919050565b600061088f6001611fc2565b6000806001600160a01b0385811690841614156110da575082611477565b6009546040805163e6a4390560e01b81526001600160a01b038881166004830152868116602483015291516000939092169163e6a4390591604480820192602092909190829003018186803b15801561113257600080fd5b505afa158015611146573d6000803e3d6000fd5b505050506040513d602081101561115c57600080fd5b50516001600160a01b0316146111fb5760075460408051632321bc7960e21b81526001600160a01b03888116600483015260248201889052868116604483015291519190921691638c86f1e4916064808301926020929190829003018186803b1580156111c857600080fd5b505afa1580156111dc573d6000803e3d6000fd5b505050506040513d60208110156111f257600080fd5b50519050611477565b60006112056110b0565b905060005b8181101561147457600061121d82610ccc565b6009546040805163e6a4390560e01b81526001600160a01b038c8116600483015284811660248301529151939450600093919092169163e6a43905916044808301926020929190829003018186803b15801561127857600080fd5b505afa15801561128c573d6000803e3d6000fd5b505050506040513d60208110156112a257600080fd5b50516001600160a01b03161480159061134657506009546040805163e6a4390560e01b81526001600160a01b038481166004830152898116602483015291516000939092169163e6a4390591604480820192602092909190829003018186803b15801561130e57600080fd5b505afa158015611322573d6000803e3d6000fd5b505050506040513d602081101561133857600080fd5b50516001600160a01b031614155b1561146b5760075460408051632321bc7960e21b81526001600160a01b038b81166004830152602482018b9052848116604483015291516000939290921691638c86f1e491606480820192602092909190829003018186803b1580156113ab57600080fd5b505afa1580156113bf573d6000803e3d6000fd5b505050506040513d60208110156113d557600080fd5b505160075460408051632321bc7960e21b81526001600160a01b038681166004830152602482018590528b811660448301529151939450911691638c86f1e491606480820192602092909190829003018186803b15801561143557600080fd5b505afa158015611449573d6000803e3d6000fd5b505050506040513d602081101561145f57600080fd5b50519450611474915050565b5060010161120a565b50505b949350505050565b6008546000906001600160a01b031633146114cb5760405162461bcd60e51b81526004018080602001828103825260248152602001806124a46024913960400191505060405180910390fd5b6001600160a01b0385166115105760405162461bcd60e51b81526004018080602001828103825260328152602001806125096032913960400191505060405180910390fd5b6001600160a01b0384166115555760405162461bcd60e51b815260040180806020018281038252603081526020018061253b6030913960400191505060405180910390fd5b6001600160a01b03831661159a5760405162461bcd60e51b81526004018080602001828103825260318152602001806124496031913960400191505060405180910390fd5b60006115a461070f565b116115b157506000611477565b6115ba84611a3a565b15806115cc57506115ca83611a3a565b155b156115d957506000611477565b600954604080516396ed28f960e01b81526001600160a01b0387811660048301528681166024830152915160009392909216916396ed28f991604480820192602092909190829003018186803b15801561163257600080fd5b505afa158015611646573d6000803e3d6000fd5b505050506040513d602081101561165c57600080fd5b50516001600160a01b0381166000908152600c6020526040812054600d80549394509192811061168857fe5b6000918252602090912060069091020180549091506001600160a01b0383811691161415806116b957506003810154155b156116c957600092505050611477565b600b546000906116e590879087906001600160a01b03166110bc565b9050600081116116fb5760009350505050611477565b6001600160a01b0383166000908152600c602052604090205461171d90610f90565b50600182015461172d9082611eee565b600183015560028201546117419082611eee565b60028301556001600160a01b038084166000908152600c60209081526040808320548352600e8252808320938c1683529290522080546117819083611eee565b81554360019182015598975050505050505050565b6000806117a283610715565b90506117bc8160020a600354611eac90919063ffffffff16565b9392505050565b600061088f43610715565b6117d733610ab0565b611816576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b600555565b600d54600090815b818110156118e7576000600d828154811061183a57fe5b60009182526020808320858452600e825260408085203386529092529220805460069092029092019250156118dd5761187283610f90565b506000611898836001015461075a84600001548660040154611f4890919063ffffffff16565b825460018501549192506118ac9190611e6a565b600184015560048301546118c09082611e6a565b6004840155600082554360018301556118d98682611eee565b9550505b5050600101611823565b50600082116118f757505061197a565b600a546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561194b57600080fd5b505af115801561195f573d6000803e3d6000fd5b505050506040513d602081101561197557600080fd5b505050505b565b61198533610ab0565b6119c4576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b6001600160a01b038116611a095760405162461bcd60e51b815260040180806020018281038252602a81526020018061239f602a913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031681565b6000610d38600183611fcd565b600043821115611a885760405162461bcd60e51b81526004018080602001828103825260358152602001806123ef6035913960400191505060405180910390fd5b600080611a9484610715565b90506000611aa143610715565b90505b80821015611af657600454600554600190930192600091611aca91610850908690611f48565b9050611aec611ae5611adb83611796565b610f71848a611e6a565b8590611eee565b9095509250611aa4565b611b16611b0f611b0543611796565b610f714389611e6a565b8490611eee565b95945050505050565b611b2833610ab0565b611b67576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b611b7081611fe2565b50565b6000611b7e33610ab0565b611bbd576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b6001600160a01b038216611c025760405162461bcd60e51b81526004018080602001828103825260258152602001806124246025913960400191505060405180910390fd5b610d38600183612082565b6008546001600160a01b031681565b611c2533610ab0565b611c64576040805162461bcd60e51b815260206004820181905260248201526000805160206124e9833981519152604482015290519081900360640190fd5b6001600160a01b038216611cbf576040805162461bcd60e51b815260206004820152601960248201527f5f7061697220697320746865207a65726f206164647265737300000000000000604482015290519081900360640190fd5b8015611ccd57611ccd610dd8565b60006004544311611ce057600454611ce2565b435b600654909150611cf29085611eee565b60069081556040805160c0810182526001600160a01b038681168252600060208301818152938301818152606084018a81526080850183815260a08601898152600d8054600180820183559190965296517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59590990294850180546001600160a01b031916999096169890981790945594517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb6830155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb782015592517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb8840155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb983015591517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eba90910155611e4761070f565b6001600160a01b039094166000908152600c602052604090209303909255505050565b60006117bc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612097565b60006117bc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061212e565b6000828201838110156117bc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611f5757506000610d38565b82820282848281611f6457fe5b04146117bc5760405162461bcd60e51b81526004018080602001828103825260218152602001806124c86021913960400191505060405180910390fd5b60006117bc8383612193565b60006117bc836001600160a01b0384166121f7565b6000610d38826122bd565b60006117bc836001600160a01b0384166122c1565b6001600160a01b0381166120275760405162461bcd60e51b81526004018080602001828103825260268152602001806123c96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006117bc836001600160a01b0384166122d9565b600081848411156121265760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120eb5781810151838201526020016120d3565b50505050905090810190601f1680156121185780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361217d5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156120eb5781810151838201526020016120d3565b50600083858161218957fe5b0495945050505050565b815460009082106121d55760405162461bcd60e51b815260040180806020018281038252602281526020018061237d6022913960400191505060405180910390fd5b8260000182815481106121e457fe5b9060005260206000200154905092915050565b600081815260018301602052604081205480156122b3578354600019808301919081019060009087908390811061222a57fe5b906000526020600020015490508087600001848154811061224757fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061227757fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610d38565b6000915050610d38565b5490565b60009081526001919091016020526040902054151590565b60006122e583836122c1565b61231b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d38565b506000610d38565b6040518060c0016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180604001604052806000815260200160008152509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473537761704d696e696e673a206e657720726f7574657220697320746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537761704d696e696e673a206d757374206c6974746c65207468616e207468652063757272656e7420626c6f636b206e756d626572537761704d696e696e673a20746f6b656e20697320746865207a65726f2061646472657373537761704d696e696e673a2074616b65722073776170206f757470757420697320746865207a65726f2061646472657373537761704d696e696e673a206e6577206f7261636c6520697320746865207a65726f2061646472657373537761704d696e696e673a2063616c6c6572206973206e6f742074686520726f75746572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572537761704d696e696e673a2074616b65722073776170206163636f756e7420697320746865207a65726f2061646472657373537761704d696e696e673a2074616b6572207377617020696e70757420697320746865207a65726f2061646472657373a2646970667358221220e7e40616c339d8f4178fc2818f8b8349f7faf87b1dfb3b84ad02f0c6bbf2e10664736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000009c65ab58d8d978db963e63f2bfb7121627e3a7390000000000000000000000003cd1c46068daea5ebb0d3f55f6915b10648062b800000000000000000000000017c77d7203a7deeb44754c6bc143f249969456f50000000000000000000000007dae51bd3e3376b8c7c4900e9107f12be3af1ba800000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000617416

-----Decoded View---------------
Arg [0] : _mdx (address): 0x9C65AB58d8d978DB963e63f2bfB7121627e3a739
Arg [1] : _factory (address): 0x3CD1C46068dAEa5Ebb0d3f55F6915B10648062B8
Arg [2] : _oracle (address): 0x17C77d7203A7dEeb44754c6Bc143F249969456f5
Arg [3] : _router (address): 0x7DAe51BD3E3376B8c7c4900E9107f12Be3AF1bA8
Arg [4] : _targetToken (address): 0x55d398326f99059fF775485246999027B3197955
Arg [5] : _mdxPerBlock (uint256): 80000000000000000000
Arg [6] : _startBlock (uint256): 6386710

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000009c65ab58d8d978db963e63f2bfb7121627e3a739
Arg [1] : 0000000000000000000000003cd1c46068daea5ebb0d3f55f6915b10648062b8
Arg [2] : 00000000000000000000000017c77d7203a7deeb44754c6bc143f249969456f5
Arg [3] : 0000000000000000000000007dae51bd3e3376b8c7c4900e9107f12be3af1ba8
Arg [4] : 00000000000000000000000055d398326f99059ff775485246999027b3197955
Arg [5] : 000000000000000000000000000000000000000000000004563918244f400000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000617416


Deployed Bytecode Sourcemap

20718:12574:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21489:44;;;;;;;;;;;;;;;;-1:-1:-1;21489:44:0;-1:-1:-1;;;;;21489:44:0;;:::i;:::-;;;;;;;;;;;;;;;;22670:93;;;:::i;25513:291::-;;;;;;;;;;;;;;;;-1:-1:-1;25513:291:0;;:::i;22562:26::-;;;;;;;;;;;;;;;;-1:-1:-1;22562:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;22562:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21159:34;;;:::i;23482:306::-;;;;;;;;;;;;;;;;-1:-1:-1;23482:306:0;;;;;;;;;;;;;;:::i;:::-;;26087:94;;;:::i;31261:798::-;;;;;;;;;;;;;;;;-1:-1:-1;31261:798:0;;:::i;:::-;;;;-1:-1:-1;;;;;31261:798:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;336:104;;;;;;;;;;;;;;;;-1:-1:-1;336:104:0;-1:-1:-1;;;;;336:104:0;;:::i;:::-;;;;;;;;;;;;;;;;;;21425:26;;;:::i;:::-;;;;-1:-1:-1;;;;;21425:26:0;;;;;;;;;;;;;;21015:25;;;:::i;21363:15::-;;;:::i;21082:38::-;;;:::i;448:140::-;;;:::i;23849:134::-;;;;;;;;;;;;;;;;-1:-1:-1;23849:134:0;;:::i;25299:184::-;;;;;;;;;;;;;;;;-1:-1:-1;25299:184:0;-1:-1:-1;;;;;25299:184:0;;:::i;21200:21::-;;;:::i;249:79::-;;;:::i;20933:26::-;;;:::i;22595:64::-;;;;;;;;;;;;;;;;-1:-1:-1;22595:64:0;;;;;;-1:-1:-1;;;;;22595:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24776:218;;;;;;;;;;;;;;;;-1:-1:-1;24776:218:0;;:::i;24276:226::-;;;;;;;;;;;;;;;;-1:-1:-1;24276:226:0;-1:-1:-1;;;;;24276:226:0;;:::i;27146:172::-;;;:::i;30506:715::-;;;;;;;;;;;;;;;;-1:-1:-1;30506:715:0;;:::i;27326:741::-;;;;;;;;;;;;;;;;-1:-1:-1;27326:741:0;;:::i;24510:118::-;;;:::i;32197:1090::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32197:1090:0;;;;;;;;;;;;;;;;;:::i;28106:1351::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28106:1351:0;;;;;;;;;;;;;;;;;;;;;;:::i;25912:167::-;;;;;;;;;;;;;;;;-1:-1:-1;25912:167:0;;:::i;25812:92::-;;;:::i;25002:100::-;;;;;;;;;;;;;;;;-1:-1:-1;25002:100:0;;:::i;29532:915::-;;;:::i;25110:181::-;;;;;;;;;;;;;;;;-1:-1:-1;25110:181:0;-1:-1:-1;;;;;25110:181:0;;:::i;21303:27::-;;;:::i;24636:132::-;;;;;;;;;;;;;;;;-1:-1:-1;24636:132:0;-1:-1:-1;;;;;24636:132:0;;:::i;26227:831::-;;;;;;;;;;;;;;;;-1:-1:-1;26227:831:0;;:::i;833:109::-;;;;;;;;;;;;;;;;-1:-1:-1;833:109:0;-1:-1:-1;;;;;833:109:0;;:::i;24045:223::-;;;;;;;;;;;;;;;;-1:-1:-1;24045:223:0;-1:-1:-1;;;;;24045:223:0;;:::i;21251:21::-;;;:::i;22773:659::-;;;;;;;;;;;;;;;;-1:-1:-1;22773:659:0;;;-1:-1:-1;;;;;22773:659:0;;;;;;;;;;;;:::i;21489:44::-;;;;;;;;;;;;;:::o;22670:93::-;22740:8;:15;22670:93;:::o;25513:291::-;25570:7;25594:13;;25611:1;25594:18;25590:59;;;-1:-1:-1;25636:1:0;25629:8;;25590:59;25677:10;;25663:11;:24;25659:119;;;25711:55;25752:13;;25712:34;25744:1;25712:27;25728:10;;25712:11;:15;;:27;;;;:::i;:::-;:31;;:34::i;:::-;25711:40;;:55::i;:::-;25704:62;;;;25659:119;-1:-1:-1;25795:1:0;25513:291;;;;:::o;22562:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22562:26:0;;;;-1:-1:-1;22562:26:0;;;;;:::o;21159:34::-;;;;:::o;23482:306::-;992:19;1000:10;992:7;:19::i;:::-;984:64;;;;;-1:-1:-1;;;984:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;984:64:0;;;;;;;;;;;;;;;23584:11:::1;23580:59;;;23612:15;:13;:15::i;:::-;23667:63;23718:11;23667:46;23687:8;23696:4;23687:14;;;;;;;;;;;;;;;;;;:25;;;23667:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:63::i;:::-;23649:15;:81;;;;23769:11;23741:8;23750:4;23741:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;23482:306:::0;;;:::o;26087:94::-;26126:7;26153:20;26160:12;26153:6;:20::i;:::-;26146:27;;26087:94;:::o;31261:798::-;31317:7;31326;31335;31344;31353;31362;31415:1;31397:8;:15;;;;:19;31389:4;:27;;31381:70;;;;;-1:-1:-1;;;31381:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31462:20;;:::i;:::-;31485:8;31494:4;31485:14;;;;;;;;;;;;;;;;31462:37;;;;;;;;31485:14;;;;;;;31462:37;;-1:-1:-1;;;;;31462:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31527:29;;-1:-1:-1;;;31527:29:0;;;;31462:37;;-1:-1:-1;31462:37:0;31527:27;;:29;;;;31485:14;;31527:29;;;;;;31462:37;31527:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31527:29:0;31594:9;;31584:29;;;-1:-1:-1;;;31584:29:0;;;;31527;;-1:-1:-1;31567:14:0;;-1:-1:-1;;;;;31584:27:0;;;;;;:29;;;;;31527;;31584;;;;;;;;:27;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31584:29:0;31644:19;;;;31709:20;;;;31584:29;;-1:-1:-1;31644:19:0;31624:17;;31696:34;;:12;:34::i;:::-;31674:56;;31741:17;31761:53;31798:15;;31761:32;31777:4;:15;;;31761:11;:15;;:32;;;;:::i;:53::-;31741:73;-1:-1:-1;31837:24:0;:9;31741:73;31837:13;:24::i;:::-;32000:18;;;;32020:13;;;;32035:15;;;;;31973:6;;31981;;-1:-1:-1;31825:36:0;;-1:-1:-1;32000:18:0;-1:-1:-1;32020:13:0;;-1:-1:-1;32035:15:0;;-1:-1:-1;31261:798:0;;-1:-1:-1;;;;;31261:798:0:o;336:104::-;391:4;426:6;-1:-1:-1;;;;;426:6:0;;;415:17;;;;336:104::o;21425:26::-;;;-1:-1:-1;;;;;21425:26:0;;:::o;21015:25::-;;;;:::o;21363:15::-;;;-1:-1:-1;;;;;21363:15:0;;:::o;21082:38::-;;;;:::o;448:140::-;992:19;1000:10;992:7;:19::i;:::-;984:64;;;;;-1:-1:-1;;;984:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;984:64:0;;;;;;;;;;;;;;;547:1:::1;531:6:::0;;510:40:::1;::::0;-1:-1:-1;;;;;531:6:0;;::::1;::::0;510:40:::1;::::0;547:1;;510:40:::1;578:1;561:19:::0;;-1:-1:-1;;;;;;561:19:0::1;::::0;;448:140::o;23849:134::-;992:19;1000:10;992:7;:19::i;:::-;984:64;;;;;-1:-1:-1;;;984:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;984:64:0;;;;;;;;;;;;;;;23923:15:::1;:13;:15::i;:::-;23949:11;:26:::0;23849:134::o;25299:184::-;992:19;1000:10;992:7;:19::i;:::-;984:64;;;;;-1:-1:-1;;;984:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;984:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25371:30:0;::::1;25363:85;;;;-1:-1:-1::0;;;25363:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25459:6;:16:::0;;-1:-1:-1;;;;;;25459:16:0::1;-1:-1:-1::0;;;;;25459:16:0;;;::::1;::::0;;;::::1;::::0;;25299:184::o;21200:21::-;;;-1:-1:-1;;;;;21200:21:0;;:::o;249:79::-;287:7;314:6;-1:-1:-1;;;;;314:6:0;249:79;:::o;20933:26::-;;;;:::o;22595:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24776:218::-;24835:7;24895:1;24872:20;:18;:20::i;:::-;:24;24862:6;:34;;24854:78;;;;;-1:-1:-1;;;24854:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24950:36;24967:10;24979:6;24950:16;:36::i;:::-;24943:43;24776:218;-1:-1:-1;;24776:218:0:o;24276:226::-;24343:4;992:19;1000:10;992:7;:19::i;:::-;984:64;;;;;-1:-1:-1;;;984:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;984:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24368:23:0;::::1;24360:73;;;;-1:-1:-1::0;;;24360:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24451:43;24472:10;24484:9;24451:20;:43::i;27146:172::-:0;27206:8;:15;27189:14;27232:79;27260:6;27254:3;:12;27232:79;;;27290:9;27295:3;27290:4;:9::i;:::-;-1:-1:-1;27268:5:0;;27232:79;;;;27146:172;:::o;30506:715::-;30608:8;:15;30564:7;;;;-1:-1:-1;;30608:19:0;30600:27;;;30592:70;;;;;-1:-1:-1;;;30592:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30673:15;30699:20;;:::i;:::-;30722:8;30731:4;30722:14;;;;;;;;;;;;;;;;;30699:37;;;;;;;;30722:14;;;;;;;30699:37;;-1:-1:-1;;;;;30699:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30747:20:0;;:::i;:::-;-1:-1:-1;30770:14:0;;;;:8;:14;;;;;;;;30785:10;30770:26;;;;;;;;30747:49;;;;;;;;;;;;;;;;;;;;;;;;;30811:17;30807:306;;30845:19;30867:34;30880:4;:20;;;30867:12;:34::i;:::-;30845:56;;30916:17;30936:53;30973:15;;30936:32;30952:4;:15;;;30936:11;:15;;:32;;;;:::i;:53::-;30916:73;;31014:87;31026:74;31086:4;:13;;;31026:55;31067:4;:13;;;31027:34;31051:9;31027:4;:19;;;:23;;:34;;;;:::i;:::-;31026:40;;:55::i;:74::-;31014:7;;:11;:87::i;:::-;31004:97;;30807:306;;;31199:13;31190:7;;-1:-1:-1;31199:13:0;;-1:-1:-1;;30506:715:0;;;:::o;27326:741::-;27370:4;27387:21;27411:8;27420:4;27411:14;;;;;;;;;;;;;;;;;;27387:38;;27456:4;:20;;;27440:12;:36;27436:81;;27500:5;27493:12;;;;;27436:81;27527:19;27549:34;27562:4;:20;;;27549:12;:34::i;:::-;27527:56;;27613:1;27598:11;:16;27594:61;;27638:5;27631:12;;;;;;27594:61;27744:17;27764:53;27801:15;;27764:32;27780:4;:15;;;27764:11;:15;;:32;;;;:::i;:53::-;27828:3;;:34;;;-1:-1:-1;;;27828:34:0;;27845:4;27828:34;;;;;;;;;;;;27744:73;;-1:-1:-1;;;;;;27828:3:0;;;;:8;;:34;;;;;;;;;;;;;;;:3;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27957:19:0;;;;:34;;27981:9;27957:23;:34::i;:::-;27935:19;;;:56;-1:-1:-1;;28025:12:0;28002:20;;;;:35;-1:-1:-1;28055:4:0;27326:741;;;:::o;24510:118::-;24561:7;24588:32;24609:10;24588:20;:32::i;32197:1090::-;32303:7;;-1:-1:-1;;;;;32358:26:0;;;;;;;32354:900;;;-1:-1:-1;32412:12:0;32354:900;;;32459:7;;32446:55;;;-1:-1:-1;;;32446:55:0;;-1:-1:-1;;;;;32446:55:0;;;;;;;;;;;;;;;;32513:1;;32459:7;;;;32446:29;;:55;;;;;;;;;;;;;;;32459:7;32446:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32446:55:0;-1:-1:-1;;;;;32446:69:0;;32442:812;;32551:6;;32543:63;;;-1:-1:-1;;;32543:63:0;;-1:-1:-1;;;;;32543:63:0;;;;;;;;;;;;;;;;;;;;;;32551:6;;;;;32543:23;;:63;;;;;;;;;;;;;;32551:6;32543:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32543:63:0;;-1:-1:-1;32442:812:0;;;32639:14;32656:20;:18;:20::i;:::-;32639:37;;32696:13;32691:552;32723:6;32715:5;:14;32691:552;;;32759:20;32782:19;32795:5;32782:12;:19::i;:::-;32837:7;;32824:56;;;-1:-1:-1;;;32824:56:0;;-1:-1:-1;;;;;32824:56:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32837:7:0;;;;;32824:29;;:56;;;;;;;;;;;;;;32837:7;32824:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32824:56:0;-1:-1:-1;;;;;32824:70:0;;;;;:144;;-1:-1:-1;32911:7:0;;32898:56;;;-1:-1:-1;;;32898:56:0;;-1:-1:-1;;;;;32898:56:0;;;;;;;;;;;;;;;;32966:1;;32911:7;;;;32898:29;;:56;;;;;;;;;;;;;;;32911:7;32898:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32898:56:0;-1:-1:-1;;;;;32898:70:0;;;32824:144;32820:408;;;33025:6;;33017:64;;;-1:-1:-1;;;33017:64:0;;-1:-1:-1;;;;;33017:64:0;;;;;;;;;;;;;;;;;;;;;;32993:21;;33025:6;;;;;33017:23;;:64;;;;;;;;;;;;;;;33025:6;33017:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33017:64:0;33123:6;;33115:65;;;-1:-1:-1;;;33115:65:0;;-1:-1:-1;;;;;33115:65:0;;;;;;;;;;;;;;;;;;;;;;33017:64;;-1:-1:-1;33123:6:0;;;33115:23;;:65;;;;;33017:64;;33115:65;;;;;;;;33123:6;33115:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33115:65:0;;-1:-1:-1;33203:5:0;;-1:-1:-1;;33203:5:0;32820:408;-1:-1:-1;32731:7:0;;32691:552;;;;32442:812;;33271:8;32197:1090;-1:-1:-1;;;;32197:1090:0:o;28106:1351::-;32122:6;;28211:4;;-1:-1:-1;;;;;32122:6:0;32108:10;:20;32100:69;;;;-1:-1:-1;;;32100:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28236:21:0;::::1;28228:84;;;;-1:-1:-1::0;;;28228:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;28331:19:0;::::1;28323:80;;;;-1:-1:-1::0;;;28323:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;28422:20:0;::::1;28414:82;;;;-1:-1:-1::0;;;28414:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28529:1;28513:12;:10;:12::i;:::-;:17;28509:62;;-1:-1:-1::0;28554:5:0::1;28547:12;;28509:62;28588:18;28600:5;28588:11;:18::i;:::-;28587:19;:43;;;;28611:19;28623:6;28611:11;:19::i;:::-;28610:20;28587:43;28583:88;;;-1:-1:-1::0;28654:5:0::1;28647:12;;28583:88;28711:7;::::0;28698:44:::1;::::0;;-1:-1:-1;;;28698:44:0;;-1:-1:-1;;;;;28698:44:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;28683:12:::1;::::0;28711:7;;;::::1;::::0;28698:29:::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;28711:7;28698:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28698:44:0;-1:-1:-1;;;;;28788:15:0;::::1;28755:21;28788:15:::0;;;:9:::1;28698:44;28788:15:::0;;;;;28779:8:::1;:25:::0;;28698:44;;-1:-1:-1;28755:21:0;;28779:25;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;28887:9:::0;;28779:25;;-1:-1:-1;;;;;;28887:17:0;;::::1;:9:::0;::::1;:17;;::::0;:41:::1;;-1:-1:-1::0;28908:15:0::1;::::0;::::1;::::0;:20;28887:41:::1;28883:86;;;28952:5;28945:12;;;;;;28883:86;29028:11;::::0;28981:16:::1;::::0;29000:40:::1;::::0;29012:6;;29020;;-1:-1:-1;;;;;29028:11:0::1;29000;:40::i;:::-;28981:59;;29067:1;29055:8;:13;29051:58;;29092:5;29085:12;;;;;;;29051:58;-1:-1:-1::0;;;;;29126:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;29121:21:::1;::::0;:4:::1;:21::i;:::-;-1:-1:-1::0;29171:13:0::1;::::0;::::1;::::0;:27:::1;::::0;29189:8;29171:17:::1;:27::i;:::-;29155:13;::::0;::::1;:43:::0;29230:18:::1;::::0;::::1;::::0;:32:::1;::::0;29253:8;29230:22:::1;:32::i;:::-;29209:18;::::0;::::1;:53:::0;-1:-1:-1;;;;;29306:15:0;;::::1;29273:21;29306:15:::0;;;:9:::1;:15;::::0;;;;;;;;29297:25;;:8:::1;:25:::0;;;;;:34;;::::1;::::0;;;;;;29358:13;;:27:::1;::::0;29376:8;29358:17:::1;:27::i;:::-;29342:43:::0;;29415:12:::1;29396:16;::::0;;::::1;:31:::0;:16;28106:1351;-1:-1:-1;;;;;;;;28106:1351:0:o;25912:167::-;25970:7;25990:14;26007:18;26013:11;26007:5;:18::i;:::-;25990:35;;26043:28;26064:6;26059:1;:11;26043;;:15;;:28;;;;:::i;:::-;26036:35;25912:167;-1:-1:-1;;;25912:167:0:o;25812:92::-;25850:7;25877:19;25883:12;25877:5;:19::i;25002:100::-;992:19;1000:10;992:7;:19::i;:::-;984:64;;;;;-1:-1:-1;;;984:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;984:64:0;;;;;;;;;;;;;;;25072:13:::1;:22:::0;25002:100::o;29532:915::-;29618:8;:15;29575;;;29644:691;29672:6;29666:3;:12;29644:691;;;29702:21;29726:8;29735:3;29726:13;;;;;;;;;;;;;;;;29778;;;:8;:13;;;;;;29792:10;29778:25;;;;;;;29822:13;;29726;;;;;;;;-1:-1:-1;29822:17:0;29818:506;;29860:9;29865:3;29860:4;:9::i;:::-;;29949:18;29970:57;30013:4;:13;;;29970:38;29994:4;:13;;;29970:4;:19;;;:23;;:38;;;;:::i;:57::-;30080:13;;30062;;;;29949:78;;-1:-1:-1;30062:32:0;;:13;:17;:32::i;:::-;30046:13;;;:48;30135:19;;;;:35;;30159:10;30135:23;:35::i;:::-;30113:19;;;:57;30205:1;30189:17;;30244:12;30225:16;;;:31;30285:23;:7;30297:10;30285:11;:23::i;:::-;30275:33;;29818:506;;-1:-1:-1;;29680:5:0;;29644:691;;;;30360:1;30349:7;:12;30345:51;;30378:7;;;;30345:51;30406:3;;:33;;;-1:-1:-1;;;30406:33:0;;30419:10;30406:33;;;;;;;;;;;;-1:-1:-1;;;;;30406:3:0;;;;:12;;:33;;;;;;;;;;;;;;;:3;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;29532:915:0;:::o;25110:181::-;992:19;1000:10;992:7;:19::i;:::-;984:64;;;;;-1:-1:-1;;;984:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;984:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25184:23:0;::::1;25176:78;;;;-1:-1:-1::0;;;25176:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25265:6;:18:::0;;-1:-1:-1;;;;;;25265:18:0::1;-1:-1:-1::0;;;;;25265:18:0;;;::::1;::::0;;;::::1;::::0;;25110:181::o;21303:27::-;;;-1:-1:-1;;;;;21303:27:0;;:::o;24636:132::-;24694:4;24718:42;24741:10;24753:6;24718:22;:42::i;26227:831::-;26296:7;26344:12;26324:16;:32;;26316:98;;;;-1:-1:-1;;;26316:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26425:19;26459:9;26471:23;26477:16;26471:5;:23::i;:::-;26459:35;;26505:9;26517:19;26523:12;26517:5;:19::i;:::-;26505:31;;26583:335;26594:1;26590;:5;26583:335;;;26724:10;;26705:13;;26612:3;;;;;26687:9;;26699:36;;:20;;26612:3;;26699:5;:20::i;:36::-;26687:48;;26814:57;26830:40;26860:9;26867:1;26860:6;:9::i;:::-;26831:23;:1;26837:16;26831:5;:23::i;26830:40::-;26814:11;;:15;:57::i;:::-;26905:1;;-1:-1:-1;26800:71:0;-1:-1:-1;26583:335:0;;;26942:79;26958:62;26999:20;27006:12;26999:6;:20::i;:::-;26959:34;:12;26976:16;26959;:34::i;26958:62::-;26942:11;;:15;:79::i;:::-;26928:93;26227:831;-1:-1:-1;;;;;26227:831:0:o;833:109::-;992:19;1000:10;992:7;:19::i;:::-;984:64;;;;;-1:-1:-1;;;984:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;984:64:0;;;;;;;;;;;;;;;906:28:::1;925:8;906:18;:28::i;:::-;833:109:::0;:::o;24045:223::-;24112:4;992:19;1000:10;992:7;:19::i;:::-;984:64;;;;;-1:-1:-1;;;984:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;984:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24137:23:0;::::1;24129:73;;;;-1:-1:-1::0;;;24129:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24220:40;24238:10;24250:9;24220:17;:40::i;21251:21::-:0;;;-1:-1:-1;;;;;21251:21:0;;:::o;22773:659::-;992:19;1000:10;992:7;:19::i;:::-;984:64;;;;;-1:-1:-1;;;984:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;984:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22880:19:0;::::1;22872:57;;;::::0;;-1:-1:-1;;;22872:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;22944:11;22940:59;;;22972:15;:13;:15::i;:::-;23009:23;23050:10;;23035:12;:25;:53;;23078:10;;23035:53;;;23063:12;23035:53;23117:15;::::0;23009:79;;-1:-1:-1;23117:32:0::1;::::0;23137:11;23117:19:::1;:32::i;:::-;23099:15;:50:::0;;;23174:203:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23174:203:0;;::::1;::::0;;-1:-1:-1;23174:203:0::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;23160:8:::1;:218:::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;23160:218:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23408:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;23389:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;23408;::::1;23389:35:::0;;;-1:-1:-1;;;22773:659:0:o;1622:136::-;1680:7;1707:43;1711:1;1714;1707:43;;;;;;;;;;;;;;;;;:3;:43::i;2445:132::-;2503:7;2530:39;2534:1;2537;2530:39;;;;;;;;;;;;;;;;;:3;:39::i;1433:181::-;1491:7;1523:5;;;1547:6;;;;1539:46;;;;;-1:-1:-1;;;1539:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1966:471;2024:7;2269:6;2265:47;;-1:-1:-1;2299:1:0;2292:8;;2265:47;2336:5;;;2340:1;2336;:5;:1;2360:5;;;;;:10;2352:56;;;;-1:-1:-1;;;2352:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12591:149;12665:7;12708:22;12712:3;12724:5;12708:3;:22::i;11641:149::-;11714:4;11738:44;11746:3;-1:-1:-1;;;;;11766:14:0;;11738:7;:44::i;12120:117::-;12183:7;12210:19;12218:3;12210:7;:19::i;11876:158::-;11956:4;11980:46;11990:3;-1:-1:-1;;;;;12010:14:0;;11980:9;:46::i;596:229::-;-1:-1:-1;;;;;670:22:0;;662:73;;;;-1:-1:-1;;;662:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;772:6;;;751:38;;-1:-1:-1;;;;;751:38:0;;;;772:6;;;751:38;;;800:6;:17;;-1:-1:-1;;;;;;800:17:0;-1:-1:-1;;;;;800:17:0;;;;;;;;;;596:229::o;11322:143::-;11392:4;11416:41;11421:3;-1:-1:-1;;;;;11441:14:0;;11416:4;:41::i;1766:192::-;1852:7;1888:12;1880:6;;;;1872:29;;;;-1:-1:-1;;;1872:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1924:5:0;;;1766:192::o;2585:345::-;2671:7;2773:12;2766:5;2758:28;;;;-1:-1:-1;;;2758:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2797:9;2813:1;2809;:5;;;;;;;2585:345;-1:-1:-1;;;;;2585:345:0:o;9264:204::-;9359:18;;9331:7;;9359:26;-1:-1:-1;9351:73:0;;;;-1:-1:-1;;;9351:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:3;:11;;9454:5;9442:18;;;;;;;;;;;;;;;;9435:25;;9264:204;;;;:::o;6944:1556::-;7010:4;7149:19;;;:12;;;:19;;;;;;7185:15;;7181:1312;;7619:18;;-1:-1:-1;;7570:14:0;;;;7619:22;;;;7546:21;;7619:3;;:22;;7906;;;;;;;;;;;;;;7886:42;;8052:9;8023:3;:11;;8035:13;8023:26;;;;;;;;;;;;;;;;;;;:38;;;;8129:23;;;8171:1;8129:12;;;:23;;;;;;8155:17;;;8129:43;;8294:17;;8129:3;;8294:17;;;;;;;;;;;;;;;;;;;;;;8389:3;:12;;:19;8402:5;8389:19;;;;;;;;;;;8382:26;;;8432:4;8425:11;;;;;;;;7181:1312;8476:5;8469:12;;;;;8801:109;8884:18;;8801:109::o;8586:129::-;8659:4;8683:19;;;:12;;;;;:19;;;;;;:24;;;8586:129::o;6354:414::-;6417:4;6439:21;6449:3;6454:5;6439:9;:21::i;:::-;6434:327;;-1:-1:-1;6477:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;6660:18;;6638:19;;;:12;;;:19;;;;;;:40;;;;6693:11;;6434:327;-1:-1:-1;6744:5:0;6737:12;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://e7e40616c339d8f4178fc2818f8b8349f7faf87b1dfb3b84ad02f0c6bbf2e106

Block Transaction Gas Used Reward
view all blocks produced
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
View All Validatorset

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

Validator Index Block Amount
View All Withdrawals

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