ETH Price: $2,490.95 (-2.50%)

Token

Torro DAO Token (TORRO)
 

Overview

Max Total Supply

99,613.276150231255780717 TORRO

Holders

151

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
45.7905354154534618 TORRO

Value
$0.00
0x2bB83c17807f14ED351b3D0f30D2069B44067c9b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Torro DAO is a decentralized on-chain investment pool governed by Torro DAO Token (TORRO), which allows the community to invest in other ERC-20 tokens via Uniswap, join Uniswap liquidity pools, or take part in new cryptocurrencies’ presales.

IEO Information

IEO Address : 0x37efB1C62F8ACb31c24B3A3d940eb9007D457DD9
IEO Start Date : Nov 23, 2020
IEO End Date : Nov 23, 2020
IEO Price : 0.005882352941176471 ETH
Public Sale Allocation : 60000 TORRO
Soft Cap : 111 ETH
Hard Cap : 352 ETH
Raised : 352 ETH

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Torro

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity Multiple files format)

File 8 of 8: Torro.sol
// "SPDX-License-Identifier: UNLICENSED"
pragma solidity 0.6.6;

import "./Ownable.sol";
import "./EnumerableSet.sol";

import "./SafeMath.sol";

import "./ITorro.sol";
import "./ITorroFactory.sol";

/// @title ERC-20 Torro governing token.
/// @notice Contract for ERC-20 governing token.
/// @author ORayskiy - @robitnik_TorroDao
contract Torro is ITorro, OwnableUpgradeSafe {
  using SafeMath for uint256;
  using EnumerableSet for EnumerableSet.AddressSet;

  // Structs.

  /// @notice structure to hold holder's information.
  struct Holder {
    uint256 balance;
    uint256 staked;
    mapping(address => uint256) allowances;
    mapping(uint256 => uint256) stakeLock;
    uint256 locked;
  }

  // Private data.

  uint8 constant private _decimals = 18;

  string private _name;
  string private _symbol;
  uint256 private _totalSupply;
  address private _dao;
  address private _factory;
  bool private _isMain;

  mapping(address => Holder) private _holders;
  EnumerableSet.AddressSet private _holderAddresses;

  // Events.

  /// @notice Event for dispatching when token transfer occurs.
  /// @param from address of tokens' sender.
  /// @param to address of tokens' reciever.
  /// @param amount amount of tokens sent.
	event Transfer(address indexed from, address indexed to, uint256 amount);

  /// @notice Event for dispatching when tokens allowance has been approved.
  /// @param owner address of tokens' owner.
  /// @param spender address of tokens; spender.
  /// @param value amount of tokens approved for use.
  event Approval(address indexed owner, address indexed spender, uint256 value);

  /// @notice Event for dispatching when tokens have been staked.
  /// @param owner address of tokens' owner that have been staked.
  /// @param amount amount of tokens that have been staked.
	event Stake(address indexed owner, uint256 amount);

  /// @notice Event for dispatching when tokens have been unstaked.
  /// @param owner address of tokens' owner that have been unstaked.
  /// @param amount amount of tokens that have been unstaked.
	event Unstake(address indexed owner, uint256 amount);
  
  /// @notice Event for dispatching when benefits have been added.
  event AddBenefits();

  // Constructor.

  constructor() public {
    __Ownable_init();

    _name = "Torro DAO Token";
    _symbol = "TORRO";
    _totalSupply = 1e23;
    _dao = address(0x0);
    _factory = address(0x0);
    _isMain = true;

    _holders[msg.sender].balance = _totalSupply;
    _holderAddresses.add(msg.sender);

	  emit Transfer(address(0x0), msg.sender, _totalSupply);
  }

  /// @notice Initializes governing token.
  /// @param dao_ address of cloned DAO.
  /// @param factory_ address of factory.
  /// @param supply_ total supply of tokens.
  function initializeCustom(address dao_, address factory_, uint256 supply_) public override initializer {
    __Ownable_init();

    _name = "Torro DAO Pool Token";
    _symbol = "TORRO_POOL";
    _totalSupply = supply_;
    _dao = dao_;
    _factory = factory_;
    _isMain = false;

    _holders[dao_].balance = _totalSupply;
    _holderAddresses.add(dao_);

    emit Transfer(address(0x0), dao_, _totalSupply);
  }

  // Public calls.

  /// @notice Token's name.
  /// @return string name of the token.
  function name() public override view returns (string memory) {
    return _name;
  }

  /// @notice Token's symbol.
  /// @return string symbol of the token.
  function symbol() public override view returns (string memory) {
    return _symbol;
  }

  /// @notice Token's decimals.
  /// @return uint8 demials of the token.
  function decimals() public override pure returns (uint8) {
    return _decimals;
  }

  /// @notice Token's total supply.
  /// @return uint256 total supply of the token.
	function totalSupply() public override view returns (uint256) {
		return _totalSupply;
	}

  /// @notice Count of token holders.
  /// @return uint256 number of token holders.
  function holdersCount() public override view returns (uint256) {
    return _holderAddresses.length();
  }

  /// @notice All token holders.
  /// @return array of addresses of token holders.
  function holders() public override view returns (address[] memory) {
    uint256 length = _holderAddresses.length();
    address[] memory holderAddresses = new address[](length);
    for (uint256 i = 0; i < length; i++) {
      holderAddresses[i] = _holderAddresses.at(i);
    }
    return holderAddresses;
  }

  /// @notice Available balance for address.
  /// @param sender_ address to get available balance for.
  /// @return uint256 amount of tokens available for given address.
  function balanceOf(address sender_) public override view returns (uint256) {
    return _holders[sender_].balance;
  }

  /// @notice Staked balance for address.
  /// @param sender_ address to get staked balance for.
  /// @return uint256 amount of staked tokens for given address.
  function stakedOf(address sender_) public override view returns (uint256) {
    return _holders[sender_].staked;
  }

  /// @notice Total balance for address = available + staked.
  /// @param sender_ address to get total balance for.
  /// @return uint256 total amount of tokens for given address.
  function totalOf(address sender_) public override view returns (uint256) {
    return _holders[sender_].balance.add(_holders[sender_].staked);
  }

  /// @notice Locked staked balance for address
  /// @param sender_ address to get locked staked balance for.
  /// @return uint256 amount of locked staked tokens for given address.
  function lockedOf(address sender_) public override view returns (uint256) {
    return _holders[sender_].locked;
  }

  /// @notice Spending allowance.
  /// @param owner_ token owner address.
  /// @param spender_ token spender address.
  /// @return uint256 amount of owner's tokens that spender can use.
  function allowance(address owner_, address spender_) public override view returns (uint256) {
    return _holders[owner_].allowances[spender_];
  }

  /// @notice Unstaked supply of token.
  /// @return uint256 amount of tokens in circulation that are not staked.
  function unstakedSupply() public override view returns (uint256) {
    uint256 supply = 0;
    for (uint256 i = 0; i < _holderAddresses.length(); i++) {
      supply = supply.add(_holders[_holderAddresses.at(i)].balance);
    }
    return supply;
  }

  /// @notice Staked supply of token.
  /// @return uint256 amount of tokens in circulation that are staked.
  function stakedSupply() public override view returns (uint256) {
    uint256 supply = 0;
    for (uint256 i = 0; i < _holderAddresses.length(); i++) {
      supply = supply.add(_holders[_holderAddresses.at(i)].staked);
    }
    return supply;
  }

  // Public transactions.

  /// @notice Transfer tokens to recipient.
  /// @param recipient_ address of tokens' recipient.
  /// @param amount_ amount of tokens to transfer.
  /// @return bool true if successful.
  function transfer(address recipient_, uint256 amount_) public override returns (bool) {
    _transfer(msg.sender, recipient_, amount_);
    return true;
  }

  /// @notice Approve spender to spend an allowance.
  /// @param spender_ address that will be allowed to spend specified amount of tokens.
  /// @param amount_ amount of tokens that spender can spend.
  /// @return bool true if successful.
  function approve(address spender_, uint256 amount_) public override returns (bool) {
    _approve(msg.sender, spender_, amount_);
    return true;
  }

  /// @notice Approves DAO to spend tokens.
  /// @param owner_ address whose tokens DAO can spend.
  /// @param amount_ amount of tokens that DAO can spend.
  /// @return bool true if successful.
  function approveDao(address owner_, uint256 amount_) public override returns (bool) {
    require(msg.sender == _dao);
    _approve(owner_, _dao, amount_);
    return true;
  }

  /// @notice Locks account's staked tokens.
  /// @param owner_ address whose tokens should be locked.
  /// @param amount_ amount of tokens to lock.
  /// @param id_ lock id.
  function lockStakesDao(address owner_, uint256 amount_, uint256 id_) public override {
    require(msg.sender == _dao);
    Holder storage holder = _holders[owner_];
    require(holder.staked >= amount_);
    holder.stakeLock[id_] = amount_;
    holder.locked = holder.locked.add(amount_);
  }

  /// @notice Unlocks account's staked tokens.
  /// @param owner_ address whose tokens should be unlocked.
  /// @param id_ unlock id.
  function unlockStakesDao(address owner_, uint256 id_) public override {
    require(msg.sender == _dao);
    Holder storage holder = _holders[owner_];
    uint256 amount = holder.stakeLock[id_];
    if (amount > 0) {
      holder.locked = holder.locked.sub(amount);
    }
    delete holder.stakeLock[id_];
  }

  /// @notice Transfers tokens from owner to recipient by approved spender.
  /// @param owner_ address of tokens' owner whose tokens will be spent.
  /// @param recipient_ address of recipient that will recieve tokens.
  /// @param amount_ amount of tokens to be spent.
  /// @return bool true if successful.
  function transferFrom(address owner_, address recipient_, uint256 amount_) public override returns (bool) {
    require(_holders[owner_].allowances[msg.sender] >= amount_);
    _transfer(owner_, recipient_, amount_);
    _approve(owner_, msg.sender, _holders[owner_].allowances[msg.sender].sub(amount_));
    return true;
  }

  /// @notice Increases allowance for given spender.
  /// @param spender_ spender to increase allowance for.
  /// @param addedValue_ extra amount that spender can spend.
  /// @return bool true if successful.
  function increaseAllowance(address spender_, uint256 addedValue_) public override returns (bool) {
    _approve(msg.sender, spender_, _holders[msg.sender].allowances[spender_].add(addedValue_));
    return true;
  }

  /// @notice Decreases allowance for given spender.
  /// @param spender_ spender to decrease allowance for.
  /// @param subtractedValue_ removed amount that spender can spend.
  /// @return bool true if successful.
  function decreaseAllowance(address spender_, uint256 subtractedValue_) public override returns (bool) {
    _approve(msg.sender, spender_, _holders[msg.sender].allowances[spender_].sub(subtractedValue_));
    return true;
  }

  /// @notice Stake tokens.
  /// @param amount_ amount of tokens to be staked.
  /// @return bool true if successful.
	function stake(uint256 amount_) public override returns (bool) {
    require(amount_ >= 1e18);
    require(balanceOf(msg.sender) >= amount_);
    Holder storage holder = _holders[msg.sender];
    holder.balance = holder.balance.sub(amount_);
    holder.staked = holder.staked.add(amount_);
		emit Transfer(msg.sender, address(this), amount_);
		emit Stake(msg.sender, amount_);
    return true;
	}

  /// @notice Unstake tokens.
  /// @param amount_ amount of tokens to be unstaked.
  /// @return bool true if successful.
  function unstake(uint256 amount_) public override returns (bool) {
    require(stakedOf(msg.sender) >= amount_);
    Holder storage holder = _holders[msg.sender];
    require(holder.staked.sub(holder.locked) >= amount_);

    uint256 amount;
    if (_isMain) {
      uint256 burn = amount_ / 200;
      uint256 tempTotalSupply = _totalSupply.sub(burn);
      if (tempTotalSupply < 1e22) {
        burn = _totalSupply.sub(tempTotalSupply);
      }
      if (burn > 0) {
        amount = amount_.sub(burn);
        _totalSupply = _totalSupply.sub(burn);
        emit Transfer(msg.sender, address(0x0), burn);
      }
    } else {
      amount = amount_;
    }
    holder.staked = holder.staked.sub(amount_);
    holder.balance = holder.balance.add(amount);
    emit Transfer(address(this), msg.sender, amount);
    emit Unstake(msg.sender, amount_);
    return true;
  }

  /// @notice Functionality for DAO to add benefits for all stakers.
  /// @param amount_ amount of wei to be shared among stakers.
  function addBenefits(uint256 amount_) public override {
    require(msg.sender == _dao || ITorroFactory(_factory).isDao(msg.sender));
    for (uint256 i = 0; i < _holderAddresses.length(); i++) {
      address holder = _holderAddresses.at(i);
      uint256 staked = stakedOf(holder);
      if (staked > 0) {
        uint256 amount = staked.mul(amount_) / stakedSupply();
        if (amount > 0) {
          ITorroFactory(_factory).addBenefits(holder, amount);
        }
      }
    }

    // Emit event that benefits have been added for token.
    emit AddBenefits();
  }
  
  /// @notice Functionality to burn tokens.
  /// @param amount_ amount of tokens to burn.
  function burn(uint256 amount_) public override {
    Holder storage burner = _holders[msg.sender];
    require(burner.balance >= amount_);
    burner.balance = burner.balance.sub(amount_);
    _totalSupply = _totalSupply.sub(amount_);

    emit Transfer(msg.sender, address(0x0), amount_);
  }

  // Private transactions.

  /// @notice Main functionality for token trnasfer.
  /// @param sender_ address that sends tokens.
  /// @param recipient_ address that will recieve tokens.
  /// @param amount_ amount of tokens to be sent.
  function _transfer(address sender_, address recipient_, uint256 amount_) private {
    require(sender_ != address(0x0));
    require(recipient_ != address(0x0));

    Holder storage sender = _holders[sender_];
    Holder storage recipient = _holders[recipient_];

    require(sender.balance >= amount_);

    if (_holderAddresses.contains(recipient_)) {
      recipient.balance = recipient.balance.add(amount_);
    } else {
      recipient.balance = amount_;
      _holderAddresses.add(recipient_);
    }
    sender.balance = sender.balance.sub(amount_);
    if (totalOf(sender_) == 0) {
      _holderAddresses.remove(sender_);
    }

    emit Transfer(sender_, recipient_, amount_);
  }

  /// @notice Main functionality for token allowance approval.
  /// @param owner_ address whose tokens will be spent.
  /// @param spender_ address that will be able to spend tokens.
  /// @param amount_ amount of tokens that can be spent.
  function _approve(address owner_, address spender_, uint256 amount_) private {
    require(owner_ != address(0x0));
    require(spender_ != address(0x0));

    _holders[owner_].allowances[spender_] = amount_;

    emit Approval(owner_, spender_, amount_);
  }

  // Owner transactions.

  /// @notice Sets DAO and Factory addresses.
  /// @param dao_ DAO address that this token governs.
  /// @param factory_ Factory address.
  function setDaoFactoryAddresses(address dao_, address factory_) public override onlyOwner {
    _dao = dao_;
    _factory = factory_;
  }
}

