Contract 0x3a1138075bd97a33f23a87824b811146fa44288e 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x70a286c2efed25b0fc00ed1db986616371fb5be9574e35e43c8ebdbf9404c0eeApprove114317182023-12-03 10:51:142 days 11 hrs agoCronos ID Name t3882.cro IN  Minotaur Money: MINO Token0 CRO0.2148088935880
0x768523e9cdc5cccd312dbeae3b66322a0c7a82118f24818350b90f96fdbd2dd7Approve113002472023-11-24 21:59:3710 days 23 hrs ago0x177772af6669aca61c23d325ab4213e8ba56c79d IN  Minotaur Money: MINO Token0 CRO0.115399722347 4,743.299040121
0x309c26e31bb76a707179b2841c317f1191f5c3623b8b5bad2fa9544041612d97Approve112663812023-11-22 17:13:4213 days 4 hrs ago0x5aa9d1ea35dc2a014072b21c1d4530d172d1cc4e IN  Minotaur Money: MINO Token0 CRO0.2330650
0xe0fbf458bbedf8c6554b5f97bd4a80a93204b5ea70b179e7717883da49c345d7Approve111929812023-11-17 22:51:3417 days 23 hrs ago0x5cfe97ff80c935afe7df1d31eae52cbe034b2840 IN  Minotaur Money: MINO Token0 CRO0.2153038196670
0x0feac81e18401d9765f65e5fb3457b597e32c40ac96f095c40b159c0d7b3868dApprove111092022023-11-12 12:03:2023 days 9 hrs ago0x6017727e81cd3f8553acdbd4c9076308d579caa5 IN  Minotaur Money: MINO Token0 CRO0.1124641917680
0xd4b18a3733ee98a1276cc859f95cd69ce652d5b0f4af066fd2efab79c5c66131Approve111072062023-11-12 8:56:1123 days 12 hrs ago0x853fefb14185c73de6d570c4de7f4aa99c60d953 IN  Minotaur Money: MINO Token0 CRO0.1124662900610
0x0900541385925778f52f2078ffa293ce50f5bf2e585970db56c0d0fa0a79949fApprove111021032023-11-12 0:57:4023 days 20 hrs agoCronos ID Name cronosfuture.cro IN  Minotaur Money: MINO Token0 CRO0.3262910
0xc43239147b78003f445d59703662dcee2c85e473c1350bbacd65af557cbca82fApprove110015102023-11-05 11:55:3130 days 9 hrs ago0x7b42c7b6ff2ab456e4ba16b0f47885a04c755a4f IN  Minotaur Money: MINO Token0 CRO0.112615621933 4,628.863575724
0xdf78e2762466edb70af8a285ab1e11d4d12ca1d4348b58672b1a6358c28bb140Approve110015092023-11-05 11:55:2630 days 9 hrs ago0x7b42c7b6ff2ab456e4ba16b0f47885a04c755a4f IN  Minotaur Money: MINO Token0 CRO0.112615623044 4,628.863621398
0x47eac41cf211046345fbb59f23f63f6b6047d82b8faa211e9eb7022053fe7841Approve110015082023-11-05 11:55:2030 days 9 hrs ago0x7b42c7b6ff2ab456e4ba16b0f47885a04c755a4f IN  Minotaur Money: MINO Token0 CRO0.112615624118 4,628.863665532
0x31a1459df38106f7a7822d0202342349121753c13263190abfb671db74d3f683Approve110015082023-11-05 11:55:2030 days 9 hrs ago0x7b42c7b6ff2ab456e4ba16b0f47885a04c755a4f IN  Minotaur Money: MINO Token0 CRO0.112615624118 4,628.863665532
0x4c09be09edfddeb49d942c33eac49c868e8fd07b07b2ecfdf78f3efd95b8c5dcApprove109918702023-11-04 20:54:4231 days 58 mins ago0xe48ba23dd2cdd5a6f0956a1211a451da38368c46 IN  Minotaur Money: MINO Token0 CRO0.215785344778 4,629.295363483
0xa8e3beae4d749b5a30781f17c33b8d6e023da3c30ac2d304eec240774b985383Approve109886832023-11-04 15:57:0031 days 5 hrs ago0xdaf75cfbc37eb1c292572094e75d8be2be418886 IN  Minotaur Money: MINO Token0 CRO0.21439045559 4,630.363395834
0x1c5a27b30d9d2802d7a005c9d3f6239cd073a86cb8981c7b62a50d528179d755Approve108820212023-10-28 17:18:0538 days 4 hrs ago0xbc6414070a030a453addc8cd8358c5504e1ba6ba IN  Minotaur Money: MINO Token0 CRO0.216014954615 4,634.221239039
0x3085ab6ff4d997725ac6939b3cb1e38c1b3605b50f28a9d56849d206f37d78d7Approve108562262023-10-27 0:53:0939 days 20 hrs ago0x88357aecfda7e54ac9fbe976761a51fb13238e51 IN  Minotaur Money: MINO Token0 CRO0.216069172202 4,635.384382085
0x5072f0928a2ad533adf983671451666b80cfc91f5e985c647399f6c83e0e33f4Permit107692742023-10-21 8:26:0745 days 13 hrs ago0xccfb8fad678dedfa19ad21fd5fc37fe8885d1f28 IN  Minotaur Money: MINO Token0 CRO0.263177014606 4,639.278920581
0xb82d92726e17856cd801e7074dda47eda1203867ccae2880bc9b008a9b8b32c3Approve106521462023-10-13 17:04:1453 days 4 hrs ago0xda576d71b0efe67c999319bc73ff4ba5652e3dce IN  Minotaur Money: MINO Token0 CRO0.214992799492 4,644.576454283
0x5d7dc78f92423396ef71fdd6645e3a34b1587eb16c0559d491e2d0172c1c1bbaApprove105463562023-10-06 18:57:4060 days 2 hrs agoCronos ID Name bigcheese.cro IN  Minotaur Money: MINO Token0 CRO0.2166503714120
0x78d875f7f0c0d28e2efeccd46cdaab40e6f67dbb47187df961d4db1fd9bbff47Approve103427142023-09-23 12:04:1873 days 9 hrs ago0xb0d9c37a2f46d45d6154daf64ee1523556a96abc IN  Minotaur Money: MINO Token0 CRO0.11434630
0x019940737ae8d7b7ecf7a636a86cbd70837942825bdc5ac25c8bca5887370bd0Approve103132192023-09-21 13:53:3675 days 7 hrs agoCronos ID Name bighomiee4cro.cro IN  Minotaur Money: MINO Token0 CRO0.1226521203160
0x1e18bf5d32a13d3512b21fa8e7b34bcb6ad7e278641ec566ac4cddb9ff0d5bdaApprove103132182023-09-21 13:53:3075 days 7 hrs agoCronos ID Name bighomiee4cro.cro IN  Minotaur Money: MINO Token0 CRO0.1133352362470
0xcfea22f318282df7353189f08453305eeae89d50ae1d8fd9e5abc021b4f804b9Approve103003382023-09-20 17:44:2376 days 4 hrs ago0x6b764e4be18ba8d30c24d69e4637eb64ccbebc06 IN  Minotaur Money: MINO Token0 CRO0.2330650
0x1fbb67b1a539fc93019d882a386d7da0ced6eba9409b1c377b1f2fd7af3664e9Approve100066192023-09-01 14:03:0695 days 7 hrs ago0x98b5b0a993251340fb613f044e8964f220a7c2f9 IN  Minotaur Money: MINO Token0 CRO0.231445 5,000
0x446e80c997a2efb729c21806a9a74cd1bc7d7398e1521653f0efb0baeb2dbc39Approve99745812023-08-30 11:51:5397 days 10 hrs ago0xd70800b3c904291d258e659afcc9a4a8c2660633 IN  Minotaur Money: MINO Token0 CRO0.113770828018 4,676.346254186
0x0f60ad5e0675b1626889f5c56e4b2567e4a8beeab4c351c37e0a97e193541ac9Approve99720352023-08-30 7:53:0097 days 13 hrs agoCronos ID Name trustedtrader.cro IN  Minotaur Money: MINO Token0 CRO0.1137128472170
[ Download CSV Export 

OVERVIEW

A Decentralized Reserve Currency and VC on Cronos Network.

Parent Txn Hash Block From To Value
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MINOERC20Token

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-01-07
*/

// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

library EnumerableSet {

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

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

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

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

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

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

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

      bytes32 lastvalue = set._values[lastIndex];

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

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

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

      return true;
    } else {
      return false;
    }
  }

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

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

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

  function _getValues( Set storage set_ ) private view returns ( bytes32[] storage ) {
    return set_._values;
  }

  // TODO needs insert function that maintains order.
  // TODO needs NatSpec documentation comment.
  /**
   * Inserts new value by moving existing value at provided index to end 
   * of array and setting provided value at provided index
   */
  function _insert(Set storage set_, uint256 index_, bytes32 valueToInsert_ ) private returns ( bool ) {
    require(  set_._values.length > index_ );
    require( !_contains( set_, valueToInsert_ ), "Remove value you wish to insert if you wish to reorder array." );
    bytes32 existingValue_ = _at( set_, index_ );
    set_._values[index_] = valueToInsert_;
    return _add( set_, existingValue_);
  } 

  struct Bytes4Set {
    Set _inner;
  }

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

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

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

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

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

  function getValues( Bytes4Set storage set_ ) internal view returns ( bytes4[] memory ) {
    bytes4[] memory bytes4Array_;
    for( uint256 iteration_ = 0; _length( set_._inner ) > iteration_; iteration_++ ) {
      bytes4Array_[iteration_] = bytes4( _at( set_._inner, iteration_ ) );
    }
    return bytes4Array_;
  }

  function insert( Bytes4Set storage set_, uint256 index_, bytes4 valueToInsert_ ) internal returns ( bool ) {
    return _insert( set_._inner, index_, valueToInsert_ );
  }

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

  function getValues( Bytes32Set storage set_ ) internal view returns ( bytes4[] memory ) {
    bytes4[] memory bytes4Array_;

      for( uint256 iteration_ = 0; _length( set_._inner ) >= iteration_; iteration_++ ){
        bytes4Array_[iteration_] = bytes4( at( set_, iteration_ ) );
      }

      return bytes4Array_;
  }

  function insert( Bytes32Set storage set_, uint256 index_, bytes32 valueToInsert_ ) internal returns ( bool ) {
    return _insert( set_._inner, index_, valueToInsert_ );
  }

  // AddressSet
  struct AddressSet {
    Set _inner;
  }

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

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

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

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

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

  /**
   * TODO Might require explicit conversion of bytes32[] to address[].
   *  Might require iteration.
   */
  function getValues( AddressSet storage set_ ) internal view returns ( address[] memory ) {

    address[] memory addressArray;

    for( uint256 iteration_ = 0; _length(set_._inner) >= iteration_; iteration_++ ){
      addressArray[iteration_] = at( set_, iteration_ );
    }

    return addressArray;
  }

  function insert(AddressSet storage set_, uint256 index_, address valueToInsert_ ) internal returns ( bool ) {
    return _insert( set_._inner, index_, bytes32(uint256(valueToInsert_)) );
  }


    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

    struct UInt256Set {
        Set _inner;
    }

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

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

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

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

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

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);
}

