ETH Price: $1,845.19 (-13.94%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Finalize115978332021-01-06 0:29:281856 days ago1609892968IN
0x59A1A426...7B6509C8d
0 ETH0.00464202116.0043
Transfer115977712021-01-06 0:16:431856 days ago1609892203IN
0x59A1A426...7B6509C8d
1 ETH0.00259084117
Lock Liquidity115977572021-01-06 0:14:391856 days ago1609892079IN
0x59A1A426...7B6509C8d
0 ETH0.31989969116
Transfer115975722021-01-05 23:36:461857 days ago1609889806IN
0x59A1A426...7B6509C8d
1.8 ETH0.01825753158
Transfer115975392021-01-05 23:28:091857 days ago1609889289IN
0x59A1A426...7B6509C8d
0.7 ETH0.0063300
Transfer115975342021-01-05 23:27:401857 days ago1609889260IN
0x59A1A426...7B6509C8d
0.8 ETH0.002856136
Transfer115975292021-01-05 23:27:021857 days ago1609889222IN
0x59A1A426...7B6509C8d
0.9 ETH0.0063300
Transfer115975262021-01-05 23:26:231857 days ago1609889183IN
0x59A1A426...7B6509C8d
0.90898239 ETH0.003003143
Transfer115975212021-01-05 23:25:431857 days ago1609889143IN
0x59A1A426...7B6509C8d
0.9105312 ETH0.003003143
Transfer115975032021-01-05 23:20:161857 days ago1609888816IN
0x59A1A426...7B6509C8d
1 ETH0.01259538109
Transfer115974282021-01-05 23:03:281857 days ago1609887808IN
0x59A1A426...7B6509C8d
0.7 ETH0.00501048151
Transfer115974112021-01-05 22:59:371857 days ago1609887577IN
0x59A1A426...7B6509C8d
0.7 ETH0.006573313
Transfer115964572021-01-05 19:34:091857 days ago1609875249IN
0x59A1A426...7B6509C8d
0.3 ETH0.003213153
Transfer115962792021-01-05 18:55:081857 days ago1609872908IN
0x59A1A426...7B6509C8d
10 ETH0.02011996140
Transfer115909692021-01-04 23:20:061858 days ago1609802406IN
0x59A1A426...7B6509C8d
1 ETH0.00142868
Transfer115908872021-01-04 23:03:581858 days ago1609801438IN
0x59A1A426...7B6509C8d
1.96 ETH0.002541121
Transfer115908872021-01-04 23:03:581858 days ago1609801438IN
0x59A1A426...7B6509C8d
2 ETH0.02765431190
Transfer115908782021-01-04 23:03:151858 days ago1609801395IN
0x59A1A426...7B6509C8d
2 ETH0.002373113
Transfer115908712021-01-04 23:01:161858 days ago1609801276IN
0x59A1A426...7B6509C8d
5 ETH0.0141444398
Transfer115908692021-01-04 23:00:181858 days ago1609801218IN
0x59A1A426...7B6509C8d
2 ETH0.002289109
Transfer115908622021-01-04 22:58:271858 days ago1609801107IN
0x59A1A426...7B6509C8d
5 ETH0.01833003127
Transfer115908552021-01-04 22:56:561858 days ago1609801016IN
0x59A1A426...7B6509C8d
5 ETH0.002667127
Transfer115908312021-01-04 22:53:051858 days ago1609800785IN
0x59A1A426...7B6509C8d
1 ETH0.009564882
Transfer115908272021-01-04 22:52:081858 days ago1609800728IN
0x59A1A426...7B6509C8d
1 ETH0.01481378127
Transfer115891512021-01-04 16:44:341858 days ago1609778674IN
0x59A1A426...7B6509C8d
1 ETH0.02166664185
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-115978332021-01-06 0:29:281856 days ago1609892968
0x59A1A426...7B6509C8d
62.062 ETH
-115977572021-01-06 0:14:391856 days ago1609892079
0x59A1A426...7B6509C8d
50.778 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TDE

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-12-30
*/

pragma solidity 0.6.7;


library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    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;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        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;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

}


interface IUniswapV2Router01 {
  function factory() external pure returns (address);

  function WETH() external pure returns (address);

  function addLiquidity(
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  )
    external
    returns (
      uint256 amountA,
      uint256 amountB,
      uint256 liquidity
    );

  function addLiquidityETH(
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  )
    external
    payable
    returns (
      uint256 amountToken,
      uint256 amountETH,
      uint256 liquidity
    );