File 1 of 8: Context.sol
pragma solidity ^0.6.0;
import "./Initializable.sol";

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract ContextUpgradeSafe is Initializable {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.

    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {


    }


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

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

    uint256[50] private __gap;
}

File 2 of 8: EnumerableSet.sol
pragma solidity ^0.6.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256`
 * (`UintSet`) are supported.
 */
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];
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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


    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

File 3 of 8: Initializable.sol
pragma solidity >=0.4.24 <0.7.0;


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

File 4 of 8: ITorro.sol
// "SPDX-License-Identifier: UNLICENSED"
pragma solidity 0.6.6;

/// @title Interface for ERC-20 Torro governing token.
/// @notice ERC-20 token.
/// @author ORayskiy - @robitnik_TorroDao
interface ITorro {

  // Initializer.

  /// @notice Initializes governing token.
  /// @param dao_ address of cloned DAO.
  /// @param factory_ address of factory.
  /// @param supply_ total supply of tokens.
  function initializeCustom(address dao_, address factory_, uint256 supply_) external;

  // Public calls.

  /// @notice Token's name.
  /// @return string name of the token.
  function name() external view returns (string memory);

  /// @notice Token's symbol.
  /// @return string symbol of the token.
  function symbol() external view returns (string memory);

  /// @notice Token's decimals.
  /// @return uint8 demials of the token.
  function decimals() external pure returns (uint8);

  /// @notice Token's total supply.
  /// @return uint256 total supply of the token.
  function totalSupply() external view returns (uint256);

  /// @notice Count of token holders.
  /// @return uint256 number of token holders.
  function holdersCount() external view returns (uint256);

  /// @notice All token holders.
  /// @return array of addresses of token holders.
  function holders() external view returns (address[] memory);

  /// @notice Available balance for address.
  /// @param sender_ address to get available balance for.
  /// @return uint256 amount of tokens available for given address.
  function balanceOf(address sender_) external view returns (uint256);

  /// @notice Staked balance for address.
  /// @param sender_ address to get staked balance for.
  /// @return uint256 amount of staked tokens for given address.
  function stakedOf(address sender_) external view returns (uint256);

  /// @notice Total balance for address = available + staked.
  /// @param sender_ address to get total balance for.
  /// @return uint256 total amount of tokens for given address.
  function totalOf(address sender_) external view returns (uint256);

  /// @notice Locked staked balance for address
  /// @param sender_ address to get locked staked balance for.
  /// @return uint256 amount of locked staked tokens for given address.
  function lockedOf(address sender_) external view returns (uint256);

  /// @notice Spending allowance.
  /// @param owner_ token owner address.
  /// @param spender_ token spender address.
  /// @return uint256 amount of owner's tokens that spender can use.
  function allowance(address owner_, address spender_) external view returns (uint256);

  /// @notice Unstaked supply of token.
  /// @return uint256 amount of tokens in circulation that are not staked.
  function unstakedSupply() external view returns (uint256);

  /// @notice Staked supply of token.
  /// @return uint256 amount of tokens in circulation that are staked.
  function stakedSupply() external view returns (uint256);

  // Public transactions.

  /// @notice Transfer tokens to recipient.
  /// @param recipient_ address of tokens' recipient.
  /// @param amount_ amount of tokens to transfer.
  /// @return bool true if successful.
  function transfer(address recipient_, uint256 amount_) external returns (bool);

  /// @notice Approve spender to spend an allowance.
  /// @param spender_ address that will be allowed to spend specified amount of tokens.
  /// @param amount_ amount of tokens that spender can spend.
  /// @return bool true if successful.
  function approve(address spender_, uint256 amount_) external returns (bool);

  /// @notice Approves DAO to spend tokens.
  /// @param owner_ address whose tokens DAO can spend.
  /// @param amount_ amount of tokens that DAO can spend.
  /// @return bool true if successful.
  function approveDao(address owner_, uint256 amount_) external returns (bool);

  /// @notice Locks account's staked tokens.
  /// @param owner_ address whose tokens should be locked.
  /// @param amount_ amount of tokens to lock.
  /// @param id_ lock id.
  function lockStakesDao(address owner_, uint256 amount_, uint256 id_) external;

  /// @notice Unlocks account's staked tokens.
  /// @param owner_ address whose tokens should be unlocked.
  /// @param id_ unlock id.
  function unlockStakesDao(address owner_, uint256 id_) external;

  /// @notice Transfers tokens from owner to recipient by approved spender.
  /// @param owner_ address of tokens' owner whose tokens will be spent.
  /// @param recipient_ address of recipient that will recieve tokens.
  /// @param amount_ amount of tokens to be spent.
  /// @return bool true if successful.
  function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool);

  /// @notice Increases allowance for given spender.
  /// @param spender_ spender to increase allowance for.
  /// @param addedValue_ extra amount that spender can spend.
  /// @return bool true if successful.
  function increaseAllowance(address spender_, uint256 addedValue_) external returns (bool);

  /// @notice Decreases allowance for given spender.
  /// @param spender_ spender to decrease allowance for.
  /// @param subtractedValue_ removed amount that spender can spend.
  /// @return bool true if successful.
  function decreaseAllowance(address spender_, uint256 subtractedValue_) external returns (bool);

  /// @notice Stake tokens.
  /// @param amount_ amount of tokens to be staked.
  /// @return bool true if successful.
  function stake(uint256 amount_) external returns (bool);

  /// @notice Unstake tokens.
  /// @param amount_ amount of tokens to be unstaked.
  /// @return bool true if successful.
  function unstake(uint256 amount_) external returns (bool);

  /// @notice Functionality for DAO to add benefits for all stakers.
  /// @param amount_ amount of wei to be shared among stakers.
  function addBenefits(uint256 amount_) external;

  /// @notice Sets DAO and Factory addresses.
  /// @param dao_ DAO address that this token governs.
  /// @param factory_ Factory address.
  function setDaoFactoryAddresses(address dao_, address factory_) external;

  /// @notice Functionality for owner to burn tokens.
  /// @param amount_ amount of tokens to burn.
  function burn(uint256 amount_) external;
}

File 5 of 8: ITorroFactory.sol
// "SPDX-License-Identifier: UNLICENSED"
pragma solidity 0.6.6;

/// @title Factory interface with benefits related methods exposed.
/// @notice Interface for claiming, adding and depositing benefits.
/// @author ORayskiy - @robitnik_TorroDao
interface ITorroFactory {

  /// @notice Address of the main token.
  /// @return address of the main token.  
  function mainToken() external view returns (address);

  /// @notice Address of the main DAO.
  /// @return address of the main DAO.
  function mainDao() external view returns (address);

  /// @notice Checks whether provided address is a valid DAO.
  /// @param dao_ address to check.
  /// @return bool true if address is a valid DAO.
  function isDao(address dao_) external view returns (bool);

  /// @notice Claim available benefits for holder.
  /// @param amount_ of wei to claim.
  function claimBenefits(uint256 amount_) external;

  /// @notice Adds withdrawal benefits for holder.
  /// @param recipient_ holder that's getting benefits.
  /// @param amount_ benefits amount to be added to holder's existing benefits.
  function addBenefits(address recipient_, uint256 amount_) external;
  
  /// @notice Depositis withdrawal benefits.
  /// @param token_ governing token for DAO that's depositing benefits.
  function depositBenefits(address token_) external payable;
}

File 6 of 8: Ownable.sol
pragma solidity ^0.6.0;

import "./Context.sol";
import "./Initializable.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */

    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {


        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);

    }


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

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

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

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

    uint256[49] private __gap;
}

File 7 of 8: SafeMath.sol
pragma solidity =0.6.6;

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

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"AddBenefits","type":"event"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstake","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"addBenefits","outputs":[],"stateMutability":"nonpayable","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":"owner_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"approveDao","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender_","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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[],"name":"holders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"dao_","type":"address"},{"internalType":"address","name":"factory_","type":"address"},{"internalType":"uint256","name":"supply_","type":"uint256"}],"name":"initializeCustom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"lockStakesDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender_","type":"address"}],"name":"lockedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dao_","type":"address"},{"internalType":"address","name":"factory_","type":"address"}],"name":"setDaoFactoryAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"stake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender_","type":"address"}],"name":"stakedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender_","type":"address"}],"name":"totalOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"owner_","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"unlockStakesDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"unstake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50620000256001600160e01b036200013216565b60408051808201909152600f8082526e2a37b93937902220a7902a37b5b2b760891b60209092019182526200005d9160979162000475565b5060408051808201909152600580825264544f52524f60d81b60209092019182526200008c9160989162000475565b5069152d02c7e14af68000006099819055609a80546001600160a01b0319169055609b80546001600160a81b031916600160a01b179055336000818152609c6020908152604090912092909255620000f191609d9190620017ff6200020b821b17901c565b50609954604080519182525133916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a362000517565b600054610100900460ff1680620001575750620001576001600160e01b036200023416565b8062000166575060005460ff16155b620001a35760405162461bcd60e51b815260040180806020018281038252602e815260200180620021f2602e913960400191505060405180910390fd5b600054610100900460ff16158015620001cf576000805460ff1961ff0019909116610100171660011790555b620001e26001600160e01b036200023b16565b620001f56001600160e01b03620002ec16565b801562000208576000805461ff00191690555b50565b60006200022b836001600160a01b0384166001600160e01b036200040116565b90505b92915050565b303b155b90565b600054610100900460ff1680620002605750620002606001600160e01b036200023416565b806200026f575060005460ff16155b620002ac5760405162461bcd60e51b815260040180806020018281038252602e815260200180620021f2602e913960400191505060405180910390fd5b600054610100900460ff16158015620001f5576000805460ff1961ff001990911661010017166001179055801562000208576000805461ff001916905550565b600054610100900460ff1680620003115750620003116001600160e01b036200023416565b8062000320575060005460ff16155b6200035d5760405162461bcd60e51b815260040180806020018281038252602e815260200180620021f2602e913960400191505060405180910390fd5b600054610100900460ff1615801562000389576000805460ff1961ff0019909116610100171660011790555b60006200039e6001600160e01b036200045916565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801562000208576000805461ff001916905550565b60006200041883836001600160e01b036200045d16565b62000450575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200022e565b5060006200022e565b3390565b60009081526001919091016020526040902054151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620004b857805160ff1916838001178555620004e8565b82800160010185558215620004e8579182015b82811115620004e8578251825591602001919060010190620004cb565b50620004f6929150620004fa565b5090565b6200023891905b80821115620004f6576000815560010162000501565b611ccb80620005276000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80638188f71c11610104578063a5f1e282116100a2578063d41ce4b111610071578063d41ce4b1146105f4578063dd62ed3e146105fc578063e3c064031461062a578063f2fde38b1461065c576101da565b8063a5f1e2821461055f578063a694fc3a14610585578063a9059cbb146105a2578063af500ba3146105ce576101da565b806393be3bc6116100de57806393be3bc6146104c957806395d89b41146104ff5780639cedea7c14610507578063a457c2d714610533576101da565b80638188f71c146104275780638da5cb5b1461047f578063912c2673146104a3576101da565b8063313ce5671161017c578063506be6e41161014b578063506be6e4146103c55780636b4ed21b146103f157806370a08231146103f9578063715018a61461041f576101da565b8063313ce56714610341578063395093511461035f57806342966c681461038b5780634c5844e7146103a8576101da565b806322614097116101b857806322614097146102b657806323b872dd146102e65780632e17de781461031c5780632fa6e16b14610339576101da565b806306fdde03146101df578063095ea7b31461025c57806318160ddd1461029c575b600080fd5b6101e7610682565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610221578181015183820152602001610209565b50505050905090810190601f16801561024e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102886004803603604081101561027257600080fd5b506001600160a01b038135169060200135610719565b604080519115158252519081900360200190f35b6102a4610730565b60408051918252519081900360200190f35b6102e4600480360360408110156102cc57600080fd5b506001600160a01b0381358116916020013516610736565b005b610288600480360360608110156102fc57600080fd5b506001600160a01b038135811691602081013590911690604001356107ce565b6102886004803603602081101561033257600080fd5b503561085c565b6102a46109f6565b610349610a5b565b6040805160ff9092168252519081900360200190f35b6102886004803603604081101561037557600080fd5b506001600160a01b038135169060200135610a60565b6102e4600480360360208110156103a157600080fd5b5035610a9f565b6102e4600480360360208110156103be57600080fd5b5035610b10565b610288600480360360408110156103db57600080fd5b506001600160a01b038135169060200135610cb1565b6102a4610ce3565b6102a46004803603602081101561040f57600080fd5b50356001600160a01b0316610cf4565b6102e4610d0f565b61042f610dc3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561046b578181015183820152602001610453565b505050509050019250505060405180910390f35b610487610e68565b604080516001600160a01b039092168252519081900360200190f35b6102a4600480360360208110156104b957600080fd5b50356001600160a01b0316610e77565b6102e4600480360360608110156104df57600080fd5b506001600160a01b03813581169160208101359091169060400135610ea5565b6101e761104f565b6102e46004803603604081101561051d57600080fd5b506001600160a01b0381351690602001356110b0565b6102886004803603604081101561054957600080fd5b506001600160a01b038135169060200135611125565b6102a46004803603602081101561057557600080fd5b50356001600160a01b0316611164565b6102886004803603602081101561059b57600080fd5b5035611182565b610288600480360360408110156105b857600080fd5b506001600160a01b03813516906020013561124f565b6102a4600480360360208110156105e457600080fd5b50356001600160a01b031661125c565b6102a461127a565b6102a46004803603604081101561061257600080fd5b506001600160a01b03813581169160200135166112dc565b6102e46004803603606081101561064057600080fd5b506001600160a01b03813516906020810135906040013561130b565b6102e46004803603602081101561067257600080fd5b50356001600160a01b031661137e565b60978054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561070e5780601f106106e35761010080835404028352916020019161070e565b820191906000526020600020905b8154815290600101906020018083116106f157829003601f168201915b505050505090505b90565b6000610726338484611489565b5060015b92915050565b60995490565b61073e611515565b6065546001600160a01b039081169116146107a0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b609a80546001600160a01b039384166001600160a01b031991821617909155609b8054929093169116179055565b6001600160a01b0383166000908152609c6020908152604080832033845260020190915281205482111561080157600080fd5b61080c848484611519565b6001600160a01b0384166000908152609c602090815260408083203380855260029091019092529091205461085291869161084d908663ffffffff61162716565b611489565b5060019392505050565b6000816108683361125c565b101561087357600080fd5b336000908152609c6020526040902060048101546001820154849161089e919063ffffffff61162716565b10156108a957600080fd5b609b54600090600160a01b900460ff16156109605760995460c88504906000906108d9908363ffffffff61162716565b905069021e19e0c9bab240000081101561090357609954610900908263ffffffff61162716565b91505b811561095957610919868363ffffffff61162716565b60995490935061092f908363ffffffff61162716565b6099556040805183815290516000913391600080516020611c768339815191529181900360200190a35b5050610963565b50825b6001820154610978908563ffffffff61162716565b6001830155815461098f908263ffffffff61167716565b825560408051828152905133913091600080516020611c768339815191529181900360200190a360408051858152905133917f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd919081900360200190a25060019392505050565b600080805b610a05609d6116c6565b811015610a5557610a4b609c6000610a24609d8563ffffffff6116d116565b6001600160a01b03168152602081019190915260400160002054839063ffffffff61167716565b91506001016109fb565b50905090565b601290565b336000818152609c602090815260408083206001600160a01b0387168452600201909152812054909161072691859061084d908663ffffffff61167716565b336000908152609c602052604090208054821115610abc57600080fd5b8054610ace908363ffffffff61162716565b8155609954610ae3908363ffffffff61162716565b6099556040805183815290516000913391600080516020611c768339815191529181900360200190a35050565b609a546001600160a01b0316331480610b9b5750609b546040805162fcec5360e51b815233600482015290516001600160a01b0390921691631f9d8a6091602480820192602092909190829003018186803b158015610b6e57600080fd5b505afa158015610b82573d6000803e3d6000fd5b505050506040513d6020811015610b9857600080fd5b50515b610ba457600080fd5b60005b610bb1609d6116c6565b811015610c84576000610bcb609d8363ffffffff6116d116565b90506000610bd88261125c565b90508015610c7a576000610bea61127a565b610bfa838763ffffffff6116e416565b81610c0157fe5b0490508015610c7857609b546040805163453d03f360e01b81526001600160a01b038681166004830152602482018590529151919092169163453d03f391604480830192600092919082900301818387803b158015610c5f57600080fd5b505af1158015610c73573d6000803e3d6000fd5b505050505b505b5050600101610ba7565b506040517fcac873607e8a6b1088c9430235e31dc744c15fe900a64c030316066bb06f0ddd90600090a150565b609a546000906001600160a01b03163314610ccb57600080fd5b609a546107269084906001600160a01b031684611489565b6000610cef609d6116c6565b905090565b6001600160a01b03166000908152609c602052604090205490565b610d17611515565b6065546001600160a01b03908116911614610d79576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60606000610dd1609d6116c6565b905060608167ffffffffffffffff81118015610dec57600080fd5b50604051908082528060200260200182016040528015610e16578160200160208202803683370190505b50905060005b82811015610e6157610e35609d8263ffffffff6116d116565b828281518110610e4157fe5b6001600160a01b0390921660209283029190910190910152600101610e1c565b5091505090565b6065546001600160a01b031690565b6001600160a01b0381166000908152609c602052604081206001810154905461072a9163ffffffff61167716565b600054610100900460ff1680610ebe5750610ebe611747565b80610ecc575060005460ff16155b610f075760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff16158015610f32576000805460ff1961ff0019909116610100171660011790555b610f3a61174d565b604080518082019091526014808252732a37b93937902220a7902837b7b6102a37b5b2b760611b6020909201918252610f7591609791611b67565b5060408051808201909152600a808252691513d49493d7d413d3d360b21b6020909201918252610fa791609891611b67565b506099829055609a80546001600160a01b038087166001600160a01b03199283168117909355609b805460ff60a01b199288169316929092171690556000908152609c60205260409020829055611005609d8563ffffffff6117ff16565b5060995460408051918252516001600160a01b03861691600091600080516020611c768339815191529181900360200190a38015611049576000805461ff00191690555b50505050565b60988054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561070e5780601f106106e35761010080835404028352916020019161070e565b609a546001600160a01b031633146110c757600080fd5b6001600160a01b0382166000908152609c602090815260408083208484526003810190925290912054801561111157600482015461110b908263ffffffff61162716565b60048301555b506000918252600301602052604081205550565b336000818152609c602090815260408083206001600160a01b0387168452600201909152812054909161072691859061084d908663ffffffff61162716565b6001600160a01b03166000908152609c602052604090206004015490565b6000670de0b6b3a764000082101561119957600080fd5b816111a333610cf4565b10156111ae57600080fd5b336000908152609c6020526040902080546111cf908463ffffffff61162716565b815560018101546111e6908463ffffffff61167716565b600182015560408051848152905130913391600080516020611c768339815191529181900360200190a360408051848152905133917febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a919081900360200190a250600192915050565b6000610726338484611519565b6001600160a01b03166000908152609c602052604090206001015490565b600080805b611289609d6116c6565b811015610a55576112d2609c60006112a8609d8563ffffffff6116d116565b6001600160a01b03168152602081019190915260400160002060010154839063ffffffff61167716565b915060010161127f565b6001600160a01b039182166000908152609c602090815260408083209390941682526002909201909152205490565b609a546001600160a01b0316331461132257600080fd5b6001600160a01b0383166000908152609c60205260409020600181015483111561134b57600080fd5b600082815260038201602052604090208390556004810154611373908463ffffffff61167716565b600490910155505050565b611386611515565b6065546001600160a01b039081169116146113e8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661142d5760405162461bcd60e51b8152600401808060200182810382526026815260200180611c226026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661149c57600080fd5b6001600160a01b0382166114af57600080fd5b6001600160a01b038084166000818152609c602090815260408083209487168084526002909501825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b3390565b6001600160a01b03831661152c57600080fd5b6001600160a01b03821661153f57600080fd5b6001600160a01b038084166000908152609c602052604080822092851682529020815483111561156e57600080fd5b61157f609d8563ffffffff61181416565b1561159d578054611596908463ffffffff61167716565b81556115b3565b8281556115b1609d8563ffffffff6117ff16565b505b81546115c5908463ffffffff61162716565b82556115d085610e77565b6115e7576115e5609d8663ffffffff61182916565b505b836001600160a01b0316856001600160a01b0316600080516020611c76833981519152856040518082815260200191505060405180910390a35050505050565b8082038281111561072a576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b8082018281101561072a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b600061072a8261183e565b60006116dd8383611842565b9392505050565b60008115806116ff575050808202828282816116fc57fe5b04145b61072a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b303b1590565b600054610100900460ff16806117665750611766611747565b80611774575060005460ff16155b6117af5760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156117da576000805460ff1961ff0019909116610100171660011790555b6117e26118a6565b6117ea611946565b80156117fc576000805461ff00191690555b50565b60006116dd836001600160a01b038416611a3f565b60006116dd836001600160a01b038416611a89565b60006116dd836001600160a01b038416611aa1565b5490565b815460009082106118845760405162461bcd60e51b8152600401808060200182810382526022815260200180611c006022913960400191505060405180910390fd5b82600001828154811061189357fe5b9060005260206000200154905092915050565b600054610100900460ff16806118bf57506118bf611747565b806118cd575060005460ff16155b6119085760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156117ea576000805460ff1961ff00199091166101001716600117905580156117fc576000805461ff001916905550565b600054610100900460ff168061195f575061195f611747565b8061196d575060005460ff16155b6119a85760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156119d3576000805460ff1961ff0019909116610100171660011790555b60006119dd611515565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156117fc576000805461ff001916905550565b6000611a4b8383611a89565b611a815750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561072a565b50600061072a565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611b5d5783546000198083019190810190600090879083908110611ad457fe5b9060005260206000200154905080876000018481548110611af157fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611b2157fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061072a565b600091505061072a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611ba857805160ff1916838001178555611bd5565b82800160010185558215611bd5579182015b82811115611bd5578251825591602001919060010190611bba565b50611be1929150611be5565b5090565b61071691905b80821115611be15760008155600101611beb56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122047307f293d7be7f557f4d42e29fa7f3395a1dd8ed88fc8a7937da6a5b3cc146364736f6c63430006060033436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80638188f71c11610104578063a5f1e282116100a2578063d41ce4b111610071578063d41ce4b1146105f4578063dd62ed3e146105fc578063e3c064031461062a578063f2fde38b1461065c576101da565b8063a5f1e2821461055f578063a694fc3a14610585578063a9059cbb146105a2578063af500ba3146105ce576101da565b806393be3bc6116100de57806393be3bc6146104c957806395d89b41146104ff5780639cedea7c14610507578063a457c2d714610533576101da565b80638188f71c146104275780638da5cb5b1461047f578063912c2673146104a3576101da565b8063313ce5671161017c578063506be6e41161014b578063506be6e4146103c55780636b4ed21b146103f157806370a08231146103f9578063715018a61461041f576101da565b8063313ce56714610341578063395093511461035f57806342966c681461038b5780634c5844e7146103a8576101da565b806322614097116101b857806322614097146102b657806323b872dd146102e65780632e17de781461031c5780632fa6e16b14610339576101da565b806306fdde03146101df578063095ea7b31461025c57806318160ddd1461029c575b600080fd5b6101e7610682565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610221578181015183820152602001610209565b50505050905090810190601f16801561024e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102886004803603604081101561027257600080fd5b506001600160a01b038135169060200135610719565b604080519115158252519081900360200190f35b6102a4610730565b60408051918252519081900360200190f35b6102e4600480360360408110156102cc57600080fd5b506001600160a01b0381358116916020013516610736565b005b610288600480360360608110156102fc57600080fd5b506001600160a01b038135811691602081013590911690604001356107ce565b6102886004803603602081101561033257600080fd5b503561085c565b6102a46109f6565b610349610a5b565b6040805160ff9092168252519081900360200190f35b6102886004803603604081101561037557600080fd5b506001600160a01b038135169060200135610a60565b6102e4600480360360208110156103a157600080fd5b5035610a9f565b6102e4600480360360208110156103be57600080fd5b5035610b10565b610288600480360360408110156103db57600080fd5b506001600160a01b038135169060200135610cb1565b6102a4610ce3565b6102a46004803603602081101561040f57600080fd5b50356001600160a01b0316610cf4565b6102e4610d0f565b61042f610dc3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561046b578181015183820152602001610453565b505050509050019250505060405180910390f35b610487610e68565b604080516001600160a01b039092168252519081900360200190f35b6102a4600480360360208110156104b957600080fd5b50356001600160a01b0316610e77565b6102e4600480360360608110156104df57600080fd5b506001600160a01b03813581169160208101359091169060400135610ea5565b6101e761104f565b6102e46004803603604081101561051d57600080fd5b506001600160a01b0381351690602001356110b0565b6102886004803603604081101561054957600080fd5b506001600160a01b038135169060200135611125565b6102a46004803603602081101561057557600080fd5b50356001600160a01b0316611164565b6102886004803603602081101561059b57600080fd5b5035611182565b610288600480360360408110156105b857600080fd5b506001600160a01b03813516906020013561124f565b6102a4600480360360208110156105e457600080fd5b50356001600160a01b031661125c565b6102a461127a565b6102a46004803603604081101561061257600080fd5b506001600160a01b03813581169160200135166112dc565b6102e46004803603606081101561064057600080fd5b506001600160a01b03813516906020810135906040013561130b565b6102e46004803603602081101561067257600080fd5b50356001600160a01b031661137e565b60978054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561070e5780601f106106e35761010080835404028352916020019161070e565b820191906000526020600020905b8154815290600101906020018083116106f157829003601f168201915b505050505090505b90565b6000610726338484611489565b5060015b92915050565b60995490565b61073e611515565b6065546001600160a01b039081169116146107a0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b609a80546001600160a01b039384166001600160a01b031991821617909155609b8054929093169116179055565b6001600160a01b0383166000908152609c6020908152604080832033845260020190915281205482111561080157600080fd5b61080c848484611519565b6001600160a01b0384166000908152609c602090815260408083203380855260029091019092529091205461085291869161084d908663ffffffff61162716565b611489565b5060019392505050565b6000816108683361125c565b101561087357600080fd5b336000908152609c6020526040902060048101546001820154849161089e919063ffffffff61162716565b10156108a957600080fd5b609b54600090600160a01b900460ff16156109605760995460c88504906000906108d9908363ffffffff61162716565b905069021e19e0c9bab240000081101561090357609954610900908263ffffffff61162716565b91505b811561095957610919868363ffffffff61162716565b60995490935061092f908363ffffffff61162716565b6099556040805183815290516000913391600080516020611c768339815191529181900360200190a35b5050610963565b50825b6001820154610978908563ffffffff61162716565b6001830155815461098f908263ffffffff61167716565b825560408051828152905133913091600080516020611c768339815191529181900360200190a360408051858152905133917f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd919081900360200190a25060019392505050565b600080805b610a05609d6116c6565b811015610a5557610a4b609c6000610a24609d8563ffffffff6116d116565b6001600160a01b03168152602081019190915260400160002054839063ffffffff61167716565b91506001016109fb565b50905090565b601290565b336000818152609c602090815260408083206001600160a01b0387168452600201909152812054909161072691859061084d908663ffffffff61167716565b336000908152609c602052604090208054821115610abc57600080fd5b8054610ace908363ffffffff61162716565b8155609954610ae3908363ffffffff61162716565b6099556040805183815290516000913391600080516020611c768339815191529181900360200190a35050565b609a546001600160a01b0316331480610b9b5750609b546040805162fcec5360e51b815233600482015290516001600160a01b0390921691631f9d8a6091602480820192602092909190829003018186803b158015610b6e57600080fd5b505afa158015610b82573d6000803e3d6000fd5b505050506040513d6020811015610b9857600080fd5b50515b610ba457600080fd5b60005b610bb1609d6116c6565b811015610c84576000610bcb609d8363ffffffff6116d116565b90506000610bd88261125c565b90508015610c7a576000610bea61127a565b610bfa838763ffffffff6116e416565b81610c0157fe5b0490508015610c7857609b546040805163453d03f360e01b81526001600160a01b038681166004830152602482018590529151919092169163453d03f391604480830192600092919082900301818387803b158015610c5f57600080fd5b505af1158015610c73573d6000803e3d6000fd5b505050505b505b5050600101610ba7565b506040517fcac873607e8a6b1088c9430235e31dc744c15fe900a64c030316066bb06f0ddd90600090a150565b609a546000906001600160a01b03163314610ccb57600080fd5b609a546107269084906001600160a01b031684611489565b6000610cef609d6116c6565b905090565b6001600160a01b03166000908152609c602052604090205490565b610d17611515565b6065546001600160a01b03908116911614610d79576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60606000610dd1609d6116c6565b905060608167ffffffffffffffff81118015610dec57600080fd5b50604051908082528060200260200182016040528015610e16578160200160208202803683370190505b50905060005b82811015610e6157610e35609d8263ffffffff6116d116565b828281518110610e4157fe5b6001600160a01b0390921660209283029190910190910152600101610e1c565b5091505090565b6065546001600160a01b031690565b6001600160a01b0381166000908152609c602052604081206001810154905461072a9163ffffffff61167716565b600054610100900460ff1680610ebe5750610ebe611747565b80610ecc575060005460ff16155b610f075760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff16158015610f32576000805460ff1961ff0019909116610100171660011790555b610f3a61174d565b604080518082019091526014808252732a37b93937902220a7902837b7b6102a37b5b2b760611b6020909201918252610f7591609791611b67565b5060408051808201909152600a808252691513d49493d7d413d3d360b21b6020909201918252610fa791609891611b67565b506099829055609a80546001600160a01b038087166001600160a01b03199283168117909355609b805460ff60a01b199288169316929092171690556000908152609c60205260409020829055611005609d8563ffffffff6117ff16565b5060995460408051918252516001600160a01b03861691600091600080516020611c768339815191529181900360200190a38015611049576000805461ff00191690555b50505050565b60988054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561070e5780601f106106e35761010080835404028352916020019161070e565b609a546001600160a01b031633146110c757600080fd5b6001600160a01b0382166000908152609c602090815260408083208484526003810190925290912054801561111157600482015461110b908263ffffffff61162716565b60048301555b506000918252600301602052604081205550565b336000818152609c602090815260408083206001600160a01b0387168452600201909152812054909161072691859061084d908663ffffffff61162716565b6001600160a01b03166000908152609c602052604090206004015490565b6000670de0b6b3a764000082101561119957600080fd5b816111a333610cf4565b10156111ae57600080fd5b336000908152609c6020526040902080546111cf908463ffffffff61162716565b815560018101546111e6908463ffffffff61167716565b600182015560408051848152905130913391600080516020611c768339815191529181900360200190a360408051848152905133917febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a919081900360200190a250600192915050565b6000610726338484611519565b6001600160a01b03166000908152609c602052604090206001015490565b600080805b611289609d6116c6565b811015610a55576112d2609c60006112a8609d8563ffffffff6116d116565b6001600160a01b03168152602081019190915260400160002060010154839063ffffffff61167716565b915060010161127f565b6001600160a01b039182166000908152609c602090815260408083209390941682526002909201909152205490565b609a546001600160a01b0316331461132257600080fd5b6001600160a01b0383166000908152609c60205260409020600181015483111561134b57600080fd5b600082815260038201602052604090208390556004810154611373908463ffffffff61167716565b600490910155505050565b611386611515565b6065546001600160a01b039081169116146113e8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661142d5760405162461bcd60e51b8152600401808060200182810382526026815260200180611c226026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661149c57600080fd5b6001600160a01b0382166114af57600080fd5b6001600160a01b038084166000818152609c602090815260408083209487168084526002909501825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b3390565b6001600160a01b03831661152c57600080fd5b6001600160a01b03821661153f57600080fd5b6001600160a01b038084166000908152609c602052604080822092851682529020815483111561156e57600080fd5b61157f609d8563ffffffff61181416565b1561159d578054611596908463ffffffff61167716565b81556115b3565b8281556115b1609d8563ffffffff6117ff16565b505b81546115c5908463ffffffff61162716565b82556115d085610e77565b6115e7576115e5609d8663ffffffff61182916565b505b836001600160a01b0316856001600160a01b0316600080516020611c76833981519152856040518082815260200191505060405180910390a35050505050565b8082038281111561072a576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b8082018281101561072a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b600061072a8261183e565b60006116dd8383611842565b9392505050565b60008115806116ff575050808202828282816116fc57fe5b04145b61072a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b303b1590565b600054610100900460ff16806117665750611766611747565b80611774575060005460ff16155b6117af5760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156117da576000805460ff1961ff0019909116610100171660011790555b6117e26118a6565b6117ea611946565b80156117fc576000805461ff00191690555b50565b60006116dd836001600160a01b038416611a3f565b60006116dd836001600160a01b038416611a89565b60006116dd836001600160a01b038416611aa1565b5490565b815460009082106118845760405162461bcd60e51b8152600401808060200182810382526022815260200180611c006022913960400191505060405180910390fd5b82600001828154811061189357fe5b9060005260206000200154905092915050565b600054610100900460ff16806118bf57506118bf611747565b806118cd575060005460ff16155b6119085760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156117ea576000805460ff1961ff00199091166101001716600117905580156117fc576000805461ff001916905550565b600054610100900460ff168061195f575061195f611747565b8061196d575060005460ff16155b6119a85760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156119d3576000805460ff1961ff0019909116610100171660011790555b60006119dd611515565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156117fc576000805461ff001916905550565b6000611a4b8383611a89565b611a815750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561072a565b50600061072a565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611b5d5783546000198083019190810190600090879083908110611ad457fe5b9060005260206000200154905080876000018481548110611af157fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611b2157fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061072a565b600091505061072a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611ba857805160ff1916838001178555611bd5565b82800160010185558215611bd5579182015b82811115611bd5578251825591602001919060010190611bba565b50611be1929150611be5565b5090565b61071691905b80821115611be15760008155600101611beb56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122047307f293d7be7f557f4d42e29fa7f3395a1dd8ed88fc8a7937da6a5b3cc146364736f6c63430006060033

Deployed Bytecode Sourcemap

346:14737:7:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;346:14737:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;3378:86:7;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3378:86:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7569:153;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7569:153:7;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3894:91;;;:::i;:::-;;;;;;;;;;;;;;;;14940:140;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14940:140:7;;;;;;;;;;:::i;:::-;;9378:330;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;9378:330:7;;;;;;;;;;;;;;;;;:::i;11268:893::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11268:893:7;;:::i;6305:256::-;;;:::i;3716:86::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9929:218;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;9929:218:7;;;;;;;;:::i;12988:300::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12988:300:7;;:::i;12301:586::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12301:586:7;;:::i;7929:180::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7929:180:7;;;;;;;;:::i;4078:108::-;;;:::i;4776:120::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4776:120:7;-1:-1:-1;;;;;4776:120:7;;:::i;1888:145:5:-;;;:::i;4278:317:7:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4278:317:7;;;;;;;;;;;;;;;;;1265:77:5;;;:::i;:::-;;;;-1:-1:-1;;;;;1265:77:5;;;;;;;;;;;;;;5376:148:7;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5376:148:7;-1:-1:-1;;;;;5376:148:7;;:::i;2850:430::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;2850:430:7;;;;;;;;;;;;;;;;;:::i;3544:90::-;;;:::i;8740:317::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;8740:317:7;;;;;;;;:::i;10375:228::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;10375:228:7;;;;;;;;:::i;5716:118::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5716:118:7;-1:-1:-1;;;;;5716:118:7;;:::i;10730:406::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10730:406:7;;:::i;7158:159::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7158:159:7;;;;;;;;:::i;5068:118::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5068:118:7;-1:-1:-1;;;;;5068:118:7;;:::i;6678:253::-;;;:::i;6033:149::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;6033:149:7;;;;;;;;;;:::i;8296:299::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;8296:299:7;;;;;;;;;;;;;:::i;2182:240:5:-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2182:240:5;-1:-1:-1;;;;;2182:240:5;;:::i;3378:86:7:-;3453:5;3446:12;;;;;;;;-1:-1:-1;;3446:12:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3424:13;;3446:12;;3453:5;;3446:12;;3453:5;3446:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3378:86;;:::o;7569:153::-;7646:4;7659:39;7668:10;7680:8;7690:7;7659:8;:39::i;:::-;-1:-1:-1;7712:4:7;7569:153;;;;;:::o;3894:91::-;3968:12;;3894:91;:::o;14940:140::-;1479:12:5;:10;:12::i;:::-;1469:6;;-1:-1:-1;;;;;1469:6:5;;;:22;;;1461:67;;;;;-1:-1:-1;;;1461:67:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15037:4:7::1;:11:::0;;-1:-1:-1;;;;;15037:11:7;;::::1;-1:-1:-1::0;;;;;;15037:11:7;;::::1;;::::0;;;15055:8:::1;:19:::0;;;;;::::1;::::0;::::1;;::::0;;14940:140::o;9378:330::-;-1:-1:-1;;;;;9499:16:7;;9478:4;9499:16;;;:8;:16;;;;;;;;9527:10;9499:39;;:27;;:39;;;;;;:50;-1:-1:-1;9499:50:7;9491:59;;12:1:-1;9;2:12;9491:59:7;9557:38;9567:6;9575:10;9587:7;9557:9;:38::i;:::-;-1:-1:-1;;;;;9631:16:7;;;;;;:8;:16;;;;;;;;9619:10;9631:39;;;:27;;;;:39;;;;;;;9602:82;;9611:6;;9631:52;;9675:7;9631:52;:43;:52;:::i;:::-;9602:8;:82::i;:::-;-1:-1:-1;9698:4:7;9378:330;;;;;:::o;11268:893::-;11327:4;11372:7;11348:20;11357:10;11348:8;:20::i;:::-;:31;;11340:40;;12:1:-1;9;2:12;11340:40:7;11420:10;11387:21;11411:20;;;:8;:20;;;;;11464:13;;;;11446;;;;11482:7;;11446:32;;:13;:32;:17;:32;:::i;:::-;:43;;11438:52;;12:1:-1;9;2:12;11438:52:7;11524:7;;11499:14;;-1:-1:-1;;;11524:7:7;;;;11520:424;;;11605:12;;11567:3;11557:13;;;11542:12;;11605:22;;11557:13;11605:22;:16;:22;:::i;:::-;11579:48;;11658:4;11640:15;:22;11636:89;;;11682:12;;:33;;11699:15;11682:33;:16;:33;:::i;:::-;11675:40;;11636:89;11737:8;;11733:165;;11767:17;:7;11779:4;11767:17;:11;:17;:::i;:::-;11810:12;;11758:26;;-1:-1:-1;11810:22:7;;11827:4;11810:22;:16;:22;:::i;:::-;11795:12;:37;11848:40;;;;;;;;11877:3;;11857:10;;-1:-1:-1;;;;;;;;;;;11848:40:7;;;;;;;;11733:165;11520:424;;;;;-1:-1:-1;11929:7:7;11520:424;11966:13;;;;:26;;11984:7;11966:26;:17;:26;:::i;:::-;11950:13;;;:42;12016:14;;:26;;12035:6;12016:26;:18;:26;:::i;:::-;11999:43;;12054;;;;;;;;12078:10;;12071:4;;-1:-1:-1;;;;;;;;;;;12054:43:7;;;;;;;;12109:28;;;;;;;;12117:10;;12109:28;;;;;;;;;;-1:-1:-1;12151:4:7;;11268:893;-1:-1:-1;;;11268:893:7:o;6305:256::-;6361:7;;;6402:134;6426:25;:16;:23;:25::i;:::-;6422:1;:29;6402:134;;;6476:52;6487:8;:32;6496:22;:16;6516:1;6496:22;:19;:22;:::i;:::-;-1:-1:-1;;;;;6487:32:7;;;;;;;;;;;;-1:-1:-1;6487:32:7;:40;6476:6;;:52;:10;:52;:::i;:::-;6467:61;-1:-1:-1;6453:3:7;;6402:134;;;-1:-1:-1;6549:6:7;-1:-1:-1;6305:256:7;:::o;3716:86::-;790:2;3716:86;:::o;9929:218::-;10042:10;10020:4;10064:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;10064:41:7;;;;:31;;:41;;;;;;10020:4;;10033:90;;10054:8;;10064:58;;10110:11;10064:58;:45;:58;:::i;12988:300::-;13075:10;13042:21;13066:20;;;:8;:20;;;;;13101:14;;:25;-1:-1:-1;13101:25:7;13093:34;;12:1:-1;9;2:12;13093:34:7;13151:14;;:27;;13170:7;13151:27;:18;:27;:::i;:::-;13134:44;;13200:12;;:25;;13217:7;13200:25;:16;:25;:::i;:::-;13185:12;:40;13239:43;;;;;;;;13268:3;;13248:10;;-1:-1:-1;;;;;;;;;;;13239:43:7;;;;;;;;12988:300;;:::o;12301:586::-;12384:4;;-1:-1:-1;;;;;12384:4:7;12370:10;:18;;:63;;-1:-1:-1;12406:8:7;;12392:41;;;-1:-1:-1;;;12392:41:7;;12422:10;12392:41;;;;;;-1:-1:-1;;;;;12406:8:7;;;;12392:29;;:41;;;;;;;;;;;;;;;12406:8;12392:41;;;2:2:-1;;;;27:1;24;17:12;2:2;12392:41:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12392:41:7;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12392:41:7;12370:63;12362:72;;12:1:-1;9;2:12;12362:72:7;12446:9;12441:354;12465:25;:16;:23;:25::i;:::-;12461:1;:29;12441:354;;;12506:14;12523:22;:16;12543:1;12523:22;:19;:22;:::i;:::-;12506:39;;12554:14;12571:16;12580:6;12571:8;:16::i;:::-;12554:33;-1:-1:-1;12600:10:7;;12596:192;;12623:14;12662;:12;:14::i;:::-;12640:19;:6;12651:7;12640:19;:10;:19;:::i;:::-;:36;;;;;;;-1:-1:-1;12691:10:7;;12687:92;;12730:8;;12716:51;;;-1:-1:-1;;;12716:51:7;;-1:-1:-1;;;;;12716:51:7;;;;;;;;;;;;;;;12730:8;;;;;12716:35;;:51;;;;;12730:8;;12716:51;;;;;;;12730:8;;12716:51;;;2:2:-1;;;;27:1;24;17:12;2:2;12716:51:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12716:51:7;;;;12687:92;12596:192;;-1:-1:-1;;12492:3:7;;12441:354;;;-1:-1:-1;12868:13:7;;;;;;;12301:586;:::o;7929:180::-;8042:4;;8007;;-1:-1:-1;;;;;8042:4:7;8028:10;:18;8020:27;;12:1:-1;9;2:12;8020:27:7;8071:4;;8054:31;;8063:6;;-1:-1:-1;;;;;8071:4:7;8077:7;8054:8;:31::i;4078:108::-;4132:7;4155:25;:16;:23;:25::i;:::-;4148:32;;4078:108;:::o;4776:120::-;-1:-1:-1;;;;;4865:17:7;4842:7;4865:17;;;:8;:17;;;;;:25;;4776:120::o;1888:145:5:-;1479:12;:10;:12::i;:::-;1469:6;;-1:-1:-1;;;;;1469:6:5;;;:22;;;1461:67;;;;;-1:-1:-1;;;1461:67:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1978:6:::1;::::0;1957:40:::1;::::0;1994:1:::1;::::0;-1:-1:-1;;;;;1978:6:5::1;::::0;1957:40:::1;::::0;1994:1;;1957:40:::1;2007:6;:19:::0;;-1:-1:-1;;;;;;2007:19:5::1;::::0;;1888:145::o;4278:317:7:-;4327:16;4352:14;4369:25;:16;:23;:25::i;:::-;4352:42;;4401:32;4450:6;4436:21;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4436:21:7;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;4436:21:7;-1:-1:-1;4401:56:7;-1:-1:-1;4469:9:7;4464:97;4488:6;4484:1;:10;4464:97;;;4531:22;:16;4551:1;4531:22;:19;:22;:::i;:::-;4510:15;4526:1;4510:18;;;;;;;;-1:-1:-1;;;;;4510:43:7;;;:18;;;;;;;;;;;:43;4496:3;;4464:97;;;-1:-1:-1;4574:15:7;-1:-1:-1;;4278:317:7;:::o;1265:77:5:-;1329:6;;-1:-1:-1;;;;;1329:6:5;1265:77;:::o;5376:148:7:-;-1:-1:-1;;;;;5493:17:7;;5440:7;5493:17;;;:8;:17;;;;;:24;;;;5463:25;;:55;;;:29;:55;:::i;2850:430::-;1024:12:4;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:4;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:4;;;;;1225:18;1213:4;1225:18;;;1170:80;2960:16:7::1;:14;:16::i;:::-;2985:30;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;2985:30:7::1;::::0;;::::1;::::0;;;::::1;::::0;:5:::1;::::0;:30:::1;:::i;:::-;-1:-1:-1::0;3022:22:7::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;3022:22:7::1;::::0;;::::1;::::0;;;::::1;::::0;:7:::1;::::0;:22:::1;:::i;:::-;-1:-1:-1::0;3051:12:7::1;:22:::0;;;3080:4:::1;:11:::0;;-1:-1:-1;;;;;3080:11:7;;::::1;-1:-1:-1::0;;;;;;3080:11:7;;::::1;::::0;::::1;::::0;;;3098:8:::1;:19:::0;;-1:-1:-1;;;;3098:19:7;;::::1;::::0;::::1;::::0;;;::::1;3124:15;::::0;;3080:4:::1;3148:14:::0;;;:8:::1;:14;::::0;;;;:37;;;3192:26:::1;:16;3087:4:::0;3192:26:::1;:20;:26;:::i;:::-;-1:-1:-1::0;3261:12:7::1;::::0;3232:42:::1;::::0;;;;;;-1:-1:-1;;;;;3232:42:7;::::1;::::0;3249:3:::1;::::0;-1:-1:-1;;;;;;;;;;;3232:42:7;;;;::::1;::::0;;::::1;1268:14:4::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:4;;;1264:55;2850:430:7;;;;:::o;3544:90::-;3621:7;3614:14;;;;;;;;-1:-1:-1;;3614:14:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3592:13;;3614:14;;3621:7;;3614:14;;3621:7;3614:14;;;;;;;;;;;;;;;;;;;;;;;;8740:317;8839:4;;-1:-1:-1;;;;;8839:4:7;8825:10;:18;8817:27;;12:1:-1;9;2:12;8817:27:7;-1:-1:-1;;;;;8875:16:7;;8851:21;8875:16;;;:8;:16;;;;;;;;8915:21;;;:16;;;:21;;;;;;;8947:10;;8943:74;;8984:13;;;;:25;;9002:6;8984:25;:17;:25;:::i;:::-;8968:13;;;:41;8943:74;-1:-1:-1;9030:21:7;;;;:16;;:21;;;;;9023:28;-1:-1:-1;8740:317:7:o;10375:228::-;10493:10;10471:4;10515:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;10515:41:7;;;;:31;;:41;;;;;;10471:4;;10484:95;;10505:8;;10515:63;;10561:16;10515:63;:45;:63;:::i;5716:118::-;-1:-1:-1;;;;;5804:17:7;5781:7;5804:17;;;:8;:17;;;;;:24;;;;5716:118::o;10730:406::-;10787:4;10819;10808:7;:15;;10800:24;;12:1:-1;9;2:12;10800:24:7;10864:7;10839:21;10849:10;10839:9;:21::i;:::-;:32;;10831:41;;12:1:-1;9;2:12;10831:41:7;10912:10;10879:21;10903:20;;;:8;:20;;;;;10947:14;;:27;;10966:7;10947:27;:18;:27;:::i;:::-;10930:44;;10997:13;;;;:26;;11015:7;10997:26;:17;:26;:::i;:::-;10981:13;;;:42;11033:44;;;;;;;;11062:4;;11042:10;;-1:-1:-1;;;;;;;;;;;11033:44:7;;;;;;;;11087:26;;;;;;;;11093:10;;11087:26;;;;;;;;;;-1:-1:-1;11127:4:7;;10730:406;-1:-1:-1;;10730:406:7:o;7158:159::-;7238:4;7251:42;7261:10;7273;7285:7;7251:9;:42::i;5068:118::-;-1:-1:-1;;;;;5156:17:7;5133:7;5156:17;;;:8;:17;;;;;:24;;;;5068:118::o;6678:253::-;6732:7;;;6773:133;6797:25;:16;:23;:25::i;:::-;6793:1;:29;6773:133;;;6847:51;6858:8;:32;6867:22;:16;6887:1;6867:22;:19;:22;:::i;:::-;-1:-1:-1;;;;;6858:32:7;;;;;;;;;;;;-1:-1:-1;6858:32:7;:39;;;6847:6;;:51;:10;:51;:::i;:::-;6838:60;-1:-1:-1;6824:3:7;;6773:133;;6033:149;-1:-1:-1;;;;;6139:16:7;;;6116:7;6139:16;;;:8;:16;;;;;;;;:37;;;;;;:27;;;;:37;;;;;;6033:149::o;8296:299::-;8410:4;;-1:-1:-1;;;;;8410:4:7;8396:10;:18;8388:27;;12:1:-1;9;2:12;8388:27:7;-1:-1:-1;;;;;8446:16:7;;8422:21;8446:16;;;:8;:16;;;;;8477:13;;;;:24;-1:-1:-1;8477:24:7;8469:33;;12:1:-1;9;2:12;8469:33:7;8509:21;;;;:16;;;:21;;;;;:31;;;8563:13;;;;:26;;8533:7;8563:26;:17;:26;:::i;:::-;8547:13;;;;:42;-1:-1:-1;;;8296:299:7:o;2182:240:5:-;1479:12;:10;:12::i;:::-;1469:6;;-1:-1:-1;;;;;1469:6:5;;;:22;;;1461:67;;;;;-1:-1:-1;;;1461:67:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2270:22:5;::::1;2262:73;;;;-1:-1:-1::0;;;2262:73:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2371:6;::::0;2350:38:::1;::::0;-1:-1:-1;;;;;2350:38:5;;::::1;::::0;2371:6:::1;::::0;2350:38:::1;::::0;2371:6:::1;::::0;2350:38:::1;2398:6;:17:::0;;-1:-1:-1;;;;;;2398:17:5::1;-1:-1:-1::0;;;;;2398:17:5;;;::::1;::::0;;;::::1;::::0;;2182:240::o;14497:266:7:-;-1:-1:-1;;;;;14589:22:7;;14581:31;;12:1:-1;9;2:12;14581:31:7;-1:-1:-1;;;;;14627:24:7;;14619:33;;12:1:-1;9;2:12;14619:33:7;-1:-1:-1;;;;;14661:16:7;;;;;;;:8;:16;;;;;;;;:37;;;;;;:27;;;;:37;;;;;;:47;;;14722:35;;;;;;;;;;;;;;;;;14497:266;;;:::o;930:104:0:-;1017:10;930:104;:::o;13537:709:7:-;-1:-1:-1;;;;;13633:23:7;;13625:32;;12:1:-1;9;2:12;13625:32:7;-1:-1:-1;;;;;13672:26:7;;13664:35;;12:1:-1;9;2:12;13664:35:7;-1:-1:-1;;;;;13732:17:7;;;13708:21;13732:17;;;:8;:17;;;;;;13783:20;;;;;;;13820:14;;:25;-1:-1:-1;13820:25:7;13812:34;;12:1:-1;9;2:12;13812:34:7;13859:37;:16;13885:10;13859:37;:25;:37;:::i;:::-;13855:201;;;13927:17;;:30;;13949:7;13927:30;:21;:30;:::i;:::-;13907:50;;13855:201;;;13980:27;;;14016:32;:16;14037:10;14016:32;:20;:32;:::i;:::-;;13855:201;14079:14;;:27;;14098:7;14079:27;:18;:27;:::i;:::-;14062:44;;14117:16;14125:7;14117;:16::i;:::-;14113:76;;14149:32;:16;14173:7;14149:32;:23;:32;:::i;:::-;;14113:76;14220:10;-1:-1:-1;;;;;14202:38:7;14211:7;-1:-1:-1;;;;;14202:38:7;-1:-1:-1;;;;;;;;;;;14232:7:7;14202:38;;;;;;;;;;;;;;;;;;13537:709;;;;;:::o;286:127:6:-;369:5;;;364:16;;;;356:50;;;;;-1:-1:-1;;;356:50:6;;;;;;;;;;;;-1:-1:-1;;;356:50:6;;;;;;;;;;;;;;154:126;237:5;;;232:16;;;;224:49;;;;;-1:-1:-1;;;224:49:6;;;;;;;;;;;;-1:-1:-1;;;224:49:6;;;;;;;;;;;;;;5605:115:1;5668:7;5694:19;5702:3;5694:7;:19::i;6052:147::-;6126:7;6168:22;6172:3;6184:5;6168:3;:22::i;:::-;6160:31;6052:147;-1:-1:-1;;;6052:147:1:o;419:140:6:-;471:6;497;;;:30;;-1:-1:-1;;512:5:6;;;526:1;521;512:5;521:1;507:15;;;;;:20;497:30;489:63;;;;;-1:-1:-1;;;489:63:6;;;;;;;;;;;;-1:-1:-1;;;489:63:6;;;;;;;;;;;;;;1409:498:4;1820:4;1864:17;1895:7;1409:498;:::o;861:126:5:-;1024:12:4;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:4;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:4;;;;;1225:18;1213:4;1225:18;;;1170:80;918:26:5::1;:24;:26::i;:::-;954;:24;:26::i;:::-;1268:14:4::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:4;;;1264:55;861:126:5;:::o;4831:141:1:-;4901:4;4924:41;4929:3;-1:-1:-1;;;;;4949:14:1;;4924:4;:41::i;5368:156::-;5448:4;5471:46;5481:3;-1:-1:-1;;;;;5501:14:1;;5471:9;:46::i;5140:147::-;5213:4;5236:44;5244:3;-1:-1:-1;;;;;5264:14:1;;5236:7;:44::i;3951:107::-;4033:18;;3951:107::o;4390:201::-;4484:18;;4457:7;;4484:26;-1:-1:-1;4476:73:1;;;;-1:-1:-1;;;4476:73:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4566:3;:11;;4578:5;4566:18;;;;;;;;;;;;;;;;4559:25;;4390:201;;;;:::o;857:66:0:-;1024:12:4;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:4;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:4;;;;;1225:18;1213:4;1225:18;;;1268:14;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:4;;;857:66:0;:::o;993:195:5:-;1024:12:4;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:4;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:4;;;;;1225:18;1213:4;1225:18;;;1170:80;1062:17:5::1;1082:12;:10;:12::i;:::-;1104:6;:18:::0;;-1:-1:-1;;;;;;1104:18:5::1;-1:-1:-1::0;;;;;1104:18:5;::::1;::::0;;::::1;::::0;;;1137:43:::1;::::0;1104:18;;-1:-1:-1;1104:18:5;-1:-1:-1;;1137:43:5::1;::::0;-1:-1:-1;;1137:43:5::1;1256:1:4;1268:14:::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:4;;;993:195:5;:::o;1578:404:1:-;1641:4;1662:21;1672:3;1677:5;1662:9;:21::i;:::-;1657:319;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;1699:11:1;:23;;;;;;;;;;;;;1879:18;;1857:19;;;:12;;;:19;;;;;;:40;;;;1911:11;;1657:319;-1:-1:-1;1960:5:1;1953:12;;3743:127;3816:4;3839:19;;;:12;;;;;:19;;;;;;:24;;;3743:127::o;2150:1512::-;2216:4;2353:19;;;:12;;;:19;;;;;;2387:15;;2383:1273;;2816:18;;-1:-1:-1;;2768:14:1;;;;2816:22;;;;2744:21;;2816:3;;:22;;3098;;;;;;;;;;;;;;3078:42;;3241:9;3212:3;:11;;3224:13;3212:26;;;;;;;;;;;;;;;;;;;:38;;;;3316:23;;;3358:1;3316:12;;;:23;;;;;;3342:17;;;3316:43;;3465:17;;3316:3;;3465:17;;;;;;;;;;;;;;;;;;;;;;3557:3;:12;;:19;3570:5;3557:19;;;;;;;;;;;3550:26;;;3598:4;3591:11;;;;;;;;2383:1273;3640:5;3633:12;;;;;346:14737:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;346:14737:7;;;-1:-1:-1;346:14737:7;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://47307f293d7be7f557f4d42e29fa7f3395a1dd8ed88fc8a7937da6a5b3cc1463
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.