library SafeMath {

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

        return c;
    }

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

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

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {

        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

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

        return c;
    }

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

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

    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

    function percentageAmount( uint256 total_, uint8 percentage_ ) internal pure returns ( uint256 percentAmount_ ) {
        return div( mul( total_, percentage_ ), 1000 );
    }

    function substractPercentage( uint256 total_, uint8 percentageToSub_ ) internal pure returns ( uint256 result_ ) {
        return sub( total_, div( mul( total_, percentageToSub_ ), 1000 ) );
    }

    function percentageOfTotal( uint256 part_, uint256 total_ ) internal pure returns ( uint256 percent_ ) {
        return div( mul(part_, 100) , total_ );
    }

    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }

    function quadraticPricing( uint256 payment_, uint256 multiplier_ ) internal pure returns (uint256) {
        return sqrrt( mul( multiplier_, payment_ ) );
    }

  function bondingCurve( uint256 supply_, uint256 multiplier_ ) internal pure returns (uint256) {
      return mul( multiplier_, supply_ );
  }
}

abstract contract ERC20 is IERC20 {

  using SafeMath for uint256;

  // TODO comment actual hash value.
  bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );
    
  // Present in ERC777
  mapping (address => uint256) internal _balances;

  // Present in ERC777
  mapping (address => mapping (address => uint256)) internal _allowances;

  // Present in ERC777
  uint256 internal _totalSupply;

  // Present in ERC777
  string internal _name;
    
  // Present in ERC777
  string internal _symbol;
    
  // Present in ERC777
  uint8 internal _decimals;

  constructor (string memory name_, string memory symbol_, uint8 decimals_) {
    _name = name_;
    _symbol = symbol_;
    _decimals = decimals_;
  }

  function name() public view returns (string memory) {
    return _name;
  }

  function symbol() public view returns (string memory) {
    return _symbol;
  }

  function decimals() public view returns (uint8) {
    return _decimals;
  }

  function totalSupply() public view override returns (uint256) {
    return _totalSupply;
  }

  function balanceOf(address account) public view virtual override returns (uint256) {
    return _balances[account];
  }

  function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
    _transfer(msg.sender, recipient, amount);
    return true;
  }

    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(msg.sender, spender, amount);
        return true;
    }

    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;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    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;
    }

    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");

      _beforeTokenTransfer(sender, recipient, amount);

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

    function _mint(address account_, uint256 amount_) internal virtual {
        require(account_ != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address( this ), account_, amount_);
        _totalSupply = _totalSupply.add(amount_);
        _balances[account_] = _balances[account_].add(amount_);
        emit Transfer(address( this ), account_, amount_);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _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 _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}