  function removeLiquidity(
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETH(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountToken, uint256 amountETH);

  function removeLiquidityWithPermit(
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETHWithPermit(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountToken, uint256 amountETH);

  function swapExactTokensForTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapTokensForExactTokens(
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactETHForTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function swapTokensForExactETH(
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactTokensForETH(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapETHForExactTokens(
    uint256 amountOut,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

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

  function getAmountOut(
    uint256 amountIn,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure returns (uint256 amountOut);

  function getAmountIn(
    uint256 amountOut,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure 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 IUniswapV2Router02 is IUniswapV2Router01 {
  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountETH);

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountETH);

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external;

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable;

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external;
}


abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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


contract ERC20 is IERC20 {
  using SafeMath for uint256;

  mapping(address => uint256) private _balances;

  mapping(address => mapping(address => uint256)) private _allowances;

  uint256 private _totalSupply;

  string private _name;
  string private _symbol;
  uint8 private _decimals;

  /**
   * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
   * a default value of 18.
   *
   * To select a different value for {decimals}, use {_setupDecimals}.
   *
   * All three of these values are immutable: they can only be set once during
   * construction.
   */
  constructor(string memory name, string memory symbol) public {
    _name = name;
    _symbol = symbol;
    _decimals = 18;
  }

  /**
   * @dev Returns the name of the token.
   */
  function name() public view returns (string memory) {
    return _name;
  }

  /**
   * @dev Returns the symbol of the token, usually a shorter version of the
   * name.
   */
  function symbol() public view returns (string memory) {
    return _symbol;
  }

  /**
   * @dev Returns the number of decimals used to get its user representation.
   * For example, if `decimals` equals `2`, a balance of `505` tokens should
   * be displayed to a user as `5,05` (`505 / 10 ** 2`).
   *
   * Tokens usually opt for a value of 18, imitating the relationship between
   * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
   * called.
   *
   * NOTE: This information is only used for _display_ purposes: it in
   * no way affects any of the arithmetic of the contract, including
   * {IERC20-balanceOf} and {IERC20-transfer}.
   */
  function decimals() public view returns (uint8) {
    return _decimals;
  }

  /**
   * @dev See {IERC20-totalSupply}.
   */
  function totalSupply() public override view returns (uint256) {
    return _totalSupply;
  }

  /**
   * @dev See {IERC20-balanceOf}.
   */
  function balanceOf(address account) public override view returns (uint256) {
    return _balances[account];
  }

  /**
   * @dev See {IERC20-transfer}.
   *
   * Requirements:
   *
   * - `recipient` cannot be the zero address.
   * - the caller must have a balance of at least `amount`.
   */
  function transfer(address recipient, uint256 amount)
    public
    override
    returns (bool)
  {
    _transfer(msg.sender, recipient, amount);
    return true;
  }

  /**
   * @dev See {IERC20-allowance}.
   */
  function allowance(address owner, address spender)
    public
    override
    view
    returns (uint256)
  {
    return _allowances[owner][spender];
  }

  /**
   * @dev See {IERC20-approve}.
   *
   * Requirements:
   *
   * - `spender` cannot be the zero address.
   */
  function approve(address spender, uint256 amount)
    public
    override
    returns (bool)
  {
    _approve(msg.sender, spender, amount);
    return true;
  }

  /**
   * @dev See {IERC20-transferFrom}.
   *
   * Emits an {Approval} event indicating the updated allowance. This is not
   * required by the EIP. See the note at the beginning of {ERC20};
   *
   * Requirements:
   * - `sender` and `recipient` cannot be the zero address.
   * - `sender` must have a balance of at least `amount`.
   * - the caller must have allowance for ``sender``'s tokens of at least
   * `amount`.
   */
  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) public virtual override returns (bool) {
    _transfer(sender, recipient, amount);
    _approve(
      sender,
      msg.sender,
      _allowances[sender][msg.sender].sub(
        amount,
        'ERC20: transfer amount exceeds allowance'
      )
    );
    return true;
  }

  /**
   * @dev Atomically increases the allowance granted to `spender` by the caller.
   *
   * This is an alternative to {approve} that can be used as a mitigation for
   * problems described in {IERC20-approve}.
   *
   * Emits an {Approval} event indicating the updated allowance.
   *
   * Requirements:
   *
   * - `spender` cannot be the zero address.
   */
  function increaseAllowance(address spender, uint256 addedValue)
    public
    returns (bool)
  {
    _approve(
      msg.sender,
      spender,
      _allowances[msg.sender][spender].add(addedValue)
    );
    return true;
  }

  /**
   * @dev Atomically decreases the allowance granted to `spender` by the caller.
   *
   * This is an alternative to {approve} that can be used as a mitigation for
   * problems described in {IERC20-approve}.
   *
   * Emits an {Approval} event indicating the updated allowance.
   *
   * Requirements:
   *
   * - `spender` cannot be the zero address.
   * - `spender` must have allowance for the caller of at least
   * `subtractedValue`.
   */
  function decreaseAllowance(address spender, uint256 subtractedValue)
    public
    virtual
    returns (bool)
  {
    _approve(
      msg.sender,
      spender,
      _allowances[msg.sender][spender].sub(
        subtractedValue,
        'ERC20: decreased allowance below zero'
      )
    );
    return true;
  }

  /**
   * @dev Moves tokens `amount` from `sender` to `recipient`.
   *
   * This is internal function is equivalent to {transfer}, and can be used to
   * e.g. implement automatic token fees, slashing mechanisms, etc.
   *
   * Emits a {Transfer} event.
   *
   * Requirements:
   *
   * - `sender` cannot be the zero address.
   * - `recipient` cannot be the zero address.
   * - `sender` must have a balance of at least `amount`.
   */
  function _transfer(
    address sender,
    address recipient,
    uint256 amount
  ) internal virtual {
    require(sender != address(0), 'ERC20: transfer from the zero address');
    require(recipient != address(0), 'ERC20: transfer to the zero address');
    _balances[sender] = _balances[sender].sub(
      amount,
      'ERC20: transfer amount exceeds balance'
    );
    _balances[recipient] = _balances[recipient].add(amount);
    emit Transfer(sender, recipient, amount);
  }

  /** @dev Creates `amount` tokens and assigns them to `account`, increasing
   * the total supply.
   *
   * Emits a {Transfer} event with `from` set to the zero address.
   *
   * Requirements
   *
   * - `to` cannot be the zero address.
   */
  function _mint(address account, uint256 amount) internal virtual {
    require(account != address(0), 'ERC20: mint to the zero address');
    _totalSupply = _totalSupply.add(amount);
    _balances[account] = _balances[account].add(amount);
    emit Transfer(address(0), account, amount);
  }

  /**
   * @dev Destroys `amount` tokens from `account`, reducing the
   * total supply.
   *
   * Emits a {Transfer} event with `to` set to the zero address.
   *
   * Requirements
   *
   * - `account` cannot be the zero address.
   * - `account` must have at least `amount` tokens.
   */
  function _burn(address account, uint256 amount) internal virtual {
    require(account != address(0), 'ERC20: burn from the zero address');
    _balances[account] = _balances[account].sub(
      amount,
      'ERC20: burn amount exceeds balance'
    );
    _totalSupply = _totalSupply.sub(amount);
    emit Transfer(account, address(0), amount);
  }

  /**
   * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
   *
   * This is internal function is equivalent to `approve`, and can be used to
   * e.g. set automatic allowances for certain subsystems, etc.
   *
   * Emits an {Approval} event.
   *
   * Requirements:
   *
   * - `owner` cannot be the zero address.
   * - `spender` cannot be the zero address.
   */
  function _approve(
    address owner,
    address spender,
    uint256 amount
  ) internal virtual {
    require(owner != address(0), 'ERC20: approve from the zero address');
    require(spender != address(0), 'ERC20: approve to the zero address');

    _allowances[owner][spender] = amount;
    emit Approval(owner, spender, amount);
  }
}


contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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


contract Token is IERC20, Ownable {
    using SafeMath for uint256;
    
    struct Challenger {
        uint256 acceptance;
        uint256 challenge;
    }
    
    uint256 private constant _BASE = 1 * _DECIMALFACTOR;
    uint32  private constant _TERM = 24 hours;
    
    uint256 private _prizes;
    uint256 private _challenges;
    
    mapping (address => Challenger) private _challengers;
    
    uint256 private _power;
    mapping (address => uint256) private _powers;

    string  private constant _NAME = "Gauntlet Finance";
    string  private constant _SYMBOL = "GFIv2";
    uint8   private constant _DECIMALS = 18;
    
    uint256 private constant _DECIMALFACTOR = 10 ** uint256(_DECIMALS);
    
    uint8   private constant _DENOMINATOR = 100;
    uint8   private constant _PRECISION   = 100;

    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    
    uint256 private _totalSupply; 

    uint256 private immutable _rate;
    uint8   private immutable _penalty;
    uint256 private immutable _requirement;
    
    uint256 private immutable _initialSupply;

    uint256 private _contributors;

    bool    private _paused;
    address private _TDE;
    

    event Penalized(
        address indexed account,
        uint256 amount);
    
    event Boosted(
        address indexed account,
        uint256 amount);
    
    event Deflated(
        uint256 supply,
        uint256 amount);
    
    event Recovered(
        uint256 supply,
        uint256 amount);
    
    event Added(
        address indexed account,
        uint256 time);
        
    event Removed(
        address indexed account,
        uint256 time);
    
    event Accepted(
        address indexed account,
        uint256 amount);

    event Rewarded(
        address indexed account,
        uint256 amount);
        
    event Powered(
        address indexed account,
        uint256 power);
    
    event Forfeited(
        address indexed account,
        uint256 amount);
        
    event Unpaused(
        address indexed account,
        uint256 time); 
    
    
    constructor (
        uint256 rate, 
        uint8   penalty,
        uint256 requirement) 
        public {
            
        require(rate > 0, 
        "error: must be larger than zero");
        require(penalty > 0, 
        "error: must be larger than zero");
        require(requirement > 0, 
        "error: must be larger than zero");
            
        _rate = rate;
        _penalty = penalty;
        _requirement = requirement;
        
        uint256 prizes = 20000 * _DECIMALFACTOR;
        uint256 capacity = 25000 * _DECIMALFACTOR;
        uint256 operations = 55000 * _DECIMALFACTOR;

        _mint(_environment(), prizes.add(capacity));
        _mint(_msgSender(), operations);
        
        _prizes = prizes;
        _initialSupply = prizes.add(capacity).add(operations);
        
        _paused = true;
    }
    

    function setTokenDistributionEvent(address TDE) external onlyOwner returns (bool) {
        require(TDE != address(0), 
        "error: must not be the zero address");
        
        require(_TDE == address(0), 
        "error: must not be set already");
    
        _TDE = TDE;
        return true;
    }
    function unpause() external returns (bool) {
        address account = _msgSender();
        
        require(account == owner() || account == _TDE, 
        "error: must be owner or must be token distribution event");

        _paused = false;
        
        emit Unpaused(account, _time());
        return true;
    }
    
    function reward() external returns (bool) {
        uint256 prizes = getPrizesTotal();
        
        require(prizes > 0, 
        "error: must be prizes available");
        
        address account = _msgSender();
        
        require(getReward(account) > 0, 
        "error: must be worthy of a reward");
        
        uint256 amount = getReward(account);
        
        if (_isExcessive(amount, prizes)) {
            
            uint256 excess = amount.sub(prizes);
            amount = amount.sub(excess);
            
            _challengers[account].acceptance = _time();
            _prizes = _prizes.sub(amount);
            _mint(account, amount);
            emit Rewarded(account, amount);
            
        } else {
            _challengers[account].acceptance = _time();
            _prizes = _prizes.sub(amount);
            _mint(account, amount);
            emit Rewarded(account, amount);
        }
        return true;
    }
    function challenge(uint256 amount) external returns (bool) {
        address account = _msgSender();
        uint256 processed = amount.mul(_DECIMALFACTOR);
        
        require(_isEligible(account, processed), 
        "error: must have sufficient holdings");
        
        require(_isContributor(account), 
        "error: must be a contributor");
        
        require(_isAcceptable(processed), 
        "error: must comply with requirement");
        
        _challengers[account].acceptance = _time();
        _challengers[account].challenge = processed;
        
        _challenges = _challenges.add(processed);
        
        emit Accepted(account, processed);
        return true;
    }
    
    function powerUp() external returns (bool) {
        address account = _msgSender();
        
        require(getReward(account) > 0, 
        "error: must be worthy of a reward");
        
        uint256 amount = getReward(account);

        _challengers[account].acceptance = _time();        
        _powers[account] = _powers[account].add(amount);
        _power = _power.add(amount);
        
        emit Powered(account, amount);
        return true;
    }
    function powerDown() external returns (bool) {
        uint256 prizes = getPrizesTotal();
        
        require(prizes > 0, 
        "error: must be prizes available");
        
        address account = _msgSender();
        
        require(getPower(account) > 0, 
        "error: must have convertible power");
        
        uint256 amount = getPower(account);

        if (_isExcessive(amount, prizes)) {
            
            uint256 excess = amount.sub(prizes);
            amount = amount.sub(excess);
            
            _powers[account] = _powers[account].sub(amount);  
            _power = _power.sub(amount);
            
            _prizes = _prizes.sub(amount);
            _mint(account, amount);
            emit Rewarded(account, amount);
            
        } else {
            _powers[account] = _powers[account].sub(amount);  
            _power = _power.sub(amount);
            
            _prizes = _prizes.sub(amount);
            _mint(account, amount);
            emit Rewarded(account, amount);
        }
        
        emit Powered(account, amount);
        return true;
    }
    
    function burn(uint256 amount) external returns (bool) {
        _burn(_msgSender(), amount);
        return true;
    }
    
    function getTerm() public pure returns (uint256) {
        return _TERM;
    }
    function getBase() public pure returns (uint256) {
        return _BASE;
    }
    
    function getAcceptance(address account) public view returns (uint256) {
        return _challengers[account].acceptance;
    }
    function getPeriod(address account) public view returns (uint256) {
        if (getAcceptance(account) > 0) {
            
            uint256 period = _time().sub(_challengers[account].acceptance);
            uint256 term = getTerm();
            
            if (period >= term) {
                return period.div(term);
            } else {
                return 0;
            }
            
        } else { 
            return 0;
        }
    }
    
    function getChallenge(address account) public view returns (uint256) {
        return _challengers[account].challenge;
    }
    function getFerocity(address account) public view returns (uint256) {
        return (getChallenge(account).mul(_PRECISION)).div(getRequirement());
    }
    function getReward(address account) public view returns (uint256) {
        return _getBlock(account).mul((_BASE.mul(getFerocity(account))).div(_PRECISION));
    } 
    function getPower(address account) public view returns (uint256) {
        return _powers[account];
    }
    
    function getPrizesTotal() public view returns (uint256) {
        return _prizes;
    }
    function getChallengesTotal() public view returns (uint256) {
        return _challenges;
    }   
    function getPowerTotal() public view returns (uint256) {
        return _power;
    }
    
    function getRate() public view returns (uint256) {
        return _rate;
    }
    function getPenalty() public view returns (uint8) {
        return _penalty;
    }
    function getRequirement() public view returns (uint256) {
        return _requirement;
    }

    function getCapacity() public view returns (uint256) {
        return balanceOf(_environment()).sub(getPrizesTotal());
    }
    
    function getContributorsTotal() public view returns (uint256) {
        return _contributors;
    }
    function getContributorsLimit() public view returns (uint256) {
        return getCapacity().div(getRate());
    }

    function name() public pure returns (string memory) {
        return _NAME;
    }
    function symbol() public pure returns (string memory) {
        return _SYMBOL;
    }
    function decimals() public pure returns (uint8) {
        return _DECIMALS;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }
    function initialSupply() public view returns (uint256) {
        return _initialSupply;
    }
    
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        address sender = _msgSender();

        require(_isNotPaused() || recipient == _TDE || sender == _TDE, 
        "error: must not be paused else must be token distribution event recipient or sender");

        _checkReactiveness(sender, recipient, amount);
        _checkChallenger(sender, amount);
        
        _transfer(sender, recipient, amount);

        return true;
    }
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        require(_isNotPaused() || recipient == _TDE || sender == _TDE, 
        "error: must not be paused else must be token distribution event recipient or sender");
        
        _checkReactiveness(sender, recipient, amount);
        _checkChallenger(sender, amount);
        
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));

        return true;
    }
    
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        
        if (sender == owner() && recipient == _TDE || sender == _TDE) {
            _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
            _balances[recipient] = _balances[recipient].add(amount);
            
            emit Transfer(sender, recipient, amount);
            
        } else {
            uint256 penalty = _computePenalty(amount);
            
            uint256 boosted = penalty.div(2);
            uint256 prize   = penalty.div(2);

            _prize(prize);
            _boost(boosted);

            uint256 processed = amount.sub(penalty);
            
            _balances[sender] = _balances[sender].sub(processed, "ERC20: transfer amount exceeds balance");
            _balances[recipient] = _balances[recipient].add(processed);
            
            emit Transfer(sender, recipient, processed);
        }
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        
        emit Transfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        
        emit Transfer(account, address(0), amount);
    }
    
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    
    function _boost(uint256 amount) private returns (bool) {
        _mint(_environment(), amount);
        emit Boosted(_environment(), amount);
        return true;
    }
    function _prize(uint256 amount) private returns (bool) {
        _mint(_environment(), amount);
        _prizes = _prizes.add(amount);
        emit Rewarded(_environment(), amount);
        return true;
    }
    
    function _checkReactiveness(address sender, address recipient, uint256 amount) private {
        if (_isUnique(recipient)) {
            if (_isCompliant(recipient, amount)) {
                _addContributor(recipient);
                if(_isElastic()) {
                    _deflate();
                }
            }
        }
        if (_isNotUnique(sender)) {
            if (_isNotCompliant(sender, amount)) {
                _removeContributor(sender);
                if(_isElastic()) {
                    _recover();
                }
            }
        }
    }
    function _checkChallenger(address account, uint256 amount) private {
        if (_isChallenger(account)) {
            if (balanceOf(account).sub(amount) < getChallenge(account)) {
                
                uint256 challenged = getChallenge(account);
                _challenges = _challenges.sub(challenged);
                
                delete _challengers[account].acceptance;
                delete _challengers[account].challenge;
                
                emit Forfeited(account, challenged);
            }
        }
    }    
    
    function _deflate() private returns (bool) {
        uint256 amount = getRate();
        _burn(_environment(), amount);
        emit Deflated(totalSupply(), amount);
        return true;
        
    }
    function _recover() private returns (bool) {
        uint256 amount = getRate();
        _mint(_environment(), amount);
        emit Recovered(totalSupply(), amount);
        return true;
    }
    
    function _addContributor(address account) private returns (bool) {
        _contributors++;
        emit Added(account, _time());
        return true;
    } 
    function _removeContributor(address account) private returns (bool) {
        _contributors--;
        emit Removed(account, _time());
        return true;
    } 

    function _computePenalty(uint256 amount) private view returns (uint256) {
        return (amount.mul(getPenalty())).div(_DENOMINATOR);
    }
    function _isNotPaused() private view returns (bool) {
        if (_paused) { return false; } else { return true; }
    }

    function _isUnique(address account) private view returns (bool) {
        if (balanceOf(account) < getRequirement()) { return true; } else { return false; }
    }
    function _isNotUnique(address account) private view returns (bool) {
        if (balanceOf(account) > getRequirement()) { return true; } else { return false; }
    }    
    
    function _getAcceptance(address account) private view returns (uint256) {
        return _challengers[account].acceptance;
    }
    function _getEpoch(address account) private view returns (uint256) {
        if (_getAcceptance(account) > 0) { return _time().sub(_getAcceptance(account)); } else { return 0; }
    } 
    function _getBlock(address account) private view returns (uint256) {
        return _getEpoch(account).div(_TERM); 
    }
    
    function _isContributor(address account) private view returns (bool) {
        if (balanceOf(account) >= getRequirement()) { return true; } else { return false; }
    }
    function _isEligible(address account, uint256 amount) private view returns (bool) {
        if (balanceOf(account) >= amount) { return true; } else { return false; }
    }
    function _isAcceptable(uint256 amount) private view returns (bool) {
        if (amount >= getRequirement()) { return true; } else { return false; }
    }
    function _isChallenger(address account) private view returns (bool) {
        if (_getAcceptance(account) > 0) { return true; } else { return false; }
    }
    
    function _isExcessive(uint256 amount, uint256 ceiling) private pure returns (bool) {
        if (amount > ceiling) { return true; } else { return false; }
    }
    
    function _isCompliant(address account, uint256 amount) private view returns (bool) {
        if (balanceOf(account).add(amount) >= getRequirement()) { return true; } else { return false; }
    }
    function _isNotCompliant(address account, uint256 amount) private view returns (bool) {
        if (balanceOf(account).sub(amount) < getRequirement()) { return true; } else { return false; }
    }
    
    function _isElastic() private view returns (bool) {
        if (getContributorsTotal() <= getContributorsLimit() && getContributorsTotal() > 0) { return true; } else { return false; }
    }
    
    function _environment() private view returns (address) {
        return address(this);
    }
    function _time() private view returns (uint256) {
        return block.timestamp;
    }
    
}


contract TDE is Context {
    using SafeMath for uint256;
    
    Token private _token;
    IUniswapV2Router02 private _uniswapRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    
    uint256 private constant _TOKEN_ALLOCATION_SALE = 40000000000000000000000; 

    uint256 private constant _FIRST_CEILING = 100 ether;
    uint256 private constant _TOTAL_CEILING = 1250 ether;
    
    uint8   private constant _LOYALTY_PERCENT = 25; 
    uint8   private constant _UNISWAP_PERCENT = 45;
    
    uint256 private constant _UNISWAP_RATE = 11;

    uint256 private constant _MIN_CONTRIBUTION = 1 ether;
    
    uint256 private constant _MAX_CONTRIBUTION_FIRST_MOVER_STAGE_NOT_WHITELISTED = 5 ether; 
    uint256 private constant _MAX_CONTRIBUTION_FIRST_MOVER_STAGE_WHITELISTED = 10 ether; 
    
    uint8   private constant _MULTIPLIER  = 150;
    uint8   private constant _DENOMINATOR = 100;
    uint8   private constant _PRECISION   = 100;
    
    uint32  private constant _DURATION = 7 days;
    
    uint256 private _launch;
    uint256 private _over;
    
    uint256 private _fr;
    uint256 private _rr;
    
    mapping(address => uint256) private _contributions;
    mapping(address => bool) private _whitelisted;

    address payable private _wallet;
    
    uint256 public _tokens;
    uint256 private _buffer;
    uint256 private _funds;

    bool private _locked;
    bool private _legacy;
    

    event Configured(
        uint256 rate1,
        uint256 rate2);

    event Contributed(
        address indexed account,
        uint256 amount);
        
    event LiquidityLocked(
        uint256 amountETH,
        uint256 amountToken);
        
    event Finalized(
        uint256 time);
        
    event Destroyed(
        uint256 amount);
    
    
    constructor(address token, address payable wallet) public {
        require(token != address(0), 
        "error: must not be zero address");
        require(wallet != address(0), 
        "error: must not be zero address");
        
        _buffer = (_TOTAL_CEILING.mul(_UNISWAP_PERCENT).div(_DENOMINATOR)).mul(_UNISWAP_RATE);
        _tokens = _TOKEN_ALLOCATION_SALE.sub(_buffer);
        
        _launch = _time();
        _over = _launch.add(_DURATION);
        
        _token = Token(token);
        _wallet = wallet; 
        
        _calculateRates();
    }
    
    receive() external payable {
        require(!_isOver(), 
        "error: must not be over");
        
        if (_token.balanceOf(_environment()) == 0) revert();
        if (_token.balanceOf(_environment()) > 0) _contribute();
    }
    
    function lockLiquidity() external returns (bool) {
        require(_isOver(), 
        "error: must be over");
        require(!_isLocked(), 
        "error: must not be locked");

        _locked = true;
        
        uint256 amountETHForUniswap = (getFunds().mul(_UNISWAP_PERCENT)).div(_DENOMINATOR);
        uint256 amountGFIForUniswap = (amountETHForUniswap.mul((_UNISWAP_RATE.mul(_PRECISION)))).div(_PRECISION);
        
        require(_token.unpause(), 
        "error: must be unpausable");
        
        require(_token.approve(address(_uniswapRouter), amountGFIForUniswap), 
        "error: must be approved");
        
        _uniswapRouter.addLiquidityETH
        { value: amountETHForUniswap }
        (
            address(_token),
            amountGFIForUniswap,
            0,
            0,
            address(0), 
            _time()
        );
        
        emit LiquidityLocked(amountETHForUniswap, amountGFIForUniswap);
        return true;
    }
    
    function whitelist() external returns (bool) {
        require(!_legacy, 
        "error: must not already have whitelisted legacy contributors");
        
        _whitelisted[0xdec08cb92a506B88411da9Ba290f3694BE223c26] = true;
        _whitelisted[0x5782728c449fCF4D5FA2644a5680ba66b2d9327F] = true;
        _whitelisted[0xdec08cb92a506B88411da9Ba290f3694BE223c26] = true;
        _whitelisted[0x5782728c449fCF4D5FA2644a5680ba66b2d9327F] = true;
        _whitelisted[0xe15863985BE0c9Fb9D590E2d1D6486a551d63e06] = true;
        _whitelisted[0xa7E3058e7C4eB1b18a4c18C69983daA8D724bd28] = true;
        _whitelisted[0xBB1095B606774b6bD4e64619BF2239D152BB6774] = true;
        _whitelisted[0xDDFB4C1841d57C9aCAe1dC1D1c8C1EAecc1568FC] = true;
        _whitelisted[0xB16E1101CbB48F631AB4dBd54c801Ecef9B47D2b] = true;
        _whitelisted[0xe0B54aa5E28109F6Aa8bEdcff9622D61a75E6B83] = true;
        _whitelisted[0x75B0bBD46d7752CB2f5FfE645467e0ce6E389795] = true;
        _whitelisted[0x9fdB427dCD7cB55C7F228a3b5C9814c086C4dC94] = true;
        _whitelisted[0x63BD5327D12A93c7265785Ced9d7693cadBb40d8] = true;
        _whitelisted[0xfEEAa6A2aE0D4a15e947AFC71DC249A29Dc2778d] = true;
        _whitelisted[0x0FB5B52cA714D07321A4913408B00e83675b53F8] = true;
        _whitelisted[0xCbaFAE637587e048cAd5B2f9736996A76308D99E] = true;
        _whitelisted[0x6Ee6107a6C9aDB834d6ba0985dDA992905526e5a] = true;
        _whitelisted[0xd838a891E891d9E59942a5d04d26B1b67a0e6779] = true;
        _whitelisted[0xf0478C748428f35ab13a965BB76A170A6359B00B] = true;
        _whitelisted[0xff37697171B95605b4511030C9Cdc2dcEA0A51e2] = true;
        _whitelisted[0x9C705a173ab01929a29c68D1e3627F744A9ECE24] = true;
        _whitelisted[0x75ef5403b6E53686fE5eF3376d87BB5E84671E1e] = true;
        _whitelisted[0x27388bdbC5132d8348981C7f68a86326e4330AD3] = true;
        _whitelisted[0x89B404b52ab50Fd3e7ff316d5C659cbcB8dc700b] = true;
        _whitelisted[0xe36288736e5a45c27ee6FA2F8d1A1aeD99D3eA63] = true;
        _whitelisted[0xd491447348c474aF15c40839D3e0056A80fEC352] = true;
        _whitelisted[0xD6eEF3cf97A349960b0C976929BAE90435b2BFb2] = true;
        _whitelisted[0xa76B0152fE8BC2eC3CbfAC3D3ecee4A397747051] = true;
        _whitelisted[0xcC05590bA009b10CB30A7b7e87e2F517Ea2F4301] = true;
        _whitelisted[0x6400E53111Fd4B600814fcCdb990C8EDD18780C3] = true;
        _whitelisted[0x710049Cfe15475b24D587CC2bF5fFa2007E7a9BE] = true;
        _whitelisted[0xD8D55b75dE1b10A1fC9811c0c1422C241093c21c] = true;
        _whitelisted[0xDb8FeDAB0fDAD50d4Fa79096F6217185e4157B76] = true;
        _whitelisted[0x109f860cFb26339e7635e0BD33D24FA419566CC6] = true;
        _whitelisted[0x3Dd4234DaeefBaBCeAA6068C04C3f75F19aa2cdA] = true;
        _whitelisted[0x0613e2c0e58E811e358C0e26B51842eEDA05AEd4] = true;
        _whitelisted[0x5BBe5c40AF27DBe17adb4Cf24a4793D4dBFF5614] = true;
        _whitelisted[0xED66081dF3f42a5e3Ce388F93815Eff87462F1CE] = true;
        _whitelisted[0xCDa9BFE9D578003E9dBDC90A5Dd1E9B0F52C01f6] = true;
        _whitelisted[0x40428BdeDDb4FFc6124e1a96692968aB3e03F7d8] = true;
        _whitelisted[0x83f81720e2cEf8e246a3c24dB897afEb48a978fa] = true;
        _whitelisted[0x7FCA6E58FE281389901cA313Be31d0ba0c29c4cc] = true;
        _whitelisted[0x4c9C3626Cf1828Da7b58a50DC2F6AA2C4546609e] = true;
        _whitelisted[0xf30b321970b3a4BBA00d068284F9E4C09D2befE1] = true;
        _whitelisted[0x66D45a58CF49f054938c0a288793c420Fe98bB04] = true;
        _whitelisted[0xB4AAe67267a76c11F2A00Fe7304c6D716c2f65E5] = true;
        _whitelisted[0x92b5a3f06fe24CeA07a6F92aA94F2994d481Afc8] = true;
        _whitelisted[0x8dB7147b554B739058E74C01042d2aEA44505E2F] = true;
        _whitelisted[0x2019E3f8b40B144ef1FBf92c4e36DF981F37ba2c] = true;
        _whitelisted[0x8c3De1634251D1e51C28844391FC9c11abB9F5E4] = true;
        _whitelisted[0x1De8EE475989A81a353ec6e4ea5a5C0aC60642d0] = true;
        _whitelisted[0x29Bf6652e795C360f7605be0FcD8b8e4F29a52d4] = true;
        _whitelisted[0x9Dd80697C85De40890D355a38cec7a8d3Dc9D71a] = true;
        _whitelisted[0xa4D8e21f63E875C1B544d324908f5bABd4D1960D] = true;
        _whitelisted[0x9d1b27796Adb236512D4bc0f26dE4C12dFde37d0] = true;
        _whitelisted[0xce3e142Bc70F5a0f674A2ef5649b3248842cf1A5] = true;
        _whitelisted[0xBE719b05B4dBF02ed9555ef92d36d746312403AE] = true;
        _whitelisted[0x65a7C3Cb6d1C3cEf361063C57936d9d4c9D7bCAB] = true;
        _whitelisted[0x2019E3f8b40B144ef1FBf92c4e36DF981F37ba2c] = true;
        _whitelisted[0x8EDAB1576B34b0BFdcdF4F368eFDE5200ff6F4e8] = true;
        _whitelisted[0x77543419f10E8C04BcAF826C2dB9C3bEDDEfBa40] = true;
        _whitelisted[0x05FB3770CA63ECEE9C5a6874254022820DbEf944] = true;
        
        _legacy = true;
        return true;
    }
    
    function finalize() external returns (bool) {
        require(_isOver(), 
        "error: must be over");
        
        require(_isLocked(), 
        "error: must be locked");
        
        _vault();
        _destroy();
        
        emit Finalized(_time());
        return true;
    }
    
    function getLaunch() public view returns (uint256) {
        return _launch;
    }
    function getOver() public view returns (uint256) {
        return _over;
    }
    function getFunds() public view returns (uint256) {
        return _funds;
    }
    
    function getContribution(address contributor) public view returns (uint256) {
        return _contributions[contributor];
    }
    function getContributionBonus(address contributor) public view returns (uint8) {
        if (_isWhitelisted(contributor)) { return _LOYALTY_PERCENT; } else { return 0; }
    }
    function getContributionCeiling(address contributor) public view returns (uint256) {
        if (_isWhitelisted(contributor)) { 
            return _MAX_CONTRIBUTION_FIRST_MOVER_STAGE_WHITELISTED; 
        } else { 
            return _MAX_CONTRIBUTION_FIRST_MOVER_STAGE_NOT_WHITELISTED; 
        }
    }

    function _calculateRates() private returns (bool) {
        require(_isNotConfigured(), 
        "error: must not be configured");

        _rr = (_tokens.sub(_buffer)).div(_TOTAL_CEILING);
        _fr = (_rr.mul(_MULTIPLIER)).div(_DENOMINATOR);

        Configured(_fr, _rr);
        return true;
    }
    
    function _contribute() private returns (bool) {
        address contributor = _msgSender();
        uint256 contribution = msg.value;
        
        require(_checkContribution(contribution),
        "error: must comply with contribution requirements");
        
        uint256 contributorCeiling = getContributionCeiling(contributor);
        uint256 contributorBonus = getContributionBonus(contributor);
        
        uint256 processedContribution;
        uint256 excessContribution;
        
        uint256 tokens;
        uint256 bonus;

        if (_isFirstMover()) {
            
            require(_isWithinCeiling(contributor, contribution, contributorCeiling), 
            "error: contribution must not exceed contributor ceiling");
            
            processedContribution = _FIRST_CEILING.sub(getFunds());
        
            if (_isExcessive(contribution, processedContribution)) {
                excessContribution = contribution.sub(processedContribution);
            
                tokens = (processedContribution.mul(_fr)).add(excessContribution.mul(_rr));
                
                if (contributorBonus > 0) {
                    bonus = (tokens.mul(contributorBonus)).div(_DENOMINATOR);
                    tokens = tokens.add(bonus);
                }
                
                require(_token.transfer(contributor, tokens), 
                "error: must be transferable");
                
                _funds = _funds.add(contribution);
                
                _contributions[contributor] = _getContribution(contributor).add(contribution);
                _tokens = _tokens.sub(tokens);
                
                emit Contributed(contributor, processedContribution);
                return true;
                
            } else {
                tokens = (contribution.mul(_fr));
                
                if (contributorBonus > 0) {
                    bonus = (tokens.mul(contributorBonus)).div(_DENOMINATOR);
                    tokens = tokens.add(bonus);
                }
                
                require(_token.transfer(contributor, tokens), 
                "error: must be transferable");
                
                _funds = _funds.add(contribution);
                
                _contributions[contributor] = _getContribution(contributor).add(contribution);
                _tokens = _tokens.sub(tokens);
                
                emit Contributed(contributor, processedContribution);
                return true;
            }
            
        } else {
            
            tokens = contribution.mul(_rr);
            processedContribution = _TOTAL_CEILING.sub(getFunds());
            
            if (_isExcessive(contribution, processedContribution)) {
                excessContribution = contribution.sub(processedContribution);
                processedContribution = contribution.sub(excessContribution);
                
                tokens = processedContribution.mul(_rr);
                
                if (contributorBonus > 0) {
                    bonus = (tokens.mul(contributorBonus)).div(_DENOMINATOR);
                    tokens = tokens.add(bonus);
                    
                    if (_isExcessive(tokens, _tokens)) {
                        
                        uint256 excessTokens = tokens.sub(_tokens);
                        uint256 excessETH = (excessTokens.sub((excessTokens.mul(contributorBonus)).div(_DENOMINATOR))).div(_rr);
                        
                        excessContribution = excessContribution.add(excessETH);
                        processedContribution = processedContribution.sub(excessETH);

                        tokens = _tokens;
                    }
                }
                
                _msgSender().transfer(excessContribution);
                
                require(_token.transfer(contributor, tokens), 
                "error: must be transferable");
                
                _funds = _funds.add(processedContribution);
                _tokens = _tokens.sub(tokens);
                
                _contributions[contributor] = _getContribution(contributor).add(processedContribution);
                
                emit Contributed(contributor, processedContribution);
                return true;
            }
            
        if (contributorBonus > 0) {
            bonus = (tokens.mul(contributorBonus)).div(_DENOMINATOR);
            tokens = tokens.add(bonus);
        }
            
        require(_token.transfer(contributor, tokens), 
        "error: must be transferable");
            
        _funds = _funds.add(contribution);
        _tokens = _tokens.sub(tokens);
        
        _contributions[contributor] = _getContribution(contributor).add(contribution);
        
        emit Contributed(contributor, contribution);
        return true;
        }
    }
    
    function _vault() private returns (bool) {
        _wallet.transfer(_environment().balance);
        return true;
    }
    function _destroy() private returns (bool) {
        uint256 amount = _token.balanceOf(_environment());

        _token.burn(amount);
        
        emit Destroyed(amount);
        return true;
    }
    
    function _checkContribution(uint256 amount) private view returns (bool) {
        require(_isLaunched(), 
        "error: must be launched");
        require(_isActive(), 
        "error: must be active");
        require(amount >= _MIN_CONTRIBUTION, 
        "error: must be more or equal to the minimum contribution");
        require(getFunds() < _TOTAL_CEILING, 
        "error: must not have reached maximum funds");
        return true;
    }

    function _isLaunched() private view returns (bool) {
        if (getLaunch() > 0) { return true; } else { return false; } 
    }
    function _isNotConfigured() private view returns (bool) {
        if (_fr == 0 && _rr == 0) { return true; } else { return false; } 
    }

    function _isActive() private view returns (bool) {
        if (getOver() > _time() || getFunds() < _TOTAL_CEILING) { return true; } else { return false; }
    }
    function _isFirstMover() private view returns (bool) {
        if (getFunds() < _FIRST_CEILING) { return true; } else { return false; }
    }
    function _isExcessive(uint256 amount, uint256 ceiling) private pure returns (bool) {
        if (amount > ceiling) { return true; } else { return false; }
    }
    
    function _isWhitelisted(address contributor) private view returns (bool) {
        if (_whitelisted[contributor]) { return true; } else { return false; }
    }
    function _isWithinCeiling(address contributor, uint256 amount, uint256 ceiling) private view returns (bool) {
        if (_contributions[contributor].add(amount) <= ceiling) { return true; } else { return false; }
    }
    
    function _getContribution(address contributor) private view returns (uint256) {
        return _contributions[contributor];
    }
    
    function _isOver() private view returns (bool) {
        if (getOver() <= _time() || getFunds() >= _TOTAL_CEILING || _tokens == 0) { return true; } else { return false; }
    }
    function _isLocked() private view returns (bool) {
        return _locked;
    }

    function _environment() private view returns (address) {
        return address(this);
    }
    function _time() private view returns (uint256) {
        return block.timestamp;
    }

}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address payable","name":"wallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rate1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rate2","type":"uint256"}],"name":"Configured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Contributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Destroyed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"}],"name":"LiquidityLocked","type":"event"},{"inputs":[],"name":"_tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"getContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"getContributionBonus","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"getContributionCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLaunch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOver","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600180546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790553480156200003757600080fd5b506040516200281b3803806200281b833981810160405260408110156200005d57600080fd5b5080516020909101516001600160a01b038216620000c2576040805162461bcd60e51b815260206004820152601f60248201527f6572726f723a206d757374206e6f74206265207a65726f206164647265737300604482015290519081900360640190fd5b6001600160a01b0381166200011e576040805162461bcd60e51b815260206004820152601f60248201527f6572726f723a206d757374206e6f74206265207a65726f206164647265737300604482015290519081900360640190fd5b62000174600b6200016060646200014c6843c33c193756480000602d62000225602090811b62001cd417901c565b6200028c60201b62001d871790919060201c565b6200022560201b62001cd41790919060201c565b600a81905550620001a0600a54690878678326eac9000000620002d660201b62001c6f1790919060201c565b600955620001b66001600160e01b036200032016565b6002819055620001d69062093a8062000325602090811b62001d2d17901c565b600355600080546001600160a01b038085166001600160a01b03199283161790925560088054928416929091169190911790556200021c6001600160e01b036200038016565b505050620005b3565b600082620002365750600062000286565b828202828482816200024457fe5b0414620002835760405162461bcd60e51b8152600401808060200182810382526021815260200180620027fa6021913960400191505060405180910390fd5b90505b92915050565b60006200028383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200048260201b60201c565b60006200028383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200052960201b60201c565b425b90565b60008282018381101562000283576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000620003956001600160e01b036200058616565b620003e7576040805162461bcd60e51b815260206004820152601d60248201527f6572726f723a206d757374206e6f7420626520636f6e66696775726564000000604482015290519081900360640190fd5b620004136843c33c1937564800006200014c600a54600954620002d660201b62001c6f1790919060201c565b600581905562000439906064906200014c90609662000225602090811b62001cd417901c565b600481905560055460408051928352602083019190915280517ff314bf3c90b46e174ab99f91ef073816e45a9c6a734a681fc5a6dfe947d71a2e9281900390910190a150600190565b60008183620005125760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620004d6578181015183820152602001620004bc565b50505050905090810190601f168015620005045780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200051f57fe5b0495945050505050565b600081848411156200057e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315620004d6578181015183820152602001620004bc565b505050900390565b600060045460001480156200059b5750600554155b15620005aa5750600162000322565b50600062000322565b61223780620005c36000396000f3fe6080604052600436106100955760003560e01c80638970d84c116100595780638970d84c1461030c57806393e59dc114610321578063bb2f719914610336578063d213f62e1461034b578063eb4c4f481461037e57610226565b806319f28d491461022b57806321eff7fc146102745780634bb278f3146102b95780634d9b3735146102e25780637b07dc36146102f757610226565b36610226576100a2610393565b156100f4576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d757374206e6f74206265206f766572000000000000000000604482015290519081900360640190fd5b6000546001600160a01b03166370a0823161010d6103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561015357600080fd5b505afa158015610167573d6000803e3d6000fd5b505050506040513d602081101561017d57600080fd5b505161018857600080fd5b600080546001600160a01b03166370a082316101a26103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156101e857600080fd5b505afa1580156101fc573d6000803e3d6000fd5b505050506040513d602081101561021257600080fd5b50511115610224576102226103e5565b505b005b600080fd5b34801561023757600080fd5b5061025e6004803603602081101561024e57600080fd5b50356001600160a01b0316610b80565b6040805160ff9092168252519081900360200190f35b34801561028057600080fd5b506102a76004803603602081101561029757600080fd5b50356001600160a01b0316610ba1565b60408051918252519081900360200190f35b3480156102c557600080fd5b506102ce610bbc565b604080519115158252519081900360200190f35b3480156102ee57600080fd5b506102a7610cb0565b34801561030357600080fd5b506102a7610cb6565b34801561031857600080fd5b506102a7610cbc565b34801561032d57600080fd5b506102ce610cc2565b34801561034257600080fd5b506102ce6116c4565b34801561035757600080fd5b506102a76004803603602081101561036e57600080fd5b50356001600160a01b0316611a85565b34801561038a57600080fd5b506102a7611ab3565b600061039d611ab9565b6103a5611ab3565b1115806103c257506843c33c1937564800006103bf610cb0565b10155b806103cd5750600954155b156103da575060016103de565b5060005b90565b3090565b6000806103f0611abd565b9050346103fc81611ac1565b6104375760405162461bcd60e51b81526004018080602001828103825260318152602001806120db6031913960400191505060405180910390fd5b600061044283611a85565b9050600061044f84610b80565b60ff169050600080600080610462611c0a565b156106f357610472888888611c2c565b6104ad5760405162461bcd60e51b81526004018080602001828103825260378152602001806121cb6037913960400191505060405180910390fd5b6104ce6104b8610cb0565b68056bc75e2d631000009063ffffffff611c6f16565b93506104da8785611cba565b156106df576104ef878563ffffffff611c6f16565b925061052961050960055485611cd490919063ffffffff16565b60045461051d90879063ffffffff611cd416565b9063ffffffff611d2d16565b91508415610567576105526064610546848863ffffffff611cd416565b9063ffffffff611d8716565b9050610564828263ffffffff611d2d16565b91505b600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156105c057600080fd5b505af11580156105d4573d6000803e3d6000fd5b505050506040513d60208110156105ea57600080fd5b505161063d576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610650908863ffffffff611d2d16565b600b556106608761051d8a610ba1565b6001600160a01b03891660009081526006602052604090205560095461068c908363ffffffff611c6f16565b6009556040805185815290516001600160a01b038a16917f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab919081900360200190a26001985050505050505050506103de565b60045461052990889063ffffffff611cd416565b60055461070790889063ffffffff611cd416565b915061072a610714610cb0565b6843c33c1937564800009063ffffffff611c6f16565b93506107368785611cba565b156109de5761074b878563ffffffff611c6f16565b925061075d878463ffffffff611c6f16565b935061077460055485611cd490919063ffffffff16565b9150841561082b576107916064610546848863ffffffff611cd416565b90506107a3828263ffffffff611d2d16565b91506107b182600954611cba565b1561082b5760006107cd60095484611c6f90919063ffffffff16565b6005549091506000906107fd906105466107f0606482878d63ffffffff611cd416565b859063ffffffff611c6f16565b905061080f858263ffffffff611d2d16565b9450610821868263ffffffff611c6f16565b9550600954935050505b610833611abd565b6001600160a01b03166108fc849081150290604051600060405180830381858888f1935050505015801561086b573d6000803e3d6000fd5b50600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156108c557600080fd5b505af11580156108d9573d6000803e3d6000fd5b505050506040513d60208110156108ef57600080fd5b5051610942576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610955908563ffffffff611d2d16565b600b5560095461096b908363ffffffff611c6f16565b60095561097b8461051d8a610ba1565b6001600160a01b038916600081815260066020908152604091829020939093558051878152905191927f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab92918290030190a26001985050505050505050506103de565b8415610a0e576109f96064610546848863ffffffff611cd416565b9050610a0b828263ffffffff611d2d16565b91505b600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015610a6757600080fd5b505af1158015610a7b573d6000803e3d6000fd5b505050506040513d6020811015610a9157600080fd5b5051610ae4576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610af7908863ffffffff611d2d16565b600b55600954610b0d908363ffffffff611c6f16565b600955610b1d8761051d8a610ba1565b6001600160a01b0389166000818152600660209081526040918290209390935580518a8152905191927f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab92918290030190a26001985050505050505050506103de565b6000610b8b82611dc9565b15610b9857506019610b9c565b5060005b919050565b6001600160a01b031660009081526006602052604090205490565b6000610bc6610393565b610c0d576040805162461bcd60e51b815260206004820152601360248201527232b93937b91d1036bab9ba1031329037bb32b960691b604482015290519081900360640190fd5b610c15611df2565b610c5e576040805162461bcd60e51b8152602060048201526015602482015274195c9c9bdc8e881b5d5cdd081899481b1bd8dad959605a1b604482015290519081900360640190fd5b610c66611dfb565b50610c6f611e52565b507f839cf22e1ba87ce2f5b9bbf46cf0175a09eed52febdfaac8852478e68203c763610c99611ab9565b60408051918252519081900360200190a150600190565b600b5490565b60025490565b60095481565b600c54600090610100900460ff1615610d0c5760405162461bcd60e51b815260040180806020018281038252603c81526020018061218f603c913960400191505060405180910390fd5b5060076020527f0c4f74400277bc9ebfde150d808b40c98b167dc7a3f8fa3fce766e39c031156f80547f63ede79f6715e0388dbc17ca5b2e6d337dbb73ceba352307c6c9feda7f393b36805460ff19928316600190811784168117909455821683178216831790557ffca776baf84360d837d4844dabdd99bce023edc2501147db1731d4e5e00e543680548216831790557fd10dcce221972ecb385cb9671a4181901ed8c2ed09f79be2128a29f67be904a380548216831790557fbe6948d6872952e5d72d4c052ba06253eb169aae18ffd799edae6f9ada106d1880548216831790557fc147f1a1f003cca9465956d0a5094092fddd699378a15a53772daaa01ae0755180548216831790557f16cd8f2b9b3bdd26a2550babbb9578d06de5f51f5adab51f7f729bca4ee94f0f80548216831790557f46b4bfadbd89931105aabc58ea09c8cc73cf4182fba899587cdf7896d4ba2af880548216831790557feb04b378943f4042794c767458a8a4c93b1fac667af7c6ece2fda78c27c6118380548216831790557feefa7f836f5e87643d555ad633fbd3d2dd838208401bcd82c53f6d01a654bc2280548216831790557ff465ec26741fd9702dd5f4c7e1731d5de6f0ec12bd1cf89b5ba76428820670ba80548216831790557f5a33bab911b45070d9caaf0d54880203cc899674845e74b618dfedde7649a13e80548216831790557fc01e1e63b2b5c5d4784c86cc890081a0693a6ee0796908fc37d0022d602d390a80548216831790557f9729261abbeae23652d9a4f3cbd8e57966e8a1ede368a7cded438c4a1d84e97680548216831790557fd3abf9eac845186d04f3aa9bb6dbd768228561491813404148fca70bd003c78080548216831790557f1c5064f3eca50236bd532ece94e5a5a8a205540b751bb1b3269e496f73e4a57f80548216831790557f492d26a99d2fd31724c9e583a21f86e73329c7c8a4b779b95737e1ad37aa03f780548216831790557f97d4bf73de36548759fd524ed8e1a2d8c97bfb6ce54eea3d7a537b44538151fc80548216831790557f9f0699132d9ec82357a19a389eb01adda5dc972e34a623eb78c567c20a9cfba980548216831790557f9b236971fc43f7665d850bebaefd3d35b179c93faada5881da0b5901b4cb085f80548216831790557fbacbbf2e44dd911fccfcd8fcdf0855db480956aba70fc8eb327ccb9e360a7f8a80548216831790557fb37d0aef72f87a2ae0f0c6215aaf6eb1a7c734dbf589f8f9413df48e10dc7f1580548216831790557fd42eda0c91c0efe1287f0918576a21ae5b358ddc6455f97b24591640ac30311380548216831790557ff92717cfe0b6330bb94f1fee6211300d7f3ba8f72a16244161c3b0ef03be850a80548216831790557fc047173addcc53fa2cda82a633c51f921df3c561575708547155d761ee53ffde80548216831790557fc406acef5e6698d60e57ae90d885e83b1c4c5016dd5634fa21af3f82cbb8107080548216831790557f06b4c2e9cafc107e255b8e0e5a2f1b0a1bc71d9c1230b8d6e4e22fb06a6cacbb80548216831790557fc5419f760fff43ec148ebe02ea68928f16b8e8f911d68dc9a8ae737a3ae505bb80548216831790557f7b00169774f0ac692c54318e6799cc99bffb16bf1b887532a8c98a1d752da84f80548216831790557fd2f12e2128f472486fafe5ba5915cd75f36e8ac4514fd7eff74f224cefacbb1d80548216831790557f9eca4d1cb6021c50f377bd9605dd4ceb962e56789ee1b817402a95dc2ef95fb580548216831790557f4e3190177450bf3c0569a5fa5ebdbe146b6589fbe9a43ff5c533ebb00dad4d0580548216831790557f0140275e51f9796e08ebdd85aeb7461aa5525b6c7f30b685ea9e29c9d480592780548216831790557f10c46ca3996014c31e2d96c736bdfa113f04311568a8cf7ab26e42fa6a007b5180548216831790557f58671f0070d2f40a29e57a7fd2cb478ef144f7173679c842a51195ed54d53fea80548216831790557f9a2571fd168fbc241cecf552bf2328e48fc50a361579b1cd52ac866af50bbf2f80548216831790557fec25f9b0308372e6b04688519b7c8f666a058429239421e9a0a3c439760a9d6a80548216831790557f38aa1216e40105b784dd2f594ea3d84611599d63435ee2706579e53b44043e5380548216831790557fd52704390f47368860344b6f5bff464a9c792a971ef9a5e15551205e2b66b01280548216831790557f6ccf6051e0c7d84e03c444737f0d89628d25e7ae4fdd7006c236d70e8989978880548216831790557f7f85b95f14c985bebc9ae606c9e75480bba9e2649f3d33edab779869b9cacf5c80548216831790557f3d4346477ec63e7754ad0fbd2fe4499c5a4037abaeffdbf9210dbe3a404af3e380548216831790557f4f091d3a005b08a3d99b6d866baceeac0f5374e6e5e232d5eecc135568f6913680548216831790557fc25c04b0cd1125543fd8de62e43dad78b318c1047e2d689e768e6d969df99fc880548216831790557f0b4924a25b1c8c484f801dc495a3f913cb9de8e779f9b2e3c300d2acdbbb329b80548216831790557f25846e14bb5d80c7de1d95505a5022edd7e7203cf691aaca206e872cbdb91cb280548216831790557f7e684b25ca3c77cf6d19ead8b0303e03ff1f06817c64066097743a7b9c5dcd0e80547f4838f250864fd5d6f84fb2ad95315d965e8c883143999979dde253641daa3f2180548416851790557fc303b1e48154cd75040bd36d392b589fa60c14804d1bc2790d4206287b6fa1b580548416851790557fe71cd27f42dd3326e4979d063c92a589abefebf775b315c4fc72e1e3e81bac3c80548416851790557f4048c797b19f33d1192c0663794e1d3c92c35d11ace404f6ab92b805fda0412980548416851790557f840a742c67969de5c576f823f56d617a2e0a9ce2cc2301aff2a772d7dc0a114580548416851790557f78ae430f0a20043f57eedb4f8cbf2a4e007d25151e47018e046bd593fbdd4ac580548416851790557fe0852039314b5b632a07b3a598ffdcf2df6c52cb9616471453cc6ffecb9650f080548416851790557ffbf103f3f8f2543b157f12c64e9c8a027cd3cfc372677121d8714ff6699d386480548416851790557f99ba2568b875bfe15c371ad87d7d16e8c77c21231de9d89fcc13f3a52677e7878054841685179055821683178216831790557f1e3ca1c77f99ef1771c947d7c738fb439357e650ef0d68712edaa1221419911a80548216831790557f377a18e1933b81df4d7480ad8a682387e372995583476178f90a06bd7cc0a82780548216831790557305fb3770ca63ecee9c5a6874254022820dbef9446000527f0d3feb1f76c87e659507ebae1d7493a0aa72ec5d86cc571ada1c8b4c9ae5ba04805490911682179055600c805461ff00191661010017905590565b60006116ce610393565b611715576040805162461bcd60e51b815260206004820152601360248201527232b93937b91d1036bab9ba1031329037bb32b960691b604482015290519081900360640190fd5b61171d611df2565b1561176f576040805162461bcd60e51b815260206004820152601960248201527f6572726f723a206d757374206e6f74206265206c6f636b656400000000000000604482015290519081900360640190fd5b600c805460ff19166001179055600061179c6064610546602d611790610cb0565b9063ffffffff611cd416565b905060006117c660646105466117b9600b8363ffffffff611cd416565b859063ffffffff611cd416565b90506000809054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561181757600080fd5b505af115801561182b573d6000803e3d6000fd5b505050506040513d602081101561184157600080fd5b5051611894576040805162461bcd60e51b815260206004820152601960248201527f6572726f723a206d75737420626520756e7061757361626c6500000000000000604482015290519081900360640190fd5b600080546001546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169263095ea7b392604480820193602093909283900390910190829087803b1580156118f057600080fd5b505af1158015611904573d6000803e3d6000fd5b505050506040513d602081101561191a57600080fd5b505161196d576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d75737420626520617070726f766564000000000000000000604482015290519081900360640190fd5b600154600080546001600160a01b039283169263f305d7199286929091169085908080611998611ab9565b6040518863ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001868152602001858152602001848152602001836001600160a01b03166001600160a01b0316815260200182815260200196505050505050506060604051808303818588803b158015611a1457600080fd5b505af1158015611a28573d6000803e3d6000fd5b50505050506040513d6060811015611a3f57600080fd5b5050604080518381526020810183905281517fcb75aa8347c098d414422e8cafbbe4e2c1a229f5b27bf425984b2b9792aa787a929181900390910190a160019250505090565b6000611a9082611dc9565b15611aa45750678ac7230489e80000610b9c565b50674563918244f40000610b9c565b60035490565b4290565b3390565b6000611acb611f9a565b611b1c576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d757374206265206c61756e63686564000000000000000000604482015290519081900360640190fd5b611b24611fb3565b611b6d576040805162461bcd60e51b81526020600482015260156024820152746572726f723a206d7573742062652061637469766560581b604482015290519081900360640190fd5b670de0b6b3a7640000821015611bb45760405162461bcd60e51b815260040180806020018281038252603881526020018061210c6038913960400191505060405180910390fd5b6843c33c193756480000611bc6610cb0565b10611c025760405162461bcd60e51b815260040180806020018281038252602a815260200180612144602a913960400191505060405180910390fd5b506001919050565b600068056bc75e2d63100000611c1e610cb0565b10156103da575060016103de565b6001600160a01b0383166000908152600660205260408120548290611c57908563ffffffff611d2d16565b11611c6457506001611c68565b5060005b9392505050565b6000611cb183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fde565b90505b92915050565b600081831115611ccc57506001611cb4565b506000611cb4565b600082611ce357506000611cb4565b82820282848281611cf057fe5b0414611cb15760405162461bcd60e51b815260040180806020018281038252602181526020018061216e6021913960400191505060405180910390fd5b600082820183811015611cb1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000611cb183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612075565b6001600160a01b03811660009081526007602052604081205460ff1615610b9857506001610b9c565b600c5460ff1690565b6008546000906001600160a01b03166108fc611e156103e1565b6001600160a01b0316319081150290604051600060405180830381858888f19350505050158015611e4a573d6000803e3d6000fd5b506001905090565b6000805481906001600160a01b03166370a08231611e6e6103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611eb457600080fd5b505afa158015611ec8573d6000803e3d6000fd5b505050506040513d6020811015611ede57600080fd5b50516000805460408051630852cd8d60e31b81526004810185905290519394506001600160a01b03909116926342966c6892602480840193602093929083900390910190829087803b158015611f3357600080fd5b505af1158015611f47573d6000803e3d6000fd5b505050506040513d6020811015611f5d57600080fd5b50506040805182815290517ff15a2816d9b33bd70f4b57d8cfbd7ee75d3231d8c52a030fef8a86fb4adfe9479181900360200190a1600191505090565b600080611fa5610cb6565b11156103da575060016103de565b6000611fbd611ab9565b611fc5611ab3565b11806103cd57506843c33c193756480000611c1e610cb0565b6000818484111561206d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561203257818101518382015260200161201a565b50505050905090810190601f16801561205f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836120c45760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561203257818101518382015260200161201a565b5060008385816120d057fe5b049594505050505056fe6572726f723a206d75737420636f6d706c79207769746820636f6e747269627574696f6e20726571756972656d656e74736572726f723a206d757374206265206d6f7265206f7220657175616c20746f20746865206d696e696d756d20636f6e747269627574696f6e6572726f723a206d757374206e6f7420686176652072656163686564206d6178696d756d2066756e6473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776572726f723a206d757374206e6f7420616c726561647920686176652077686974656c6973746564206c656761637920636f6e7472696275746f72736572726f723a20636f6e747269627574696f6e206d757374206e6f742065786365656420636f6e7472696275746f72206365696c696e67a26469706673582212203bc4bbfee0701fa3070aa9a0fb134093966977c460cb57d03f64acd19cb1f25464736f6c63430006070033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000ad45320077fc7a0f0a43976ac7dbacc65ad21d8f000000000000000000000000b827ff81627edfa3711c40286d304951f92ee414

Deployed Bytecode

0x6080604052600436106100955760003560e01c80638970d84c116100595780638970d84c1461030c57806393e59dc114610321578063bb2f719914610336578063d213f62e1461034b578063eb4c4f481461037e57610226565b806319f28d491461022b57806321eff7fc146102745780634bb278f3146102b95780634d9b3735146102e25780637b07dc36146102f757610226565b36610226576100a2610393565b156100f4576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d757374206e6f74206265206f766572000000000000000000604482015290519081900360640190fd5b6000546001600160a01b03166370a0823161010d6103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561015357600080fd5b505afa158015610167573d6000803e3d6000fd5b505050506040513d602081101561017d57600080fd5b505161018857600080fd5b600080546001600160a01b03166370a082316101a26103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156101e857600080fd5b505afa1580156101fc573d6000803e3d6000fd5b505050506040513d602081101561021257600080fd5b50511115610224576102226103e5565b505b005b600080fd5b34801561023757600080fd5b5061025e6004803603602081101561024e57600080fd5b50356001600160a01b0316610b80565b6040805160ff9092168252519081900360200190f35b34801561028057600080fd5b506102a76004803603602081101561029757600080fd5b50356001600160a01b0316610ba1565b60408051918252519081900360200190f35b3480156102c557600080fd5b506102ce610bbc565b604080519115158252519081900360200190f35b3480156102ee57600080fd5b506102a7610cb0565b34801561030357600080fd5b506102a7610cb6565b34801561031857600080fd5b506102a7610cbc565b34801561032d57600080fd5b506102ce610cc2565b34801561034257600080fd5b506102ce6116c4565b34801561035757600080fd5b506102a76004803603602081101561036e57600080fd5b50356001600160a01b0316611a85565b34801561038a57600080fd5b506102a7611ab3565b600061039d611ab9565b6103a5611ab3565b1115806103c257506843c33c1937564800006103bf610cb0565b10155b806103cd5750600954155b156103da575060016103de565b5060005b90565b3090565b6000806103f0611abd565b9050346103fc81611ac1565b6104375760405162461bcd60e51b81526004018080602001828103825260318152602001806120db6031913960400191505060405180910390fd5b600061044283611a85565b9050600061044f84610b80565b60ff169050600080600080610462611c0a565b156106f357610472888888611c2c565b6104ad5760405162461bcd60e51b81526004018080602001828103825260378152602001806121cb6037913960400191505060405180910390fd5b6104ce6104b8610cb0565b68056bc75e2d631000009063ffffffff611c6f16565b93506104da8785611cba565b156106df576104ef878563ffffffff611c6f16565b925061052961050960055485611cd490919063ffffffff16565b60045461051d90879063ffffffff611cd416565b9063ffffffff611d2d16565b91508415610567576105526064610546848863ffffffff611cd416565b9063ffffffff611d8716565b9050610564828263ffffffff611d2d16565b91505b600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156105c057600080fd5b505af11580156105d4573d6000803e3d6000fd5b505050506040513d60208110156105ea57600080fd5b505161063d576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610650908863ffffffff611d2d16565b600b556106608761051d8a610ba1565b6001600160a01b03891660009081526006602052604090205560095461068c908363ffffffff611c6f16565b6009556040805185815290516001600160a01b038a16917f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab919081900360200190a26001985050505050505050506103de565b60045461052990889063ffffffff611cd416565b60055461070790889063ffffffff611cd416565b915061072a610714610cb0565b6843c33c1937564800009063ffffffff611c6f16565b93506107368785611cba565b156109de5761074b878563ffffffff611c6f16565b925061075d878463ffffffff611c6f16565b935061077460055485611cd490919063ffffffff16565b9150841561082b576107916064610546848863ffffffff611cd416565b90506107a3828263ffffffff611d2d16565b91506107b182600954611cba565b1561082b5760006107cd60095484611c6f90919063ffffffff16565b6005549091506000906107fd906105466107f0606482878d63ffffffff611cd416565b859063ffffffff611c6f16565b905061080f858263ffffffff611d2d16565b9450610821868263ffffffff611c6f16565b9550600954935050505b610833611abd565b6001600160a01b03166108fc849081150290604051600060405180830381858888f1935050505015801561086b573d6000803e3d6000fd5b50600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156108c557600080fd5b505af11580156108d9573d6000803e3d6000fd5b505050506040513d60208110156108ef57600080fd5b5051610942576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610955908563ffffffff611d2d16565b600b5560095461096b908363ffffffff611c6f16565b60095561097b8461051d8a610ba1565b6001600160a01b038916600081815260066020908152604091829020939093558051878152905191927f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab92918290030190a26001985050505050505050506103de565b8415610a0e576109f96064610546848863ffffffff611cd416565b9050610a0b828263ffffffff611d2d16565b91505b600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015610a6757600080fd5b505af1158015610a7b573d6000803e3d6000fd5b505050506040513d6020811015610a9157600080fd5b5051610ae4576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610af7908863ffffffff611d2d16565b600b55600954610b0d908363ffffffff611c6f16565b600955610b1d8761051d8a610ba1565b6001600160a01b0389166000818152600660209081526040918290209390935580518a8152905191927f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab92918290030190a26001985050505050505050506103de565b6000610b8b82611dc9565b15610b9857506019610b9c565b5060005b919050565b6001600160a01b031660009081526006602052604090205490565b6000610bc6610393565b610c0d576040805162461bcd60e51b815260206004820152601360248201527232b93937b91d1036bab9ba1031329037bb32b960691b604482015290519081900360640190fd5b610c15611df2565b610c5e576040805162461bcd60e51b8152602060048201526015602482015274195c9c9bdc8e881b5d5cdd081899481b1bd8dad959605a1b604482015290519081900360640190fd5b610c66611dfb565b50610c6f611e52565b507f839cf22e1ba87ce2f5b9bbf46cf0175a09eed52febdfaac8852478e68203c763610c99611ab9565b60408051918252519081900360200190a150600190565b600b5490565b60025490565b60095481565b600c54600090610100900460ff1615610d0c5760405162461bcd60e51b815260040180806020018281038252603c81526020018061218f603c913960400191505060405180910390fd5b5060076020527f0c4f74400277bc9ebfde150d808b40c98b167dc7a3f8fa3fce766e39c031156f80547f63ede79f6715e0388dbc17ca5b2e6d337dbb73ceba352307c6c9feda7f393b36805460ff19928316600190811784168117909455821683178216831790557ffca776baf84360d837d4844dabdd99bce023edc2501147db1731d4e5e00e543680548216831790557fd10dcce221972ecb385cb9671a4181901ed8c2ed09f79be2128a29f67be904a380548216831790557fbe6948d6872952e5d72d4c052ba06253eb169aae18ffd799edae6f9ada106d1880548216831790557fc147f1a1f003cca9465956d0a5094092fddd699378a15a53772daaa01ae0755180548216831790557f16cd8f2b9b3bdd26a2550babbb9578d06de5f51f5adab51f7f729bca4ee94f0f80548216831790557f46b4bfadbd89931105aabc58ea09c8cc73cf4182fba899587cdf7896d4ba2af880548216831790557feb04b378943f4042794c767458a8a4c93b1fac667af7c6ece2fda78c27c6118380548216831790557feefa7f836f5e87643d555ad633fbd3d2dd838208401bcd82c53f6d01a654bc2280548216831790557ff465ec26741fd9702dd5f4c7e1731d5de6f0ec12bd1cf89b5ba76428820670ba80548216831790557f5a33bab911b45070d9caaf0d54880203cc899674845e74b618dfedde7649a13e80548216831790557fc01e1e63b2b5c5d4784c86cc890081a0693a6ee0796908fc37d0022d602d390a80548216831790557f9729261abbeae23652d9a4f3cbd8e57966e8a1ede368a7cded438c4a1d84e97680548216831790557fd3abf9eac845186d04f3aa9bb6dbd768228561491813404148fca70bd003c78080548216831790557f1c5064f3eca50236bd532ece94e5a5a8a205540b751bb1b3269e496f73e4a57f80548216831790557f492d26a99d2fd31724c9e583a21f86e73329c7c8a4b779b95737e1ad37aa03f780548216831790557f97d4bf73de36548759fd524ed8e1a2d8c97bfb6ce54eea3d7a537b44538151fc80548216831790557f9f0699132d9ec82357a19a389eb01adda5dc972e34a623eb78c567c20a9cfba980548216831790557f9b236971fc43f7665d850bebaefd3d35b179c93faada5881da0b5901b4cb085f80548216831790557fbacbbf2e44dd911fccfcd8fcdf0855db480956aba70fc8eb327ccb9e360a7f8a80548216831790557fb37d0aef72f87a2ae0f0c6215aaf6eb1a7c734dbf589f8f9413df48e10dc7f1580548216831790557fd42eda0c91c0efe1287f0918576a21ae5b358ddc6455f97b24591640ac30311380548216831790557ff92717cfe0b6330bb94f1fee6211300d7f3ba8f72a16244161c3b0ef03be850a80548216831790557fc047173addcc53fa2cda82a633c51f921df3c561575708547155d761ee53ffde80548216831790557fc406acef5e6698d60e57ae90d885e83b1c4c5016dd5634fa21af3f82cbb8107080548216831790557f06b4c2e9cafc107e255b8e0e5a2f1b0a1bc71d9c1230b8d6e4e22fb06a6cacbb80548216831790557fc5419f760fff43ec148ebe02ea68928f16b8e8f911d68dc9a8ae737a3ae505bb80548216831790557f7b00169774f0ac692c54318e6799cc99bffb16bf1b887532a8c98a1d752da84f80548216831790557fd2f12e2128f472486fafe5ba5915cd75f36e8ac4514fd7eff74f224cefacbb1d80548216831790557f9eca4d1cb6021c50f377bd9605dd4ceb962e56789ee1b817402a95dc2ef95fb580548216831790557f4e3190177450bf3c0569a5fa5ebdbe146b6589fbe9a43ff5c533ebb00dad4d0580548216831790557f0140275e51f9796e08ebdd85aeb7461aa5525b6c7f30b685ea9e29c9d480592780548216831790557f10c46ca3996014c31e2d96c736bdfa113f04311568a8cf7ab26e42fa6a007b5180548216831790557f58671f0070d2f40a29e57a7fd2cb478ef144f7173679c842a51195ed54d53fea80548216831790557f9a2571fd168fbc241cecf552bf2328e48fc50a361579b1cd52ac866af50bbf2f80548216831790557fec25f9b0308372e6b04688519b7c8f666a058429239421e9a0a3c439760a9d6a80548216831790557f38aa1216e40105b784dd2f594ea3d84611599d63435ee2706579e53b44043e5380548216831790557fd52704390f47368860344b6f5bff464a9c792a971ef9a5e15551205e2b66b01280548216831790557f6ccf6051e0c7d84e03c444737f0d89628d25e7ae4fdd7006c236d70e8989978880548216831790557f7f85b95f14c985bebc9ae606c9e75480bba9e2649f3d33edab779869b9cacf5c80548216831790557f3d4346477ec63e7754ad0fbd2fe4499c5a4037abaeffdbf9210dbe3a404af3e380548216831790557f4f091d3a005b08a3d99b6d866baceeac0f5374e6e5e232d5eecc135568f6913680548216831790557fc25c04b0cd1125543fd8de62e43dad78b318c1047e2d689e768e6d969df99fc880548216831790557f0b4924a25b1c8c484f801dc495a3f913cb9de8e779f9b2e3c300d2acdbbb329b80548216831790557f25846e14bb5d80c7de1d95505a5022edd7e7203cf691aaca206e872cbdb91cb280548216831790557f7e684b25ca3c77cf6d19ead8b0303e03ff1f06817c64066097743a7b9c5dcd0e80547f4838f250864fd5d6f84fb2ad95315d965e8c883143999979dde253641daa3f2180548416851790557fc303b1e48154cd75040bd36d392b589fa60c14804d1bc2790d4206287b6fa1b580548416851790557fe71cd27f42dd3326e4979d063c92a589abefebf775b315c4fc72e1e3e81bac3c80548416851790557f4048c797b19f33d1192c0663794e1d3c92c35d11ace404f6ab92b805fda0412980548416851790557f840a742c67969de5c576f823f56d617a2e0a9ce2cc2301aff2a772d7dc0a114580548416851790557f78ae430f0a20043f57eedb4f8cbf2a4e007d25151e47018e046bd593fbdd4ac580548416851790557fe0852039314b5b632a07b3a598ffdcf2df6c52cb9616471453cc6ffecb9650f080548416851790557ffbf103f3f8f2543b157f12c64e9c8a027cd3cfc372677121d8714ff6699d386480548416851790557f99ba2568b875bfe15c371ad87d7d16e8c77c21231de9d89fcc13f3a52677e7878054841685179055821683178216831790557f1e3ca1c77f99ef1771c947d7c738fb439357e650ef0d68712edaa1221419911a80548216831790557f377a18e1933b81df4d7480ad8a682387e372995583476178f90a06bd7cc0a82780548216831790557305fb3770ca63ecee9c5a6874254022820dbef9446000527f0d3feb1f76c87e659507ebae1d7493a0aa72ec5d86cc571ada1c8b4c9ae5ba04805490911682179055600c805461ff00191661010017905590565b60006116ce610393565b611715576040805162461bcd60e51b815260206004820152601360248201527232b93937b91d1036bab9ba1031329037bb32b960691b604482015290519081900360640190fd5b61171d611df2565b1561176f576040805162461bcd60e51b815260206004820152601960248201527f6572726f723a206d757374206e6f74206265206c6f636b656400000000000000604482015290519081900360640190fd5b600c805460ff19166001179055600061179c6064610546602d611790610cb0565b9063ffffffff611cd416565b905060006117c660646105466117b9600b8363ffffffff611cd416565b859063ffffffff611cd416565b90506000809054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561181757600080fd5b505af115801561182b573d6000803e3d6000fd5b505050506040513d602081101561184157600080fd5b5051611894576040805162461bcd60e51b815260206004820152601960248201527f6572726f723a206d75737420626520756e7061757361626c6500000000000000604482015290519081900360640190fd5b600080546001546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169263095ea7b392604480820193602093909283900390910190829087803b1580156118f057600080fd5b505af1158015611904573d6000803e3d6000fd5b505050506040513d602081101561191a57600080fd5b505161196d576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d75737420626520617070726f766564000000000000000000604482015290519081900360640190fd5b600154600080546001600160a01b039283169263f305d7199286929091169085908080611998611ab9565b6040518863ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001868152602001858152602001848152602001836001600160a01b03166001600160a01b0316815260200182815260200196505050505050506060604051808303818588803b158015611a1457600080fd5b505af1158015611a28573d6000803e3d6000fd5b50505050506040513d6060811015611a3f57600080fd5b5050604080518381526020810183905281517fcb75aa8347c098d414422e8cafbbe4e2c1a229f5b27bf425984b2b9792aa787a929181900390910190a160019250505090565b6000611a9082611dc9565b15611aa45750678ac7230489e80000610b9c565b50674563918244f40000610b9c565b60035490565b4290565b3390565b6000611acb611f9a565b611b1c576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d757374206265206c61756e63686564000000000000000000604482015290519081900360640190fd5b611b24611fb3565b611b6d576040805162461bcd60e51b81526020600482015260156024820152746572726f723a206d7573742062652061637469766560581b604482015290519081900360640190fd5b670de0b6b3a7640000821015611bb45760405162461bcd60e51b815260040180806020018281038252603881526020018061210c6038913960400191505060405180910390fd5b6843c33c193756480000611bc6610cb0565b10611c025760405162461bcd60e51b815260040180806020018281038252602a815260200180612144602a913960400191505060405180910390fd5b506001919050565b600068056bc75e2d63100000611c1e610cb0565b10156103da575060016103de565b6001600160a01b0383166000908152600660205260408120548290611c57908563ffffffff611d2d16565b11611c6457506001611c68565b5060005b9392505050565b6000611cb183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fde565b90505b92915050565b600081831115611ccc57506001611cb4565b506000611cb4565b600082611ce357506000611cb4565b82820282848281611cf057fe5b0414611cb15760405162461bcd60e51b815260040180806020018281038252602181526020018061216e6021913960400191505060405180910390fd5b600082820183811015611cb1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000611cb183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612075565b6001600160a01b03811660009081526007602052604081205460ff1615610b9857506001610b9c565b600c5460ff1690565b6008546000906001600160a01b03166108fc611e156103e1565b6001600160a01b0316319081150290604051600060405180830381858888f19350505050158015611e4a573d6000803e3d6000fd5b506001905090565b6000805481906001600160a01b03166370a08231611e6e6103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611eb457600080fd5b505afa158015611ec8573d6000803e3d6000fd5b505050506040513d6020811015611ede57600080fd5b50516000805460408051630852cd8d60e31b81526004810185905290519394506001600160a01b03909116926342966c6892602480840193602093929083900390910190829087803b158015611f3357600080fd5b505af1158015611f47573d6000803e3d6000fd5b505050506040513d6020811015611f5d57600080fd5b50506040805182815290517ff15a2816d9b33bd70f4b57d8cfbd7ee75d3231d8c52a030fef8a86fb4adfe9479181900360200190a1600191505090565b600080611fa5610cb6565b11156103da575060016103de565b6000611fbd611ab9565b611fc5611ab3565b11806103cd57506843c33c193756480000611c1e610cb0565b6000818484111561206d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561203257818101518382015260200161201a565b50505050905090810190601f16801561205f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836120c45760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561203257818101518382015260200161201a565b5060008385816120d057fe5b049594505050505056fe6572726f723a206d75737420636f6d706c79207769746820636f6e747269627574696f6e20726571756972656d656e74736572726f723a206d757374206265206d6f7265206f7220657175616c20746f20746865206d696e696d756d20636f6e747269627574696f6e6572726f723a206d757374206e6f7420686176652072656163686564206d6178696d756d2066756e6473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776572726f723a206d757374206e6f7420616c726561647920686176652077686974656c6973746564206c656761637920636f6e7472696275746f72736572726f723a20636f6e747269627574696f6e206d757374206e6f742065786365656420636f6e7472696275746f72206365696c696e67a26469706673582212203bc4bbfee0701fa3070aa9a0fb134093966977c460cb57d03f64acd19cb1f25464736f6c63430006070033

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

000000000000000000000000ad45320077fc7a0f0a43976ac7dbacc65ad21d8f000000000000000000000000b827ff81627edfa3711c40286d304951f92ee414

-----Decoded View---------------
Arg [0] : token (address): 0xAD45320077Fc7a0f0A43976Ac7DBaCC65aD21d8F
Arg [1] : wallet (address): 0xb827Ff81627EdfA3711C40286D304951F92Ee414

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ad45320077fc7a0f0a43976ac7dbacc65ad21d8f
Arg [1] : 000000000000000000000000b827ff81627edfa3711c40286d304951f92ee414


Deployed Bytecode Sourcemap

42253:17756:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44761:9;:7;:9::i;:::-;44760:10;44752:56;;;;;-1:-1:-1;;;44752:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44833:6;;-1:-1:-1;;;;;44833:6:0;:16;44850:14;:12;:14::i;:::-;44833:32;;;;;;;;;;;;;-1:-1:-1;;;;;44833:32:0;-1:-1:-1;;;;;44833:32:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44833:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44833:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44833:32:0;44829:51;;12:1:-1;9;2:12;44829:51:0;44930:1;44895:6;;-1:-1:-1;;;;;44895:6:0;:16;44912:14;:12;:14::i;:::-;44895:32;;;;;;;;;;;;;-1:-1:-1;;;;;44895:32:0;-1:-1:-1;;;;;44895:32:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44895:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44895:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44895:32:0;:36;44891:55;;;44933:13;:11;:13::i;:::-;;44891:55;42253:17756;;12:1:-1;9;2:12;51531:177:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51531:177:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51531:177:0;-1:-1:-1;;;;;51531:177:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;51396:129;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51396:129:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51396:129:0;-1:-1:-1;;;;;51396:129:0;;:::i;:::-;;;;;;;;;;;;;;;;50808:306;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50808:306:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;51302:82;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51302:82:0;;;:::i;51126:84::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51126:84:0;;;:::i;43585:22::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43585:22:0;;;:::i;45986:4810::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45986:4810:0;;;:::i;44966:1008::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44966:1008:0;;;:::i;51714:310::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51714:310:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51714:310:0;-1:-1:-1;;;;;51714:310:0;;:::i;51216:80::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51216:80:0;;;:::i;59541:178::-;59582:4;59616:7;:5;:7::i;:::-;59603:9;:7;:9::i;:::-;:20;;:52;;;;42652:10;59627;:8;:10::i;:::-;:28;;59603:52;:68;;;-1:-1:-1;59659:7:0;;:12;59603:68;59599:113;;;-1:-1:-1;59682:4:0;59675:11;;59599:113;-1:-1:-1;59704:5:0;59599:113;59541:178;:::o;59815:94::-;59896:4;59815:94;:::o;52356:5041::-;52396:4;52413:19;52435:12;:10;:12::i;:::-;52413:34;-1:-1:-1;52481:9:0;52519:32;52481:9;52519:18;:32::i;:::-;52511:103;;;;-1:-1:-1;;;52511:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52635:26;52664:35;52687:11;52664:22;:35::i;:::-;52635:64;;52710:24;52737:33;52758:11;52737:20;:33::i;:::-;52710:60;;;;52791:29;52831:26;52878:14;52903:13;52933:15;:13;:15::i;:::-;52929:4461;;;52987:63;53004:11;53017:12;53031:18;52987:16;:63::i;:::-;52979:145;;;;-1:-1:-1;;;52979:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53177:30;53196:10;:8;:10::i;:::-;42594:9;;53177:30;:18;:30;:::i;:::-;53153:54;;53236:49;53249:12;53263:21;53236:12;:49::i;:::-;53232:1732;;;53327:39;:12;53344:21;53327:39;:16;:39;:::i;:::-;53306:60;;53408:65;53445:27;53468:3;;53445:18;:22;;:27;;;;:::i;:::-;53435:3;;53409:30;;:21;;:30;:25;:30;:::i;:::-;53408:36;:65;:36;:65;:::i;:::-;53399:74;-1:-1:-1;53514:20:0;;53510:174;;53567:48;43186:3;53568:28;:6;53579:16;53568:28;:10;:28;:::i;:::-;53567:34;:48;:34;:48;:::i;:::-;53559:56;-1:-1:-1;53647:17:0;:6;53559:56;53647:17;:10;:17;:::i;:::-;53638:26;;53510:174;53728:6;;;:36;;;-1:-1:-1;;;53728:36:0;;-1:-1:-1;;;;;53728:36:0;;;;;;;;;;;;;;;:6;;;;;:15;;:36;;;;;;;;;;;;;;;;;;:6;:36;;;2:2:-1;;;;27:1;24;17:12;2:2;53728:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53728:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53728:36:0;53720:94;;;;;-1:-1:-1;;;53720:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53860:6;;:24;;53871:12;53860:24;:10;:24;:::i;:::-;53851:6;:33;53951:47;53985:12;53951:29;53968:11;53951:16;:29::i;:47::-;-1:-1:-1;;;;;53921:27:0;;;;;;:14;:27;;;;;:77;54027:7;;:19;;54039:6;54027:19;:11;:19;:::i;:::-;54017:7;:29;54088:47;;;;;;;;-1:-1:-1;;;;;54088:47:0;;;;;;;;;;;;;54161:4;54154:11;;;;;;;;;;;;53232:1732;54251:3;;54234:21;;:12;;:21;:16;:21;:::i;52929:4461::-;55050:3;;55033:21;;:12;;:21;:16;:21;:::i;:::-;55024:30;;55093;55112:10;:8;:10::i;:::-;42652;;55093:30;:18;:30;:::i;:::-;55069:54;;55156:49;55169:12;55183:21;55156:12;:49::i;:::-;55152:1660;;;55247:39;:12;55264:21;55247:39;:16;:39;:::i;:::-;55226:60;-1:-1:-1;55329:36:0;:12;55226:60;55329:36;:16;:36;:::i;:::-;55305:60;;55411:30;55437:3;;55411:21;:25;;:30;;;;:::i;:::-;55402:39;-1:-1:-1;55482:20:0;;55478:741;;55535:48;43186:3;55536:28;:6;55547:16;55536:28;:10;:28;:::i;55535:48::-;55527:56;-1:-1:-1;55615:17:0;:6;55527:56;55615:17;:10;:17;:::i;:::-;55606:26;;55681:29;55694:6;55702:7;;55681:12;:29::i;:::-;55677:523;;;55765:20;55788:19;55799:7;;55788:6;:10;;:19;;;;:::i;:::-;55933:3;;55765:42;;-1:-1:-1;55834:17:0;;55854:83;;55855:72;55872:54;43186:3;55855:72;55765:42;55890:16;55873:34;:16;:34;:::i;55872:54::-;55855:12;;:72;:16;:72;:::i;55854:83::-;55834:103;-1:-1:-1;56011:33:0;:18;55834:103;56011:33;:22;:33;:::i;:::-;55990:54;-1:-1:-1;56095:36:0;:21;56121:9;56095:36;:25;:36;:::i;:::-;56071:60;;56169:7;;56160:16;;55677:523;;;56255:12;:10;:12::i;:::-;-1:-1:-1;;;;;56255:21:0;:41;56277:18;56255:41;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;56341:6:0;;;:36;;;-1:-1:-1;;;56341:36:0;;-1:-1:-1;;;;;56341:36:0;;;;;;;;;;;;;;;:6;;;;;:15;;:36;;;;;;;;;;;;;;;;;;:6;:36;;;2:2:-1;;;;27:1;24;17:12;2:2;56341:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56341:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56341:36:0;56333:94;;;;;-1:-1:-1;;;56333:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56473:6;;:33;;56484:21;56473:33;:10;:33;:::i;:::-;56464:6;:42;56535:7;;:19;;56547:6;56535:19;:11;:19;:::i;:::-;56525:7;:29;56621:56;56655:21;56621:29;56638:11;56621:16;:29::i;:56::-;-1:-1:-1;;;;;56591:27:0;;;;;;:14;:27;;;;;;;;;:86;;;;56719:47;;;;;;;56591:27;;56719:47;;;;;;;;;56792:4;56785:11;;;;;;;;;;;;55152:1660;56840:20;;56836:150;;56885:48;43186:3;56886:28;:6;56897:16;56886:28;:10;:28;:::i;56885:48::-;56877:56;-1:-1:-1;56957:17:0;:6;56877:56;56957:17;:10;:17;:::i;:::-;56948:26;;56836:150;57018:6;;;:36;;;-1:-1:-1;;;57018:36:0;;-1:-1:-1;;;;;57018:36:0;;;;;;;;;;;;;;;:6;;;;;:15;;:36;;;;;;;;;;;;;;;;;;:6;:36;;;2:2:-1;;;;27:1;24;17:12;2:2;57018:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57018:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57018:36:0;57010:86;;;;;-1:-1:-1;;;57010:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57130:6;;:24;;57141:12;57130:24;:10;:24;:::i;:::-;57121:6;:33;57175:7;;:19;;57187:6;57175:19;:11;:19;:::i;:::-;57165:7;:29;57245:47;57279:12;57245:29;57262:11;57245:16;:29::i;:47::-;-1:-1:-1;;;;;57215:27:0;;;;;;:14;:27;;;;;;;;;:77;;;;57318:38;;;;;;;57215:27;;57318:38;;;;;;;;;57374:4;57367:11;;;;;;;;;;;;51531:177;51603:5;51625:27;51640:11;51625:14;:27::i;:::-;51621:80;;;-1:-1:-1;42719:2:0;51656:23;;51621:80;-1:-1:-1;51697:1:0;51621:80;51531:177;;;:::o;51396:129::-;-1:-1:-1;;;;;51490:27:0;51463:7;51490:27;;;:14;:27;;;;;;;51396:129::o;50808:306::-;50846:4;50871:9;:7;:9::i;:::-;50863:51;;;;;-1:-1:-1;;;50863:51:0;;;;;;;;;;;;-1:-1:-1;;;50863:51:0;;;;;;;;;;;;;;;50943:11;:9;:11::i;:::-;50935:55;;;;;-1:-1:-1;;;50935:55:0;;;;;;;;;;;;-1:-1:-1;;;50935:55:0;;;;;;;;;;;;;;;51011:8;:6;:8::i;:::-;;51030:10;:8;:10::i;:::-;;51066:18;51076:7;:5;:7::i;:::-;51066:18;;;;;;;;;;;;;;;-1:-1:-1;51102:4:0;50808:306;:::o;51302:82::-;51370:6;;51302:82;:::o;51126:84::-;51195:7;;51126:84;:::o;43585:22::-;;;;:::o;45986:4810::-;46051:7;;46025:4;;46051:7;;;;;46050:8;46042:91;;;;-1:-1:-1;;;46042:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46154:12:0;:56;;;:63;;46228:56;:63;;-1:-1:-1;;46154:63:0;;;46213:4;46154:63;;;46302;;;;;;;46228;;;;46376;;;;;;46450:56;:63;;;;;;;;46524:56;:63;;;;;;;;46598:56;:63;;;;;;;;46672:56;:63;;;;;;;;46746:56;:63;;;;;;;;46820:56;:63;;;;;;;;46894:56;:63;;;;;;;;46968:56;:63;;;;;;;;47042:56;:63;;;;;;;;47116:56;:63;;;;;;;;47190:56;:63;;;;;;;;47264:56;:63;;;;;;;;47338:56;:63;;;;;;;;47412:56;:63;;;;;;;;47486:56;:63;;;;;;;;47560:56;:63;;;;;;;;47634:56;:63;;;;;;;;47708:56;:63;;;;;;;;47782:56;:63;;;;;;;;47856:56;:63;;;;;;;;47930:56;:63;;;;;;;;48004:56;:63;;;;;;;;48078:56;:63;;;;;;;;48152:56;:63;;;;;;;;48226:56;:63;;;;;;;;48300:56;:63;;;;;;;;48374:56;:63;;;;;;;;48448:56;:63;;;;;;;;48522:56;:63;;;;;;;;48596:56;:63;;;;;;;;48670:56;:63;;;;;;;;48744:56;:63;;;;;;;;48818:56;:63;;;;;;;;48892:56;:63;;;;;;;;48966:56;:63;;;;;;;;49040:56;:63;;;;;;;;49114:56;:63;;;;;;;;49188:56;:63;;;;;;;;49262:56;:63;;;;;;;;49336:56;:63;;;;;;;;49410:56;:63;;;;;;;;49484:56;:63;;;;;;;;49558:56;:63;;;;;;;;49632:56;:63;;;;;;;;49706:56;:63;;49780:56;:63;;;;;;;;49854:56;:63;;;;;;;;49928:56;:63;;;;;;;;50002:56;:63;;;;;;;;50076:56;:63;;;;;;;;50150:56;:63;;;;;;;;50224:56;:63;;;;;;;;50298:56;:63;;;;;;;;50372:56;:63;;;;;;;;49706;;;;50446;;;;;;50520:56;:63;;;;;;;;50594:56;:63;;;;;;;;50681:42;46154:56;50668;;:63;;;;;;;;;50752:7;:14;;-1:-1:-1;;50752:14:0;46154:63;50752:14;;;45986:4810;:::o;44966:1008::-;45009:4;45034:9;:7;:9::i;:::-;45026:51;;;;;-1:-1:-1;;;45026:51:0;;;;;;;;;;;;-1:-1:-1;;;45026:51:0;;;;;;;;;;;;;;;45097:11;:9;:11::i;:::-;45096:12;45088:60;;;;;-1:-1:-1;;;45088:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45161:7;:14;;-1:-1:-1;;45161:14:0;45171:4;45161:14;;;:7;45226:52;43186:3;45227:32;42773:2;45227:10;:8;:10::i;:::-;:14;:32;:14;:32;:::i;45226:52::-;45196:82;-1:-1:-1;45289:27:0;45319:74;43236:3;45320:56;45345:29;42829:2;43236:3;45345:29;:17;:29;:::i;:::-;45320:19;;:56;:23;:56;:::i;45319:74::-;45289:104;;45422:6;;;;;;;;;-1:-1:-1;;;;;45422:6:0;-1:-1:-1;;;;;45422:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45422:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45422:16:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45422:16:0;45414:64;;;;;-1:-1:-1;;;45414:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45507:6;;;;45530:14;45507:60;;;-1:-1:-1;;;45507:60:0;;-1:-1:-1;;;;;45530:14:0;;;45507:60;;;;;;;;;;;;:6;;;;;:14;;:60;;;;;;;;;;;;;;;;;;:6;:60;;;2:2:-1;;;;27:1;24;17:12;2:2;45507:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45507:60:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45507:60:0;45499:106;;;;;-1:-1:-1;;;45499:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45626:14;;;45729:6;;-1:-1:-1;;;;;45626:14:0;;;;:30;;45675:19;;45729:6;;;;45751:19;;45626:14;;45843:7;:5;:7::i;:::-;45626:235;;;;;;;;;;;;;-1:-1:-1;;;;;45626:235:0;-1:-1:-1;;;;;45626:235:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45626:235:0;-1:-1:-1;;;;;45626:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45626:235:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45626:235:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;45626:235:0;45887:57;;;;;45626:235;45887:57;;;;;;;;;;;;;;;;;;45962:4;45955:11;;;;44966:1008;:::o;51714:310::-;51788:7;51812:27;51827:11;51812:14;:27::i;:::-;51808:209;;;-1:-1:-1;43074:8:0;51857:54;;51808:209;-1:-1:-1;42984:7:0;51946:58;;51216:80;51283:5;;51216:80;:::o;59915:89::-;59981:15;59915:89;:::o;12463:106::-;12551:10;12463:106;:::o;57757:458::-;57823:4;57848:13;:11;:13::i;:::-;57840:59;;;;;-1:-1:-1;;;57840:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57918:11;:9;:11::i;:::-;57910:55;;;;;-1:-1:-1;;;57910:55:0;;;;;;;;;;;;-1:-1:-1;;;57910:55:0;;;;;;;;;;;;;;;42885:7;57984:6;:27;;57976:106;;;;-1:-1:-1;;;57976:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42652:10;58101;:8;:10::i;:::-;:27;58093:92;;;;-1:-1:-1;;;58093:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58203:4:0;57757:458;;;:::o;58675:143::-;58722:4;42594:9;58743:10;:8;:10::i;:::-;:27;58739:72;;;-1:-1:-1;58781:4:0;58774:11;;59165:221;-1:-1:-1;;;;;59288:27:0;;59267:4;59288:27;;;:14;:27;;;;;;59331:7;;59288:39;;59320:6;59288:39;:31;:39;:::i;:::-;:50;59284:95;;-1:-1:-1;59349:4:0;59342:11;;59284:95;-1:-1:-1;59371:5:0;59284:95;59165:221;;;;;:::o;755:136::-;813:7;840:43;844:1;847;840:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;833:50;;755:136;;;;;:::o;58824:162::-;58901:4;58931:7;58922:6;:16;58918:61;;;-1:-1:-1;58949:4:0;58942:11;;58918:61;-1:-1:-1;58971:5:0;58964:12;;1645:471;1703:7;1948:6;1944:47;;-1:-1:-1;1978:1:0;1971:8;;1944:47;2015:5;;;2019:1;2015;:5;:1;2039:5;;;;;:10;2031:56;;;;-1:-1:-1;;;2031:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;291:181;349:7;381:5;;;405:6;;;;397:46;;;;;-1:-1:-1;;;397:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2592:132;2650:7;2677:39;2681:1;2684;2677:39;;;;;;;;;;;;;;;;;:3;:39::i;58998:161::-;-1:-1:-1;;;;;59086:25:0;;59065:4;59086:25;;;:12;:25;;;;;;;;59082:70;;;-1:-1:-1;59122:4:0;59115:11;;59725:82;59792:7;;;;59725:82;:::o;57409:122::-;57461:7;;57444:4;;-1:-1:-1;;;;;57461:7:0;:40;57478:14;:12;:14::i;:::-;-1:-1:-1;;;;;57478:22:0;;57461:40;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57461:40:0;57519:4;57512:11;;57409:122;:::o;57537:208::-;57574:4;57608:6;;57574:4;;-1:-1:-1;;;;;57608:6:0;:16;57625:14;:12;:14::i;:::-;57608:32;;;;;;;;;;;;;-1:-1:-1;;;;;57608:32:0;-1:-1:-1;;;;;57608:32:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57608:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57608:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57608:32:0;57653:6;;;:19;;;-1:-1:-1;;;57653:19:0;;;;;;;;;;57608:32;;-1:-1:-1;;;;;;57653:6:0;;;;:11;;:19;;;;;57608:32;;57653:19;;;;;;;;;;;:6;:19;;;2:2:-1;;;;27:1;24;17:12;2:2;57653:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57653:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;57698:17:0;;;;;;;;;;;;;57653:19;57698:17;;;57733:4;57726:11;;;57537:208;:::o;58223:130::-;58268:4;58303:1;58289:11;:9;:11::i;:::-;:15;58285:60;;;-1:-1:-1;58315:4:0;58308:11;;58507:162;58550:4;58583:7;:5;:7::i;:::-;58571:9;:7;:9::i;:::-;:19;:50;;;;42652:10;58594;:8;:10::i;1194:192::-;1280:7;1316:12;1308:6;;;;1300:29;;;;-1:-1:-1;;;1300:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1300:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1352:5:0;;;1194:192::o;3220:278::-;3306:7;3341:12;3334:5;3326:28;;;;-1:-1:-1;;;3326:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3326:28:0;;3365:9;3381:1;3377;:5;;;;;;;3220:278;-1:-1:-1;;;;;3220:278:0:o

Swarm Source

ipfs://3bc4bbfee0701fa3070aa9a0fb134093966977c460cb57d03f64acd19cb1f254

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.