Token MINO

Overview CRC20

Price
$0.03 @ 0.306188 CRO
Fully Diluted Market Cap
Total Supply:
7,327,611.75164 MINO

Holders:
1,976 addresses
Filtered by Token Holder (Minotaur.Money: Staking Contact)

Balance
1,780,434.810740918 MINO

Value
$44,920.19 ( ~545,147.9369 CRO) [24.2976%]
0x844e265f24868f7e18d4f90d50b500c6c36bdba7
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

A Decentralized Reserve Currency and VC on Cronos Network.


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

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 Etherscan.io 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 Security Audit

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
Loading