library Counters {
    using SafeMath for uint256;

    struct Counter {
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

interface IERC2612Permit {

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

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

abstract contract ERC20Permit is ERC20, IERC2612Permit {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    bytes32 public DOMAIN_SEPARATOR;

    constructor() {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name())),
                keccak256(bytes("1")), // Version
                chainID,
                address(this)
            )
        );
    }

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "Permit: expired deadline");

        bytes32 hashStruct =
            keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline));

        bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct));

        address signer = ecrecover(_hash, v, r, s);
        require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature");

        _nonces[owner].increment();
        _approve(owner, spender, amount);
    }

    function nonces(address owner) public view override returns (uint256) {
        return _nonces[owner].current();
    }
}

interface IOwnable {
  function owner() external view returns (address);

  function renounceOwnership() external;
  
  function transferOwnership( address newOwner_ ) external;
}

contract Ownable is IOwnable {
    
  address internal _owner;

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

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

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

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

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

  function transferOwnership( address newOwner_ ) public virtual override onlyOwner() {
    require( newOwner_ != address(0), "Ownable: new owner is the zero address");
    emit OwnershipTransferred( _owner, newOwner_ );
    _owner = newOwner_;
  }
}

contract VaultOwned is Ownable {
    
  address internal _vault;

  function setVault( address vault_ ) external onlyOwner() returns ( bool ) {
    _vault = vault_;

    return true;
  }

  function vault() public view returns (address) {
    return _vault;
  }

  modifier onlyVault() {
    require( _vault == msg.sender, "VaultOwned: caller is not the Vault" );
    _;
  }

}

contract MINOERC20Token is ERC20Permit, VaultOwned {

    using SafeMath for uint256;

    mapping(address => bool) public taxFromMap;
    mapping(address => bool) public taxToMap;

    // Max transfer tax rate: 25.00%.
    uint256 public constant MAXIMUM_TRANSFER_TAX_RATE = 2500;

    // Transfer tax rate in basis points. (default 6.66%)
    uint256 public transferTaxRate = 666;

    // Staking address for rewards, defaults to burning tokens, but will be set to
    // the read staking address momentarily after this contracts deploy step.
    address public stakingAddress = 0x000000000000000000000000000000000000dEaD;
  
    address public immutable addLiquidityHelper;

    event TransferFeeChanged( uint256 txnFee );
    event UpdateFeeMaps( address indexed _contract, bool fromTaxed, bool toTaxed );
    event SetStakingAddress( address stakingAddress );
    event OperatorTransferred( address indexed previousOperator, address indexed newOperator );
  
    // The operator can only update the transfer tax rate
    address public operator;

    modifier onlyOperator() {
        require(operator == msg.sender, "!operator");
        _;
    }

    constructor( address _addLiquidityHelper ) ERC20("MINO", "MINO", 9) {
      require( _addLiquidityHelper != address(0), "addLiquidityHelper address can't be address(0)" );
      addLiquidityHelper = _addLiquidityHelper;

      operator = msg.sender;
    }

    function mint(address account_, uint256 amount_) external onlyVault() {
        _mint(account_, amount_);
    }

    function burn(uint256 amount) public virtual {
        _burn(msg.sender, amount);
    }
     
    function burnFrom(address account_, uint256 amount_) public virtual {
        _burnFrom(account_, amount_);
    }

    function _burnFrom(address account_, uint256 amount_) public virtual {
        uint256 decreasedAllowance_ =
            allowance(account_, msg.sender).sub(
                amount_,
                "ERC20: burn amount exceeds allowance"
            );

        _approve(account_, msg.sender, decreasedAllowance_);
        _burn(account_, amount_);
    }

    /// @dev overrides transfer function to meet tokenomics of DARKSIDE
    function _transfer( address sender, address recipient, uint256 amount ) internal virtual override {
        bool toFromAddLiquidityHelper = (sender == addLiquidityHelper || recipient == addLiquidityHelper);

        if ( !( taxFromMap[ sender ] || taxToMap[ recipient ] ) ||
            recipient == stakingAddress ||
            toFromAddLiquidityHelper ||
            transferTaxRate == 0
            ) {
            super._transfer( sender, recipient, amount );
        } else {
            // default tax is 6.66% of every taxed transfer
            uint256 taxAmount = ( amount.mul( transferTaxRate ) ) / 10000;

            // default 93.34% of transfer sent to recipient
            uint256 sendAmount = amount.sub( taxAmount );

            assert( amount == sendAmount.add( taxAmount ) );

            super._transfer( sender, stakingAddress, taxAmount );
            super._transfer( sender, recipient, sendAmount );
            amount = sendAmount;
        }
    }

    /**
     * @dev Update the transfer tax rate.
     * Can only be called by the current operator.
     */
    function updateTransferTaxRate( uint256 _transferTaxRate ) external onlyOperator {
        require( _transferTaxRate  <= MAXIMUM_TRANSFER_TAX_RATE,
            "!valid" );
        transferTaxRate = _transferTaxRate;

        emit TransferFeeChanged( transferTaxRate );
    }

    /**
     * @dev Update the excludeFromMap
     * Can only be called by the current operator.
     */
    function updateFeeMaps( address _contract, bool fromTaxed, bool toTaxed ) external onlyOperator {
        taxFromMap[_contract] = fromTaxed;
        taxToMap[_contract] = toTaxed;

        emit UpdateFeeMaps( _contract, fromTaxed, toTaxed );
    }

    /**
     * @dev Update the mino staking address.
     * Can only be called by the current operator.
     */
    function updateMinoStakingAddress( address _stakingAddress ) external onlyOperator {
        require( _stakingAddress != address(0) && _stakingAddress != 0x000000000000000000000000000000000000dEaD, "!!0");
        require( stakingAddress == 0x000000000000000000000000000000000000dEaD, "!unset");

        stakingAddress = _stakingAddress;

        emit SetStakingAddress( stakingAddress );
    }

    /**
     * @dev Transfers operator of the contract to a new account (`newOperator`).
     * Can only be called by the current operator.
     */
    function transferOperator( address newOperator ) external onlyOperator {
        require( newOperator != address(0), "!!0" );

        emit OperatorTransferred( operator, newOperator );

        operator = newOperator;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_addLiquidityHelper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"stakingAddress","type":"address"}],"name":"SetStakingAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"txnFee","type":"uint256"}],"name":"TransferFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":false,"internalType":"bool","name":"fromTaxed","type":"bool"},{"indexed":false,"internalType":"bool","name":"toTaxed","type":"bool"}],"name":"UpdateFeeMaps","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TRANSFER_TAX_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"_burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addLiquidityHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_","type":"address"}],"name":"setVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxFromMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxToMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTaxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"fromTaxed","type":"bool"},{"internalType":"bool","name":"toTaxed","type":"bool"}],"name":"updateFeeMaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingAddress","type":"address"}],"name":"updateMinoStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferTaxRate","type":"uint256"}],"name":"updateTransferTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405261029a600c5561dead600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005a57600080fd5b506040516200387538038062003875833981810160405260208110156200008057600080fd5b81019080805190602001909291905050506040518060400160405280600481526020017f4d494e4f000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d494e4f00000000000000000000000000000000000000000000000000000000815250600982600390805190602001906200011792919062000495565b5081600490805190602001906200013092919062000495565b5080600560006101000a81548160ff021916908360ff16021790555050505060004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f62000185620003ef60201b60201c565b805190602001206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001208330604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050604051602081830303815290604052805190602001206007819055505033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018062003847602e913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200054b565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156200048b5780601f106200045f576101008083540402835291602001916200048b565b820191906000526020600020905b8154815290600101906020018083116200046d57829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620004cd576000855562000519565b82601f10620004e857805160ff191683800117855562000519565b8280016001018555821562000519579182015b8281111562000518578251825591602001919060010190620004fb565b5b5090506200052891906200052c565b5090565b5b80821115620005475760008160009055506001016200052d565b5090565b60805160601c6132d4620005736000398061154c52806125bd528061261252506132d46000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80635bf43a9711610125578063a22b35ce116100ad578063d505accf1161007c578063d505accf14610a75578063d7b4be2414610b0e578063dd62ed3e14610b42578063f2fde38b14610bba578063fbfa77cf14610bfe57610211565b8063a22b35ce14610941578063a457c2d71461098f578063a9059cbb146109f3578063b65d08b014610a5757610211565b806379cc6790116100f457806379cc6790146107a05780637ecebe00146107ee5780638da5cb5b1461084657806392b9cb021461087a57806395d89b41146108be57610211565b80635bf43a97146106b05780636817031b146106e457806370a082311461073e578063715018a61461079657610211565b806329605e77116101a85780633950935111610177578063395093511461056e57806340c10f19146105d257806342966c6814610620578063570ca7351461064e57806358615c1b1461068257610211565b806329605e77146104cd57806330adf81f14610511578063313ce5671461052f5780633644e5151461055057610211565b8063177611ec116101e4578063177611ec146103b357806318160ddd1461040d5780631ad9339a1461042b57806323b872dd1461044957610211565b806306a95a801461021657806306fdde0314610270578063095ea7b3146102f35780630c86911d14610357575b600080fd5b6102586004803603602081101561022c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c32565b60405180821515815260200191505060405180910390f35b610278610c52565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102b857808201518184015260208101905061029d565b50505050905090810190601f1680156102e55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61033f6004803603604081101561030957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610cf4565b60405180821515815260200191505060405180910390f35b6103b16004803603606081101561036d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803515159060200190929190505050610d0b565b005b6103f5600480360360208110156103c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610edb565b60405180821515815260200191505060405180910390f35b610415610efb565b6040518082815260200191505060405180910390f35b610433610f05565b6040518082815260200191505060405180910390f35b6104b56004803603606081101561045f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f0b565b60405180821515815260200191505060405180910390f35b61050f600480360360208110156104e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fd6565b005b6105196111fc565b6040518082815260200191505060405180910390f35b610537611223565b604051808260ff16815260200191505060405180910390f35b61055861123a565b6040518082815260200191505060405180910390f35b6105ba6004803603604081101561058457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611240565b60405180821515815260200191505060405180910390f35b61061e600480360360408110156105e857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112e5565b005b61064c6004803603602081101561063657600080fd5b8101908080359060200190929190505050611399565b005b6106566113a6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106ae6004803603602081101561069857600080fd5b81019080803590602001909291905050506113cc565b005b6106b861154a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610726600480360360208110156106fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061156e565b60405180821515815260200191505060405180910390f35b6107806004803603602081101561075457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061167d565b6040518082815260200191505060405180910390f35b61079e6116c5565b005b6107ec600480360360408110156107b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611849565b005b6108306004803603602081101561080457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611857565b6040518082815260200191505060405180910390f35b61084e6118a7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108bc6004803603602081101561089057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118d1565b005b6108c6611be9565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109065780820151818401526020810190506108eb565b50505050905090810190601f1680156109335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61098d6004803603604081101561095757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c8b565b005b6109db600480360360408110156109a557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cdf565b60405180821515815260200191505060405180910390f35b610a3f60048036036040811015610a0957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d9e565b60405180821515815260200191505060405180910390f35b610a5f611db5565b6040518082815260200191505060405180910390f35b610b0c600480360360e0811015610a8b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611dbb565b005b610b166120e2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ba460048036036040811015610b5857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612108565b6040518082815260200191505060405180910390f35b610bfc60048036036020811015610bd057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061218f565b005b610c06612398565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600b6020528060005260406000206000915054906101000a900460ff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610cea5780601f10610cbf57610100808354040283529160200191610cea565b820191906000526020600020905b815481529060010190602001808311610ccd57829003601f168201915b5050505050905090565b6000610d013384846123c2565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f216f70657261746f72000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167faa0229b7a89a7cbbb65fa3bb420871ace27f9b9cdb4847f6f8a14c54f1a6d7e7838360405180831515815260200182151581526020019250505060405180910390a2505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6000600254905090565b6109c481565b6000610f188484846125b9565b610fcb8433610fc6856040518060600160405280602881526020016131a160289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128209092919063ffffffff16565b6123c2565b600190509392505050565b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611099576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f216f70657261746f72000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561113c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260038152602001807f212130000000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed60405160405180910390a380600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b6000600560009054906101000a900460ff16905090565b60075481565b60006112db33846112d685600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128e090919063ffffffff16565b6123c2565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806131c96023913960400191505060405180910390fd5b6113958282612968565b5050565b6113a33382612b2d565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461148f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f216f70657261746f72000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6109c4811115611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f2176616c6964000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600c819055507f0496ed1e61eb69727f9659a8e859288db4758ffb1f744d1c1424634f90a257f4600c546040518082815260200191505060405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b60003373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611633576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611788576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6118538282611c8b565b5050565b60006118a0600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612cf1565b9050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f216f70657261746f72000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156119ff575061dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611a71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260038152602001807f212130000000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f21756e736574000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fd6912e103d1553f15e77ffc98e99da32c9ce0d21d8be27cbb38437b1afe30928600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c815780601f10611c5657610100808354040283529160200191611c81565b820191906000526020600020905b815481529060010190602001808311611c6457829003601f168201915b5050505050905090565b6000611cc3826040518060600160405280602481526020016131ec60249139611cb48633612108565b6128209092919063ffffffff16565b9050611cd08333836123c2565b611cda8383612b2d565b505050565b6000611d943384611d8f8560405180606001604052806025815260200161327a60259139600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128209092919063ffffffff16565b6123c2565b6001905092915050565b6000611dab3384846125b9565b6001905092915050565b600c5481565b83421115611e31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f5065726d69743a206578706972656420646561646c696e65000000000000000081525060200191505060405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b888888611ea1600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612cf1565b89604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281526020019650505050505050604051602081830303815290604052805190602001209050600061190160075483604051602001808461ffff1660f01b81526002018381526020018281526020019350505050604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611fbb573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561202f57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061315f6021913960400191505060405180910390fd5b6120cb600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612cff565b6120d68a8a8a6123c2565b50505050505050505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612252576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806130f16026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612448576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806132566024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806131176022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061266057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b9050600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806127035750600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b158061275c5750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806127645750805b8061277157506000600c54145b1561278657612781848484612d15565b61281a565b60006127106127a0600c5485612fd690919063ffffffff16565b816127a757fe5b04905060006127bf828561305c90919063ffffffff16565b90506127d482826128e090919063ffffffff16565b84146127dc57fe5b61280986600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612d15565b612814868683612d15565b80935050505b50505050565b60008383111582906128cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612892578082015181840152602081019050612877565b50505050905090810190601f1680156128bf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008082840190508381101561295e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b612a163083836130a6565b612a2b816002546128e090919063ffffffff16565b600281905550612a82816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128e090919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bb3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806132106021913960400191505060405180910390fd5b612bbf826000836130a6565b612c2a816040518060600160405280602281526020016130cf602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128209092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612c818160025461305c90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806132316025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806130ac6023913960400191505060405180910390fd5b612e2c8383836130a6565b612e9781604051806060016040528060268152602001613139602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128209092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612f2a816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128e090919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600080831415612fe95760009050613056565b6000828402905082848281612ffa57fe5b0414613051576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806131806021913960400191505060405180910390fd5b809150505b92915050565b600061309e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612820565b905092915050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655a65726f537761705065726d69743a20496e76616c6964207369676e6174757265536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655661756c744f776e65643a2063616c6c6572206973206e6f7420746865205661756c7445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203aa2ffc9539b780084b68c5f9df4093065f8d43487a7101e43201a560002c91b64736f6c634300070500336164644c697175696469747948656c70657220616464726573732063616e277420626520616464726573732830290000000000000000000000007a5a4ac0088e71b2585eedced53011d627e43953

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

0000000000000000000000007a5a4ac0088e71b2585eedced53011d627e43953

-----Decoded View---------------
Arg [0] : _addLiquidityHelper (address): 0x7a5a4ac0088e71b2585eedced53011d627e43953

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a5a4ac0088e71b2585eedced53011d627e43953


Deployed ByteCode Sourcemap

28064:4934:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28208:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20358:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21168:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31827:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28159:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20611:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28296:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21343:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32765:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25050:108;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20528:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25167:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21680:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29522:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29643:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29115:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31430:280;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28713:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27736:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20711:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27250:151;;;:::i;:::-;;29745:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26464:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27047:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32203:402;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20441:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29868:363;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21902:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20838:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28420:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25686:770;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28628:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21009:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27407:250;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27864:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28208:40;;;;;;;;;;;;;;;;;;;;;;:::o;20358:77::-;20395:13;20424:5;20417:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20358:77;:::o;21168:167::-;21251:4;21268:37;21277:10;21289:7;21298:6;21268:8;:37::i;:::-;21323:4;21316:11;;21168:167;;;;:::o;31827:252::-;29202:10;29190:22;;:8;;;;;;;;;;;:22;;;29182:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31958:9:::1;31934:10;:21;31945:9;31934:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;32000:7;31978:8;:19;31987:9;31978:19;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32040:9;32025:46;;;32051:9;32062:7;32025:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;31827:252:::0;;;:::o;28159:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;20611:94::-;20664:7;20687:12;;20680:19;;20611:94;:::o;28296:56::-;28348:4;28296:56;:::o;21343:329::-;21449:4;21466:36;21476:6;21484:9;21495:6;21466:9;:36::i;:::-;21513:129;21522:6;21530:10;21542:99;21590:6;21542:99;;;;;;;;;;;;;;;;;:11;:19;21554:6;21542:19;;;;;;;;;;;;;;;:31;21562:10;21542:31;;;;;;;;;;;;;;;;:47;;:99;;;;;:::i;:::-;21513:8;:129::i;:::-;21660:4;21653:11;;21343:329;;;;;:::o;32765:230::-;29202:10;29190:22;;:8;;;;;;;;;;;:22;;;29182:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32879:1:::1;32856:25;;:11;:25;;;;32847:43;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;32939:11;32908:44;;32929:8;;;;;;;;;;;32908:44;;;;;;;;;;;;32976:11;32965:8;;:22;;;;;;;;;;;;;;;;;;32765:230:::0;:::o;25050:108::-;25092:66;25050:108;;;:::o;20528:77::-;20569:5;20590:9;;;;;;;;;;;20583:16;;20528:77;:::o;25167:31::-;;;;:::o;21680:214::-;21768:4;21785:79;21794:10;21806:7;21815:48;21852:10;21815:11;:23;21827:10;21815:23;;;;;;;;;;;;;;;:32;21839:7;21815:32;;;;;;;;;;;;;;;;:36;;:48;;;;:::i;:::-;21785:8;:79::i;:::-;21882:4;21875:11;;21680:214;;;;:::o;29522:113::-;27990:10;27980:20;;:6;;;;;;;;;;;:20;;;27971:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29603:24:::1;29609:8;29619:7;29603:5;:24::i;:::-;29522:113:::0;;:::o;29643:89::-;29699:25;29705:10;29717:6;29699:5;:25::i;:::-;29643:89;:::o;29115:23::-;;;;;;;;;;;;;:::o;31430:280::-;29202:10;29190:22;;:8;;;;;;;;;;;:22;;;29182:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28348:4:::1;31531:16;:46;;31522:80;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31631:16;31613:15;:34;;;;31665:37;31685:15;;31665:37;;;;;;;;;;;;;;;;;;31430:280:::0;:::o;28713:43::-;;;:::o;27736:122::-;27803:4;27182:10;27172:20;;:6;;;;;;;;;;;:20;;;27163:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27826:6:::1;27817;;:15;;;;;;;;;;;;;;;;;;27848:4;27841:11;;27736:122:::0;;;:::o;20711:121::-;20785:7;20808:9;:18;20818:7;20808:18;;;;;;;;;;;;;;;;20801:25;;20711:121;;;:::o;27250:151::-;27182:10;27172:20;;:6;;;;;;;;;;;:20;;;27163:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27365:1:::1;27327:42;;27349:6;;;;;;;;;;;27327:42;;;;;;;;;;;;27393:1;27376:6;;:19;;;;;;;;;;;;;;;;;;27250:151::o:0;29745:115::-;29824:28;29834:8;29844:7;29824:9;:28::i;:::-;29745:115;;:::o;26464:120::-;26525:7;26552:24;:7;:14;26560:5;26552:14;;;;;;;;;;;;;;;:22;:24::i;:::-;26545:31;;26464:120;;;:::o;27047:82::-;27094:7;27117:6;;;;;;;;;;;27110:13;;27047:82;:::o;32203:402::-;29202:10;29190:22;;:8;;;;;;;;;;;:22;;;29182:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32333:1:::1;32306:29;;:15;:29;;;;:94;;;;;32358:42;32339:61;;:15;:61;;;;32306:94;32297:111;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;32446:42;32428:60;;:14;;;;;;;;;;;:60;;;32419:80;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;32529:15;32512:14;;:32;;;;;;;;;;;;;;;;;;32562:35;32581:14;;;;;;;;;;;32562:35;;;;;;;;;;;;;;;;;;;;32203:402:::0;:::o;20441:81::-;20480:13;20509:7;20502:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20441:81;:::o;29868:363::-;29948:27;29991:133;30045:7;29991:133;;;;;;;;;;;;;;;;;:31;30001:8;30011:10;29991:9;:31::i;:::-;:35;;:133;;;;;:::i;:::-;29948:176;;30137:51;30146:8;30156:10;30168:19;30137:8;:51::i;:::-;30199:24;30205:8;30215:7;30199:5;:24::i;:::-;29868:363;;;:::o;21902:277::-;21995:4;22012:137;22021:10;22033:7;22042:106;22091:15;22042:106;;;;;;;;;;;;;;;;;:11;:23;22054:10;22042:23;;;;;;;;;;;;;;;:32;22066:7;22042:32;;;;;;;;;;;;;;;;:48;;:106;;;;;:::i;:::-;22012:8;:137::i;:::-;22167:4;22160:11;;21902:277;;;;:::o;20838:163::-;20924:4;20937:40;20947:10;20959:9;20970:6;20937:9;:40::i;:::-;20991:4;20984:11;;20838:163;;;;:::o;28420:36::-;;;;:::o;25686:770::-;25931:8;25912:15;:27;;25904:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25981:18;25092:66;26036:15;;26053:5;26060:7;26069:6;26077:24;:7;:14;26085:5;26077:14;;;;;;;;;;;;;;;:22;:24::i;:::-;26103:8;26025:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26015:98;;;;;;25981:132;;26126:13;26176:6;26185:16;;26203:10;26152:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26142:73;;;;;;26126:89;;26228:14;26245:25;26255:5;26262:1;26265;26268;26245:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26228:42;;26307:1;26289:20;;:6;:20;;;;:39;;;;;26323:5;26313:15;;:6;:15;;;26289:39;26281:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26379:26;:7;:14;26387:5;26379:14;;;;;;;;;;;;;;;:24;:26::i;:::-;26416:32;26425:5;26432:7;26441:6;26416:8;:32::i;:::-;25686:770;;;;;;;;;;:::o;28628:74::-;;;;;;;;;;;;;:::o;21009:151::-;21098:7;21125:11;:18;21137:5;21125:18;;;;;;;;;;;;;;;:27;21144:7;21125:27;;;;;;;;;;;;;;;;21118:34;;21009:151;;;;:::o;27407:250::-;27182:10;27172:20;;:6;;;;;;;;;;;:20;;;27163:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27528:1:::1;27507:23;;:9;:23;;;;27498:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27615:9;27585:41;;27607:6;;;;;;;;;;;27585:41;;;;;;;;;;;;27642:9;27633:6;;:18;;;;;;;;;;;;;;;;;;27407:250:::0;:::o;27864:73::-;27902:7;27925:6;;;;;;;;;;;27918:13;;27864:73;:::o;23551:346::-;23670:1;23653:19;;:5;:19;;;;23645:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23751:1;23732:21;;:7;:21;;;;23724:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23835:6;23805:11;:18;23817:5;23805:18;;;;;;;;;;;;;;;:27;23824:7;23805:27;;;;;;;;;;;;;;;:36;;;;23873:7;23857:32;;23866:5;23857:32;;;23882:6;23857:32;;;;;;;;;;;;;;;;;;23551:346;;;:::o;30312:997::-;30421:29;30464:18;30454:28;;:6;:28;;;:63;;;;30499:18;30486:31;;:9;:31;;;30454:63;30421:97;;30539:10;:20;30551:6;30539:20;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;30563:8;:21;30573:9;30563:21;;;;;;;;;;;;;;;;;;;;;;;;;30539:45;30536:50;:94;;;;30616:14;;;;;;;;;;;30603:27;;:9;:27;;;30536:94;:135;;;;30647:24;30536:135;:172;;;;30707:1;30688:15;;:20;30536:172;30531:771;;;30739:44;30756:6;30764:9;30775:6;30739:15;:44::i;:::-;30531:771;;;30877:17;30933:5;30899:29;30911:15;;30899:6;:10;;:29;;;;:::i;:::-;30897:41;;;;;;30877:61;;31016:18;31037:23;31049:9;31037:6;:10;;:23;;;;:::i;:::-;31016:44;;31095:27;31111:9;31095:10;:14;;:27;;;;:::i;:::-;31085:6;:37;31077:47;;;;31141:52;31158:6;31166:14;;;;;;;;;;;31182:9;31141:15;:52::i;:::-;31208:48;31225:6;31233:9;31244:10;31208:15;:48::i;:::-;31280:10;31271:19;;30531:771;;;30312:997;;;;:::o;16968:192::-;17054:7;17087:1;17082;:6;;17090:12;17074:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17114:9;17130:1;17126;:5;17114:17;;17151:1;17144:8;;;16968:192;;;;;:::o;16635:181::-;16693:7;16713:9;16729:1;16725;:5;16713:17;;16754:1;16749;:6;;16741:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16807:1;16800:8;;;16635:181;;;;:::o;22722:395::-;22828:1;22808:22;;:8;:22;;;;22800:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22877:56;22907:4;22915:8;22925:7;22877:20;:56::i;:::-;22959:25;22976:7;22959:12;;:16;;:25;;;;:::i;:::-;22944:12;:40;;;;23017:32;23041:7;23017:9;:19;23027:8;23017:19;;;;;;;;;;;;;;;;:23;;:32;;;;:::i;:::-;22995:9;:19;23005:8;22995:19;;;;;;;;;;;;;;;:54;;;;23091:8;23065:44;;23083:4;23065:44;;;23101:7;23065:44;;;;;;;;;;;;;;;;;;22722:395;;:::o;23125:418::-;23228:1;23209:21;;:7;:21;;;;23201:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23281:49;23302:7;23319:1;23323:6;23281:20;:49::i;:::-;23364:68;23387:6;23364:68;;;;;;;;;;;;;;;;;:9;:18;23374:7;23364:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;23343:9;:18;23353:7;23343:18;;;;;;;;;;;;;;;:89;;;;23458:24;23475:6;23458:12;;:16;;:24;;;;:::i;:::-;23443:12;:39;;;;23524:1;23498:37;;23507:7;23498:37;;;23528:6;23498:37;;;;;;;;;;;;;;;;;;23125:418;;:::o;24136:114::-;24201:7;24228;:14;;;24221:21;;24136:114;;;:::o;24258:91::-;24340:1;24322:7;:14;;;:19;;;;;;;;;;;24258:91;:::o;22187:527::-;22309:1;22291:20;;:6;:20;;;;22283:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22391:1;22370:23;;:9;:23;;;;22362:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22444:47;22465:6;22473:9;22484:6;22444:20;:47::i;:::-;22522:71;22544:6;22522:71;;;;;;;;;;;;;;;;;:9;:17;22532:6;22522:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;22502:9;:17;22512:6;22502:17;;;;;;;;;;;;;;;:91;;;;22625:32;22650:6;22625:9;:20;22635:9;22625:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;22602:9;:20;22612:9;22602:20;;;;;;;;;;;;;;;:55;;;;22688:9;22671:35;;22680:6;22671:35;;;22699:6;22671:35;;;;;;;;;;;;;;;;;;22187:527;;;:::o;17168:252::-;17226:7;17257:1;17252;:6;17248:47;;;17282:1;17275:8;;;;17248:47;17307:9;17323:1;17319;:5;17307:17;;17352:1;17347;17343;:5;;;;;;:10;17335:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17411:1;17404:8;;;17168:252;;;;;:::o;16824:136::-;16882:7;16909:43;16913:1;16916;16909:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;16902:50;;16824:136;;;;:::o;23903:97::-;;;;:::o

Swarm Source

ipfs://3aa2ffc9539b780084b68c5f9df4093065f8d43487a7101e43201a560002c91b
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.