ETH Price: $3,452.38 (+1.58%)

Token

Torro DAO Token (TORRO)
 

Overview

Max Total Supply

99,917.157759033361267756 TORRO

Holders

238

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
10 TORRO

Value
$0.00
0x0e3c7363decabfe24637caad9e6432c6ab750648
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Torro DAO Token token contract has migrated to 0x5fd4f778575876a23b18ffc4d440e64ea91c3407.

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

  // 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;
  bool private _paused;

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

  address private _whitelist;

  // 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;
    _paused = true;
    _whitelist = address(0x0);

    _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;
    _paused = false;
    _whitelist = address(0x0);

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

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

  // Modifiers.

  /// @notice Modifier to check that token functionality is not paused.
  modifier notPaused() {
    require(_paused == false || msg.sender == owner() || msg.sender == _whitelist);
    _;
  }

  // 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 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 notPaused 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 notPaused 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 notPaused returns (bool) {
    require(msg.sender == _dao);
    _approve(owner_, _dao, amount_);
    return true;
  }

  /// @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 notPaused 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 notPaused 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 notPaused 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 notPaused 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 notPaused returns (bool) {
    require(stakedOf(msg.sender) >= amount_);
    Holder storage holder = _holders[msg.sender];
    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_;
  }

  /// @notice Pauses token functionality.
  /// @param paused_ whether token functionality is paused.
  function setPause(bool paused_) public override onlyOwner {
    _paused = paused_;
  }

  /// @notice Sets whitelist address allowing it to make token operations when paused.
  /// @param whitelistAddress_ address to whitelist.
  function setWhitelistAddress(address whitelistAddress_) public override onlyOwner {
    _whitelist = whitelistAddress_;
  }
}

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 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 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 Pauses token functionality.
  /// @param paused_ whether token functionality is paused.
  function setPause(bool paused_) external;

  /// @notice Sets whitelist address allowing it to make token operations when paused.
  /// @param whitelistAddress_ address to whitelist.
  function setWhitelistAddress(address whitelistAddress_) 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":[],"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":"bool","name":"paused_","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whitelistAddress_","type":"address"}],"name":"setWhitelistAddress","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":"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"}]

60806040523480156200001157600080fd5b50620000256001600160e01b036200014d16565b60408051808201909152600f8082526e2a37b93937902220a7902a37b5b2b760891b60209092019182526200005d9160979162000490565b5060408051808201909152600580825264544f52524f60d81b60209092019182526200008c9160989162000490565b5069152d02c7e14af68000006099819055609a80546001600160a01b0319908116909155609b805460ff60a81b196001600160a81b0319909116600160a01b1716600160a81b179055609f80549091169055336000818152609c60209081526040909120929092556200010c91609d9190620019d062000226821b17901c565b50609954604080519182525133916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a362000532565b600054610100900460ff1680620001725750620001726001600160e01b036200024f16565b8062000181575060005460ff16155b620001be5760405162461bcd60e51b815260040180806020018281038252602e815260200180620023fe602e913960400191505060405180910390fd5b600054610100900460ff16158015620001ea576000805460ff1961ff0019909116610100171660011790555b620001fd6001600160e01b036200025616565b620002106001600160e01b036200030716565b801562000223576000805461ff00191690555b50565b600062000246836001600160a01b0384166001600160e01b036200041c16565b90505b92915050565b303b155b90565b600054610100900460ff16806200027b57506200027b6001600160e01b036200024f16565b806200028a575060005460ff16155b620002c75760405162461bcd60e51b815260040180806020018281038252602e815260200180620023fe602e913960400191505060405180910390fd5b600054610100900460ff1615801562000210576000805460ff1961ff001990911661010017166001179055801562000223576000805461ff001916905550565b600054610100900460ff16806200032c57506200032c6001600160e01b036200024f16565b806200033b575060005460ff16155b620003785760405162461bcd60e51b815260040180806020018281038252602e815260200180620023fe602e913960400191505060405180910390fd5b600054610100900460ff16158015620003a4576000805460ff1961ff0019909116610100171660011790555b6000620003b96001600160e01b036200047416565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801562000223576000805461ff001916905550565b60006200043383836001600160e01b036200047816565b6200046b5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000249565b50600062000249565b3390565b60009081526001919091016020526040902054151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620004d357805160ff191683800117855562000503565b8280016001018555821562000503579182015b8281111562000503578251825591602001919060010190620004e6565b506200051192915062000515565b5090565b6200025391905b808211156200051157600081556001016200051c565b611ebc80620005426000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063a457c2d7116100a2578063bedb86fb11610071578063bedb86fb146105bd578063d41ce4b1146105dc578063dd62ed3e146105e4578063f2fde38b14610612576101cf565b8063a457c2d714610522578063a694fc3a1461054e578063a9059cbb1461056b578063af500ba314610597576101cf565b8063912c2673116100de578063912c26731461049857806393be3bc6146104be57806395d89b41146104f4578063a224c745146104fc576101cf565b8063715018a6146104145780638188f71c1461041c5780638da5cb5b14610474576101cf565b8063313ce567116101715780634c5844e71161014b5780634c5844e71461039d578063506be6e4146103ba5780636b4ed21b146103e657806370a08231146103ee576101cf565b8063313ce56714610336578063395093511461035457806342966c6814610380576101cf565b806322614097116101ad57806322614097146102ab57806323b872dd146102db5780632e17de78146103115780632fa6e16b1461032e576101cf565b806306fdde03146101d4578063095ea7b31461025157806318160ddd14610291575b600080fd5b6101dc610638565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102165781810151838201526020016101fe565b50505050905090810190601f1680156102435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61027d6004803603604081101561026757600080fd5b506001600160a01b0381351690602001356106cf565b604080519115158252519081900360200190f35b610299610736565b60408051918252519081900360200190f35b6102d9600480360360408110156102c157600080fd5b506001600160a01b038135811691602001351661073c565b005b61027d600480360360608110156102f157600080fd5b506001600160a01b038135811691602081013590911690604001356107c2565b61027d6004803603602081101561032757600080fd5b50356108a2565b610299610a65565b61033e610aca565b6040805160ff9092168252519081900360200190f35b61027d6004803603604081101561036a57600080fd5b506001600160a01b038135169060200135610acf565b6102d96004803603602081101561039657600080fd5b5035610b5f565b6102d9600480360360208110156103b357600080fd5b5035610bd0565b61027d600480360360408110156103d057600080fd5b506001600160a01b038135169060200135610d71565b610299610df2565b6102996004803603602081101561040457600080fd5b50356001600160a01b0316610e03565b6102d9610e1e565b610424610ec0565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610460578181015183820152602001610448565b505050509050019250505060405180910390f35b61047c610f65565b604080516001600160a01b039092168252519081900360200190f35b610299600480360360208110156104ae57600080fd5b50356001600160a01b0316610f74565b6102d9600480360360608110156104d457600080fd5b506001600160a01b03813581169160208101359091169060400135610fa2565b6101dc611157565b6102d96004803603602081101561051257600080fd5b50356001600160a01b03166111b8565b61027d6004803603604081101561053857600080fd5b506001600160a01b038135169060200135611232565b61027d6004803603602081101561056457600080fd5b50356112c2565b61027d6004803603604081101561058157600080fd5b506001600160a01b0381351690602001356113df565b610299600480360360208110156105ad57600080fd5b50356001600160a01b031661143c565b6102d9600480360360208110156105d357600080fd5b5035151561145a565b6102996114d0565b610299600480360360408110156105fa57600080fd5b506001600160a01b0381358116916020013516611532565b6102d96004803603602081101561062857600080fd5b50356001600160a01b0316611561565b60978054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106c45780601f10610699576101008083540402835291602001916106c4565b820191906000526020600020905b8154815290600101906020018083116106a757829003601f168201915b505050505090505b90565b609b54600090600160a81b900460ff16158061070357506106ee610f65565b6001600160a01b0316336001600160a01b0316145b806107185750609f546001600160a01b031633145b61072157600080fd5b61072c33848461165a565b5060015b92915050565b60995490565b6107446116e6565b6065546001600160a01b03908116911614610794576040805162461bcd60e51b81526020600482018190526024820152600080516020611e19833981519152604482015290519081900360640190fd5b609a80546001600160a01b039384166001600160a01b031991821617909155609b8054929093169116179055565b609b54600090600160a81b900460ff1615806107f657506107e1610f65565b6001600160a01b0316336001600160a01b0316145b8061080b5750609f546001600160a01b031633145b61081457600080fd5b6001600160a01b0384166000908152609c6020908152604080832033845260020190915290205482111561084757600080fd5b6108528484846116ea565b6001600160a01b0384166000908152609c6020908152604080832033808552600290910190925290912054610898918691610893908663ffffffff6117f816565b61165a565b5060019392505050565b609b54600090600160a81b900460ff1615806108d657506108c1610f65565b6001600160a01b0316336001600160a01b0316145b806108eb5750609f546001600160a01b031633145b6108f457600080fd5b816108fe3361143c565b101561090957600080fd5b336000908152609c60205260408120609b54909190600160a01b900460ff16156109cf5760995460c8850490600090610948908363ffffffff6117f816565b905069021e19e0c9bab24000008110156109725760995461096f908263ffffffff6117f816565b91505b81156109c857610988868363ffffffff6117f816565b60995490935061099e908363ffffffff6117f816565b6099556040805183815290516000913391600080516020611e678339815191529181900360200190a35b50506109d2565b50825b60018201546109e7908563ffffffff6117f816565b600183015581546109fe908263ffffffff61184816565b825560408051828152905133913091600080516020611e678339815191529181900360200190a360408051858152905133917f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd919081900360200190a25060019392505050565b600080805b610a74609d611897565b811015610ac457610aba609c6000610a93609d8563ffffffff6118a216565b6001600160a01b03168152602081019190915260400160002054839063ffffffff61184816565b9150600101610a6a565b50905090565b601290565b609b54600090600160a81b900460ff161580610b035750610aee610f65565b6001600160a01b0316336001600160a01b0316145b80610b185750609f546001600160a01b031633145b610b2157600080fd5b336000818152609c602090815260408083206001600160a01b038816845260020190915290205461072c91908590610893908663ffffffff61184816565b336000908152609c602052604090208054821115610b7c57600080fd5b8054610b8e908363ffffffff6117f816565b8155609954610ba3908363ffffffff6117f816565b6099556040805183815290516000913391600080516020611e678339815191529181900360200190a35050565b609a546001600160a01b0316331480610c5b5750609b546040805162fcec5360e51b815233600482015290516001600160a01b0390921691631f9d8a6091602480820192602092909190829003018186803b158015610c2e57600080fd5b505afa158015610c42573d6000803e3d6000fd5b505050506040513d6020811015610c5857600080fd5b50515b610c6457600080fd5b60005b610c71609d611897565b811015610d44576000610c8b609d8363ffffffff6118a216565b90506000610c988261143c565b90508015610d3a576000610caa6114d0565b610cba838763ffffffff6118b516565b81610cc157fe5b0490508015610d3857609b546040805163453d03f360e01b81526001600160a01b038681166004830152602482018590529151919092169163453d03f391604480830192600092919082900301818387803b158015610d1f57600080fd5b505af1158015610d33573d6000803e3d6000fd5b505050505b505b5050600101610c67565b506040517fcac873607e8a6b1088c9430235e31dc744c15fe900a64c030316066bb06f0ddd90600090a150565b609b54600090600160a81b900460ff161580610da55750610d90610f65565b6001600160a01b0316336001600160a01b0316145b80610dba5750609f546001600160a01b031633145b610dc357600080fd5b609a546001600160a01b03163314610dda57600080fd5b609a5461072c9084906001600160a01b03168461165a565b6000610dfe609d611897565b905090565b6001600160a01b03166000908152609c602052604090205490565b610e266116e6565b6065546001600160a01b03908116911614610e76576040805162461bcd60e51b81526020600482018190526024820152600080516020611e19833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60606000610ece609d611897565b905060608167ffffffffffffffff81118015610ee957600080fd5b50604051908082528060200260200182016040528015610f13578160200160208202803683370190505b50905060005b82811015610f5e57610f32609d8263ffffffff6118a216565b828281518110610f3e57fe5b6001600160a01b0390921660209283029190910190910152600101610f19565b5091505090565b6065546001600160a01b031690565b6001600160a01b0381166000908152609c60205260408120600181015490546107309163ffffffff61184816565b600054610100900460ff1680610fbb5750610fbb611918565b80610fc9575060005460ff16155b6110045760405162461bcd60e51b815260040180806020018281038252602e815260200180611e39602e913960400191505060405180910390fd5b600054610100900460ff1615801561102f576000805460ff1961ff0019909116610100171660011790555b61103761191e565b604080518082019091526014808252732a37b93937902220a7902837b7b6102a37b5b2b760611b602090920191825261107291609791611d38565b5060408051808201909152600a808252691513d49493d7d413d3d360b21b60209092019182526110a491609891611d38565b506099829055609a80546001600160a01b038087166001600160a01b03199283168117909355609b805461ffff60a01b1992881690841617919091169055609f805490911690556000908152609c6020526040902082905561110d609d8563ffffffff6119d016565b5060995460408051918252516001600160a01b03861691600091600080516020611e678339815191529181900360200190a38015611151576000805461ff00191690555b50505050565b60988054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106c45780601f10610699576101008083540402835291602001916106c4565b6111c06116e6565b6065546001600160a01b03908116911614611210576040805162461bcd60e51b81526020600482018190526024820152600080516020611e19833981519152604482015290519081900360640190fd5b609f80546001600160a01b0319166001600160a01b0392909216919091179055565b609b54600090600160a81b900460ff1615806112665750611251610f65565b6001600160a01b0316336001600160a01b0316145b8061127b5750609f546001600160a01b031633145b61128457600080fd5b336000818152609c602090815260408083206001600160a01b038816845260020190915290205461072c91908590610893908663ffffffff6117f816565b609b54600090600160a81b900460ff1615806112f657506112e1610f65565b6001600160a01b0316336001600160a01b0316145b8061130b5750609f546001600160a01b031633145b61131457600080fd5b670de0b6b3a764000082101561132957600080fd5b8161133333610e03565b101561133e57600080fd5b336000908152609c60205260409020805461135f908463ffffffff6117f816565b81556001810154611376908463ffffffff61184816565b600182015560408051848152905130913391600080516020611e678339815191529181900360200190a360408051848152905133917febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a919081900360200190a250600192915050565b609b54600090600160a81b900460ff16158061141357506113fe610f65565b6001600160a01b0316336001600160a01b0316145b806114285750609f546001600160a01b031633145b61143157600080fd5b61072c3384846116ea565b6001600160a01b03166000908152609c602052604090206001015490565b6114626116e6565b6065546001600160a01b039081169116146114b2576040805162461bcd60e51b81526020600482018190526024820152600080516020611e19833981519152604482015290519081900360640190fd5b609b8054911515600160a81b0260ff60a81b19909216919091179055565b600080805b6114df609d611897565b811015610ac457611528609c60006114fe609d8563ffffffff6118a216565b6001600160a01b03168152602081019190915260400160002060010154839063ffffffff61184816565b91506001016114d5565b6001600160a01b039182166000908152609c602090815260408083209390941682526002909201909152205490565b6115696116e6565b6065546001600160a01b039081169116146115b9576040805162461bcd60e51b81526020600482018190526024820152600080516020611e19833981519152604482015290519081900360640190fd5b6001600160a01b0381166115fe5760405162461bcd60e51b8152600401808060200182810382526026815260200180611df36026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661166d57600080fd5b6001600160a01b03821661168057600080fd5b6001600160a01b038084166000818152609c602090815260408083209487168084526002909501825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b3390565b6001600160a01b0383166116fd57600080fd5b6001600160a01b03821661171057600080fd5b6001600160a01b038084166000908152609c602052604080822092851682529020815483111561173f57600080fd5b611750609d8563ffffffff6119e516565b1561176e578054611767908463ffffffff61184816565b8155611784565b828155611782609d8563ffffffff6119d016565b505b8154611796908463ffffffff6117f816565b82556117a185610f74565b6117b8576117b6609d8663ffffffff6119fa16565b505b836001600160a01b0316856001600160a01b0316600080516020611e67833981519152856040518082815260200191505060405180910390a35050505050565b80820382811115610730576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b80820182811015610730576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b600061073082611a0f565b60006118ae8383611a13565b9392505050565b60008115806118d0575050808202828282816118cd57fe5b04145b610730576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b303b1590565b600054610100900460ff16806119375750611937611918565b80611945575060005460ff16155b6119805760405162461bcd60e51b815260040180806020018281038252602e815260200180611e39602e913960400191505060405180910390fd5b600054610100900460ff161580156119ab576000805460ff1961ff0019909116610100171660011790555b6119b3611a77565b6119bb611b17565b80156119cd576000805461ff00191690555b50565b60006118ae836001600160a01b038416611c10565b60006118ae836001600160a01b038416611c5a565b60006118ae836001600160a01b038416611c72565b5490565b81546000908210611a555760405162461bcd60e51b8152600401808060200182810382526022815260200180611dd16022913960400191505060405180910390fd5b826000018281548110611a6457fe5b9060005260206000200154905092915050565b600054610100900460ff1680611a905750611a90611918565b80611a9e575060005460ff16155b611ad95760405162461bcd60e51b815260040180806020018281038252602e815260200180611e39602e913960400191505060405180910390fd5b600054610100900460ff161580156119bb576000805460ff1961ff00199091166101001716600117905580156119cd576000805461ff001916905550565b600054610100900460ff1680611b305750611b30611918565b80611b3e575060005460ff16155b611b795760405162461bcd60e51b815260040180806020018281038252602e815260200180611e39602e913960400191505060405180910390fd5b600054610100900460ff16158015611ba4576000805460ff1961ff0019909116610100171660011790555b6000611bae6116e6565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156119cd576000805461ff001916905550565b6000611c1c8383611c5a565b611c5257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610730565b506000610730565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611d2e5783546000198083019190810190600090879083908110611ca557fe5b9060005260206000200154905080876000018481548110611cc257fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611cf257fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610730565b6000915050610730565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d7957805160ff1916838001178555611da6565b82800160010185558215611da6579182015b82811115611da6578251825591602001919060010190611d8b565b50611db2929150611db6565b5090565b6106cc91905b80821115611db25760008155600101611dbc56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d248c04cc12d31ad13ff25ca8419ba112caddf590ea5bc60860623f6e7b3deb364736f6c63430006060033436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063a457c2d7116100a2578063bedb86fb11610071578063bedb86fb146105bd578063d41ce4b1146105dc578063dd62ed3e146105e4578063f2fde38b14610612576101cf565b8063a457c2d714610522578063a694fc3a1461054e578063a9059cbb1461056b578063af500ba314610597576101cf565b8063912c2673116100de578063912c26731461049857806393be3bc6146104be57806395d89b41146104f4578063a224c745146104fc576101cf565b8063715018a6146104145780638188f71c1461041c5780638da5cb5b14610474576101cf565b8063313ce567116101715780634c5844e71161014b5780634c5844e71461039d578063506be6e4146103ba5780636b4ed21b146103e657806370a08231146103ee576101cf565b8063313ce56714610336578063395093511461035457806342966c6814610380576101cf565b806322614097116101ad57806322614097146102ab57806323b872dd146102db5780632e17de78146103115780632fa6e16b1461032e576101cf565b806306fdde03146101d4578063095ea7b31461025157806318160ddd14610291575b600080fd5b6101dc610638565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102165781810151838201526020016101fe565b50505050905090810190601f1680156102435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61027d6004803603604081101561026757600080fd5b506001600160a01b0381351690602001356106cf565b604080519115158252519081900360200190f35b610299610736565b60408051918252519081900360200190f35b6102d9600480360360408110156102c157600080fd5b506001600160a01b038135811691602001351661073c565b005b61027d600480360360608110156102f157600080fd5b506001600160a01b038135811691602081013590911690604001356107c2565b61027d6004803603602081101561032757600080fd5b50356108a2565b610299610a65565b61033e610aca565b6040805160ff9092168252519081900360200190f35b61027d6004803603604081101561036a57600080fd5b506001600160a01b038135169060200135610acf565b6102d96004803603602081101561039657600080fd5b5035610b5f565b6102d9600480360360208110156103b357600080fd5b5035610bd0565b61027d600480360360408110156103d057600080fd5b506001600160a01b038135169060200135610d71565b610299610df2565b6102996004803603602081101561040457600080fd5b50356001600160a01b0316610e03565b6102d9610e1e565b610424610ec0565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610460578181015183820152602001610448565b505050509050019250505060405180910390f35b61047c610f65565b604080516001600160a01b039092168252519081900360200190f35b610299600480360360208110156104ae57600080fd5b50356001600160a01b0316610f74565b6102d9600480360360608110156104d457600080fd5b506001600160a01b03813581169160208101359091169060400135610fa2565b6101dc611157565b6102d96004803603602081101561051257600080fd5b50356001600160a01b03166111b8565b61027d6004803603604081101561053857600080fd5b506001600160a01b038135169060200135611232565b61027d6004803603602081101561056457600080fd5b50356112c2565b61027d6004803603604081101561058157600080fd5b506001600160a01b0381351690602001356113df565b610299600480360360208110156105ad57600080fd5b50356001600160a01b031661143c565b6102d9600480360360208110156105d357600080fd5b5035151561145a565b6102996114d0565b610299600480360360408110156105fa57600080fd5b506001600160a01b0381358116916020013516611532565b6102d96004803603602081101561062857600080fd5b50356001600160a01b0316611561565b60978054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106c45780601f10610699576101008083540402835291602001916106c4565b820191906000526020600020905b8154815290600101906020018083116106a757829003601f168201915b505050505090505b90565b609b54600090600160a81b900460ff16158061070357506106ee610f65565b6001600160a01b0316336001600160a01b0316145b806107185750609f546001600160a01b031633145b61072157600080fd5b61072c33848461165a565b5060015b92915050565b60995490565b6107446116e6565b6065546001600160a01b03908116911614610794576040805162461bcd60e51b81526020600482018190526024820152600080516020611e19833981519152604482015290519081900360640190fd5b609a80546001600160a01b039384166001600160a01b031991821617909155609b8054929093169116179055565b609b54600090600160a81b900460ff1615806107f657506107e1610f65565b6001600160a01b0316336001600160a01b0316145b8061080b5750609f546001600160a01b031633145b61081457600080fd5b6001600160a01b0384166000908152609c6020908152604080832033845260020190915290205482111561084757600080fd5b6108528484846116ea565b6001600160a01b0384166000908152609c6020908152604080832033808552600290910190925290912054610898918691610893908663ffffffff6117f816565b61165a565b5060019392505050565b609b54600090600160a81b900460ff1615806108d657506108c1610f65565b6001600160a01b0316336001600160a01b0316145b806108eb5750609f546001600160a01b031633145b6108f457600080fd5b816108fe3361143c565b101561090957600080fd5b336000908152609c60205260408120609b54909190600160a01b900460ff16156109cf5760995460c8850490600090610948908363ffffffff6117f816565b905069021e19e0c9bab24000008110156109725760995461096f908263ffffffff6117f816565b91505b81156109c857610988868363ffffffff6117f816565b60995490935061099e908363ffffffff6117f816565b6099556040805183815290516000913391600080516020611e678339815191529181900360200190a35b50506109d2565b50825b60018201546109e7908563ffffffff6117f816565b600183015581546109fe908263ffffffff61184816565b825560408051828152905133913091600080516020611e678339815191529181900360200190a360408051858152905133917f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd919081900360200190a25060019392505050565b600080805b610a74609d611897565b811015610ac457610aba609c6000610a93609d8563ffffffff6118a216565b6001600160a01b03168152602081019190915260400160002054839063ffffffff61184816565b9150600101610a6a565b50905090565b601290565b609b54600090600160a81b900460ff161580610b035750610aee610f65565b6001600160a01b0316336001600160a01b0316145b80610b185750609f546001600160a01b031633145b610b2157600080fd5b336000818152609c602090815260408083206001600160a01b038816845260020190915290205461072c91908590610893908663ffffffff61184816565b336000908152609c602052604090208054821115610b7c57600080fd5b8054610b8e908363ffffffff6117f816565b8155609954610ba3908363ffffffff6117f816565b6099556040805183815290516000913391600080516020611e678339815191529181900360200190a35050565b609a546001600160a01b0316331480610c5b5750609b546040805162fcec5360e51b815233600482015290516001600160a01b0390921691631f9d8a6091602480820192602092909190829003018186803b158015610c2e57600080fd5b505afa158015610c42573d6000803e3d6000fd5b505050506040513d6020811015610c5857600080fd5b50515b610c6457600080fd5b60005b610c71609d611897565b811015610d44576000610c8b609d8363ffffffff6118a216565b90506000610c988261143c565b90508015610d3a576000610caa6114d0565b610cba838763ffffffff6118b516565b81610cc157fe5b0490508015610d3857609b546040805163453d03f360e01b81526001600160a01b038681166004830152602482018590529151919092169163453d03f391604480830192600092919082900301818387803b158015610d1f57600080fd5b505af1158015610d33573d6000803e3d6000fd5b505050505b505b5050600101610c67565b506040517fcac873607e8a6b1088c9430235e31dc744c15fe900a64c030316066bb06f0ddd90600090a150565b609b54600090600160a81b900460ff161580610da55750610d90610f65565b6001600160a01b0316336001600160a01b0316145b80610dba5750609f546001600160a01b031633145b610dc357600080fd5b609a546001600160a01b03163314610dda57600080fd5b609a5461072c9084906001600160a01b03168461165a565b6000610dfe609d611897565b905090565b6001600160a01b03166000908152609c602052604090205490565b610e266116e6565b6065546001600160a01b03908116911614610e76576040805162461bcd60e51b81526020600482018190526024820152600080516020611e19833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60606000610ece609d611897565b905060608167ffffffffffffffff81118015610ee957600080fd5b50604051908082528060200260200182016040528015610f13578160200160208202803683370190505b50905060005b82811015610f5e57610f32609d8263ffffffff6118a216565b828281518110610f3e57fe5b6001600160a01b0390921660209283029190910190910152600101610f19565b5091505090565b6065546001600160a01b031690565b6001600160a01b0381166000908152609c60205260408120600181015490546107309163ffffffff61184816565b600054610100900460ff1680610fbb5750610fbb611918565b80610fc9575060005460ff16155b6110045760405162461bcd60e51b815260040180806020018281038252602e815260200180611e39602e913960400191505060405180910390fd5b600054610100900460ff1615801561102f576000805460ff1961ff0019909116610100171660011790555b61103761191e565b604080518082019091526014808252732a37b93937902220a7902837b7b6102a37b5b2b760611b602090920191825261107291609791611d38565b5060408051808201909152600a808252691513d49493d7d413d3d360b21b60209092019182526110a491609891611d38565b506099829055609a80546001600160a01b038087166001600160a01b03199283168117909355609b805461ffff60a01b1992881690841617919091169055609f805490911690556000908152609c6020526040902082905561110d609d8563ffffffff6119d016565b5060995460408051918252516001600160a01b03861691600091600080516020611e678339815191529181900360200190a38015611151576000805461ff00191690555b50505050565b60988054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106c45780601f10610699576101008083540402835291602001916106c4565b6111c06116e6565b6065546001600160a01b03908116911614611210576040805162461bcd60e51b81526020600482018190526024820152600080516020611e19833981519152604482015290519081900360640190fd5b609f80546001600160a01b0319166001600160a01b0392909216919091179055565b609b54600090600160a81b900460ff1615806112665750611251610f65565b6001600160a01b0316336001600160a01b0316145b8061127b5750609f546001600160a01b031633145b61128457600080fd5b336000818152609c602090815260408083206001600160a01b038816845260020190915290205461072c91908590610893908663ffffffff6117f816565b609b54600090600160a81b900460ff1615806112f657506112e1610f65565b6001600160a01b0316336001600160a01b0316145b8061130b5750609f546001600160a01b031633145b61131457600080fd5b670de0b6b3a764000082101561132957600080fd5b8161133333610e03565b101561133e57600080fd5b336000908152609c60205260409020805461135f908463ffffffff6117f816565b81556001810154611376908463ffffffff61184816565b600182015560408051848152905130913391600080516020611e678339815191529181900360200190a360408051848152905133917febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a919081900360200190a250600192915050565b609b54600090600160a81b900460ff16158061141357506113fe610f65565b6001600160a01b0316336001600160a01b0316145b806114285750609f546001600160a01b031633145b61143157600080fd5b61072c3384846116ea565b6001600160a01b03166000908152609c602052604090206001015490565b6114626116e6565b6065546001600160a01b039081169116146114b2576040805162461bcd60e51b81526020600482018190526024820152600080516020611e19833981519152604482015290519081900360640190fd5b609b8054911515600160a81b0260ff60a81b19909216919091179055565b600080805b6114df609d611897565b811015610ac457611528609c60006114fe609d8563ffffffff6118a216565b6001600160a01b03168152602081019190915260400160002060010154839063ffffffff61184816565b91506001016114d5565b6001600160a01b039182166000908152609c602090815260408083209390941682526002909201909152205490565b6115696116e6565b6065546001600160a01b039081169116146115b9576040805162461bcd60e51b81526020600482018190526024820152600080516020611e19833981519152604482015290519081900360640190fd5b6001600160a01b0381166115fe5760405162461bcd60e51b8152600401808060200182810382526026815260200180611df36026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661166d57600080fd5b6001600160a01b03821661168057600080fd5b6001600160a01b038084166000818152609c602090815260408083209487168084526002909501825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b3390565b6001600160a01b0383166116fd57600080fd5b6001600160a01b03821661171057600080fd5b6001600160a01b038084166000908152609c602052604080822092851682529020815483111561173f57600080fd5b611750609d8563ffffffff6119e516565b1561176e578054611767908463ffffffff61184816565b8155611784565b828155611782609d8563ffffffff6119d016565b505b8154611796908463ffffffff6117f816565b82556117a185610f74565b6117b8576117b6609d8663ffffffff6119fa16565b505b836001600160a01b0316856001600160a01b0316600080516020611e67833981519152856040518082815260200191505060405180910390a35050505050565b80820382811115610730576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b80820182811015610730576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b600061073082611a0f565b60006118ae8383611a13565b9392505050565b60008115806118d0575050808202828282816118cd57fe5b04145b610730576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b303b1590565b600054610100900460ff16806119375750611937611918565b80611945575060005460ff16155b6119805760405162461bcd60e51b815260040180806020018281038252602e815260200180611e39602e913960400191505060405180910390fd5b600054610100900460ff161580156119ab576000805460ff1961ff0019909116610100171660011790555b6119b3611a77565b6119bb611b17565b80156119cd576000805461ff00191690555b50565b60006118ae836001600160a01b038416611c10565b60006118ae836001600160a01b038416611c5a565b60006118ae836001600160a01b038416611c72565b5490565b81546000908210611a555760405162461bcd60e51b8152600401808060200182810382526022815260200180611dd16022913960400191505060405180910390fd5b826000018281548110611a6457fe5b9060005260206000200154905092915050565b600054610100900460ff1680611a905750611a90611918565b80611a9e575060005460ff16155b611ad95760405162461bcd60e51b815260040180806020018281038252602e815260200180611e39602e913960400191505060405180910390fd5b600054610100900460ff161580156119bb576000805460ff1961ff00199091166101001716600117905580156119cd576000805461ff001916905550565b600054610100900460ff1680611b305750611b30611918565b80611b3e575060005460ff16155b611b795760405162461bcd60e51b815260040180806020018281038252602e815260200180611e39602e913960400191505060405180910390fd5b600054610100900460ff16158015611ba4576000805460ff1961ff0019909116610100171660011790555b6000611bae6116e6565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156119cd576000805461ff001916905550565b6000611c1c8383611c5a565b611c5257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610730565b506000610730565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611d2e5783546000198083019190810190600090879083908110611ca557fe5b9060005260206000200154905080876000018481548110611cc257fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611cf257fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610730565b6000915050610730565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d7957805160ff1916838001178555611da6565b82800160010185558215611da6579182015b82811115611da6578251825591602001919060010190611d8b565b50611db2929150611db6565b5090565b6106cc91905b80821115611db25760008155600101611dbc56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d248c04cc12d31ad13ff25ca8419ba112caddf590ea5bc60860623f6e7b3deb364736f6c63430006060033

Deployed Bytecode Sourcemap

346:14285:7:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;346:14285:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;3694: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;3694:86:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7585:163;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7585:163:7;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4210:91;;;:::i;:::-;;;;;;;;;;;;;;;;14017:140;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14017:140:7;;;;;;;;;;:::i;:::-;;8466:340;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;8466:340:7;;;;;;;;;;;;;;;;;:::i;10396:842::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10396:842:7;;:::i;6311:256::-;;;:::i;4032:86::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9027:228;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;9027:228:7;;;;;;;;:::i;12065:300::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12065:300:7;;:::i;11378:586::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11378:586:7;;:::i;7955:190::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7955:190:7;;;;;;;;:::i;4394:108::-;;;:::i;5092:120::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5092:120:7;-1:-1:-1;;;;;5092:120:7;;:::i;1888:145:5:-;;;:::i;4594: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;4594:317:7;;;;;;;;;;;;;;;;;1265:77:5;;;:::i;:::-;;;;-1:-1:-1;;;;;1265:77:5;;;;;;;;;;;;;;5692:148:7;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5692:148:7;-1:-1:-1;;;;;5692:148:7;;:::i;2894:484::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;2894:484:7;;;;;;;;;;;;;;;;;:::i;3860:90::-;;;:::i;14503:125::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14503:125:7;-1:-1:-1;;;;;14503:125:7;;:::i;9483:238::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;9483:238:7;;;;;;;;:::i;9848:416::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9848:416:7;;:::i;7164:169::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7164:169:7;;;;;;;;:::i;5384:118::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5384:118:7;-1:-1:-1;;;;;5384:118:7;;:::i;14267:88::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14267:88:7;;;;:::i;6684:253::-;;;:::i;6039:149::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;6039:149: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;3694:86:7:-;3769:5;3762:12;;;;;;;;-1:-1:-1;;3762:12:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3740:13;;3762:12;;3769:5;;3762:12;;3769:5;3762:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3694:86;;:::o;7585:163::-;3512:7;;7672:4;;-1:-1:-1;;;3512:7:7;;;;:16;;:41;;;3546:7;:5;:7::i;:::-;-1:-1:-1;;;;;3532:21:7;:10;-1:-1:-1;;;;;3532:21:7;;3512:41;:69;;;-1:-1:-1;3571:10:7;;-1:-1:-1;;;;;3571:10:7;3557;:24;3512:69;3504:78;;12:1:-1;9;2:12;3504:78:7;7685:39:::1;7694:10;7706:8;7716:7;7685:8;:39::i;:::-;-1:-1:-1::0;7738:4:7::1;3589:1;7585:163:::0;;;;:::o;4210:91::-;4284:12;;4210:91;:::o;14017:140::-;1479:12:5;:10;:12::i;:::-;1469:6;;-1:-1:-1;;;;;1469:6:5;;;:22;;;1461:67;;;;;-1:-1:-1;;;1461:67:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1461:67:5;;;;;;;;;;;;;;;14114:4:7::1;:11:::0;;-1:-1:-1;;;;;14114:11:7;;::::1;-1:-1:-1::0;;;;;;14114:11:7;;::::1;;::::0;;;14132:8:::1;:19:::0;;;;;::::1;::::0;::::1;;::::0;;14017:140::o;8466:340::-;3512:7;;8576:4;;-1:-1:-1;;;3512:7:7;;;;:16;;:41;;;3546:7;:5;:7::i;:::-;-1:-1:-1;;;;;3532:21:7;:10;-1:-1:-1;;;;;3532:21:7;;3512:41;:69;;;-1:-1:-1;3571:10:7;;-1:-1:-1;;;;;3571:10:7;3557;:24;3512:69;3504:78;;12:1:-1;9;2:12;3504:78:7;-1:-1:-1;;;;;8597:16:7;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;8625:10:::1;8597:39:::0;;:27:::1;;:39:::0;;;;;;:50;-1:-1:-1;8597:50:7::1;8589:59;;12:1:-1;9::::0;2:12:::1;8589:59:7;8655:38;8665:6;8673:10;8685:7;8655:9;:38::i;:::-;-1:-1:-1::0;;;;;8729:16:7;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;8717:10:::1;8729:39:::0;;;:27:::1;::::0;;::::1;:39:::0;;;;;;;8700:82:::1;::::0;8709:6;;8729:52:::1;::::0;8773:7;8729:52:::1;:43;:52;:::i;:::-;8700:8;:82::i;:::-;-1:-1:-1::0;8796:4:7::1;8466:340:::0;;;;;:::o;10396:842::-;3512:7;;10465:4;;-1:-1:-1;;;3512:7:7;;;;:16;;:41;;;3546:7;:5;:7::i;:::-;-1:-1:-1;;;;;3532:21:7;:10;-1:-1:-1;;;;;3532:21:7;;3512:41;:69;;;-1:-1:-1;3571:10:7;;-1:-1:-1;;;;;3571:10:7;3557;:24;3512:69;3504:78;;12:1:-1;9;2:12;3504:78:7;10510:7:::1;10486:20;10495:10;10486:8;:20::i;:::-;:31;;10478:40;;12:1:-1;9::::0;2:12:::1;10478:40:7;10558:10;10525:21;10549:20:::0;;;:8:::1;:20;::::0;;;;10601:7:::1;::::0;10549:20;;10525:21;-1:-1:-1;;;10601:7:7;::::1;;;10597:424;;;10682:12;::::0;10644:3:::1;10634:13:::0;::::1;::::0;10619:12:::1;::::0;10682:22:::1;::::0;10634:13;10682:22:::1;:16;:22;:::i;:::-;10656:48;;10735:4;10717:15;:22;10713:89;;;10759:12;::::0;:33:::1;::::0;10776:15;10759:33:::1;:16;:33;:::i;:::-;10752:40;;10713:89;10814:8:::0;;10810:165:::1;;10844:17;:7:::0;10856:4;10844:17:::1;:11;:17;:::i;:::-;10887:12;::::0;10835:26;;-1:-1:-1;10887:22:7::1;::::0;10904:4;10887:22:::1;:16;:22;:::i;:::-;10872:12;:37:::0;10925:40:::1;::::0;;;;;;;10954:3:::1;::::0;10934:10:::1;::::0;-1:-1:-1;;;;;;;;;;;10925:40:7;;;;::::1;::::0;;::::1;10810:165;10597:424;;;;;-1:-1:-1::0;11006:7:7;10597:424:::1;11043:13;::::0;::::1;::::0;:26:::1;::::0;11061:7;11043:26:::1;:17;:26;:::i;:::-;11027:13;::::0;::::1;:42:::0;11093:14;;:26:::1;::::0;11112:6;11093:26:::1;:18;:26;:::i;:::-;11076:43:::0;;11131::::1;::::0;;;;;;;11155:10:::1;::::0;11148:4:::1;::::0;-1:-1:-1;;;;;;;;;;;11131:43:7;;;;::::1;::::0;;::::1;11186:28;::::0;;;;;;;11194:10:::1;::::0;11186:28:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;11228:4:7::1;::::0;10396:842;-1:-1:-1;;;10396:842:7:o;6311:256::-;6367:7;;;6408:134;6432:25;:16;:23;:25::i;:::-;6428:1;:29;6408:134;;;6482:52;6493:8;:32;6502:22;:16;6522:1;6502:22;:19;:22;:::i;:::-;-1:-1:-1;;;;;6493:32:7;;;;;;;;;;;;-1:-1:-1;6493:32:7;:40;6482:6;;:52;:10;:52;:::i;:::-;6473:61;-1:-1:-1;6459:3:7;;6408:134;;;-1:-1:-1;6555:6:7;-1:-1:-1;6311:256:7;:::o;4032:86::-;725:2;4032:86;:::o;9027:228::-;3512:7;;9128:4;;-1:-1:-1;;;3512:7:7;;;;:16;;:41;;;3546:7;:5;:7::i;:::-;-1:-1:-1;;;;;3532:21:7;:10;-1:-1:-1;;;;;3532:21:7;;3512:41;:69;;;-1:-1:-1;3571:10:7;;-1:-1:-1;;;;;3571:10:7;3557;:24;3512:69;3504:78;;12:1:-1;9;2:12;3504:78:7;9150:10:::1;9172:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;9172:41:7;::::1;::::0;;:31:::1;;:41:::0;;;;;;9141:90:::1;::::0;9150:10;9162:8;;9172:58:::1;::::0;9218:11;9172:58:::1;:45;:58;:::i;12065:300::-:0;12152:10;12119:21;12143:20;;;:8;:20;;;;;12178:14;;:25;-1:-1:-1;12178:25:7;12170:34;;12:1:-1;9;2:12;12170:34:7;12228:14;;:27;;12247:7;12228:27;:18;:27;:::i;:::-;12211:44;;12277:12;;:25;;12294:7;12277:25;:16;:25;:::i;:::-;12262:12;:40;12316:43;;;;;;;;12345:3;;12325:10;;-1:-1:-1;;;;;;;;;;;12316:43:7;;;;;;;;12065:300;;:::o;11378:586::-;11461:4;;-1:-1:-1;;;;;11461:4:7;11447:10;:18;;:63;;-1:-1:-1;11483:8:7;;11469:41;;;-1:-1:-1;;;11469:41:7;;11499:10;11469:41;;;;;;-1:-1:-1;;;;;11483:8:7;;;;11469:29;;:41;;;;;;;;;;;;;;;11483:8;11469:41;;;2:2:-1;;;;27:1;24;17:12;2:2;11469:41:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11469:41:7;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11469:41:7;11447:63;11439:72;;12:1:-1;9;2:12;11439:72:7;11523:9;11518:354;11542:25;:16;:23;:25::i;:::-;11538:1;:29;11518:354;;;11583:14;11600:22;:16;11620:1;11600:22;:19;:22;:::i;:::-;11583:39;;11631:14;11648:16;11657:6;11648:8;:16::i;:::-;11631:33;-1:-1:-1;11677:10:7;;11673:192;;11700:14;11739;:12;:14::i;:::-;11717:19;:6;11728:7;11717:19;:10;:19;:::i;:::-;:36;;;;;;;-1:-1:-1;11768:10:7;;11764:92;;11807:8;;11793:51;;;-1:-1:-1;;;11793:51:7;;-1:-1:-1;;;;;11793:51:7;;;;;;;;;;;;;;;11807:8;;;;;11793:35;;:51;;;;;11807:8;;11793:51;;;;;;;11807:8;;11793:51;;;2:2:-1;;;;27:1;24;17:12;2:2;11793:51:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11793:51:7;;;;11764:92;11673:192;;-1:-1:-1;;11569:3:7;;11518:354;;;-1:-1:-1;11945:13:7;;;;;;;11378:586;:::o;7955:190::-;3512:7;;8043:4;;-1:-1:-1;;;3512:7:7;;;;:16;;:41;;;3546:7;:5;:7::i;:::-;-1:-1:-1;;;;;3532:21:7;:10;-1:-1:-1;;;;;3532:21:7;;3512:41;:69;;;-1:-1:-1;3571:10:7;;-1:-1:-1;;;;;3571:10:7;3557;:24;3512:69;3504:78;;12:1:-1;9;2:12;3504:78:7;8078:4:::1;::::0;-1:-1:-1;;;;;8078:4:7::1;8064:10;:18;8056:27;;12:1:-1;9::::0;2:12:::1;8056:27:7;8107:4;::::0;8090:31:::1;::::0;8099:6;;-1:-1:-1;;;;;8107:4:7::1;8113:7:::0;8090:8:::1;:31::i;4394:108::-:0;4448:7;4471:25;:16;:23;:25::i;:::-;4464:32;;4394:108;:::o;5092:120::-;-1:-1:-1;;;;;5181:17:7;5158:7;5181:17;;;:8;:17;;;;;:25;;5092: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;;;;;;;;;;;;;-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;4594:317:7:-;4643:16;4668:14;4685:25;:16;:23;:25::i;:::-;4668:42;;4717:32;4766:6;4752:21;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4752:21:7;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;4752:21:7;-1:-1:-1;4717:56:7;-1:-1:-1;4785:9:7;4780:97;4804:6;4800:1;:10;4780:97;;;4847:22;:16;4867:1;4847:22;:19;:22;:::i;:::-;4826:15;4842:1;4826:18;;;;;;;;-1:-1:-1;;;;;4826:43:7;;;:18;;;;;;;;;;;:43;4812:3;;4780:97;;;-1:-1:-1;4890:15:7;-1:-1:-1;;4594:317:7;:::o;1265:77:5:-;1329:6;;-1:-1:-1;;;;;1329:6:5;1265:77;:::o;5692:148:7:-;-1:-1:-1;;;;;5809:17:7;;5756:7;5809:17;;;:8;:17;;;;;:24;;;;5779:25;;:55;;;:29;:55;:::i;2894:484::-;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;3004:16:7::1;:14;:16::i;:::-;3029:30;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;3029:30:7::1;::::0;;::::1;::::0;;;::::1;::::0;:5:::1;::::0;:30:::1;:::i;:::-;-1:-1:-1::0;3066:22:7::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;3066:22:7::1;::::0;;::::1;::::0;;;::::1;::::0;:7:::1;::::0;:22:::1;:::i;:::-;-1:-1:-1::0;3095:12:7::1;:22:::0;;;3124:4:::1;:11:::0;;-1:-1:-1;;;;;3124:11:7;;::::1;-1:-1:-1::0;;;;;;3124:11:7;;::::1;::::0;::::1;::::0;;;3142:8:::1;:19:::0;;-1:-1:-1;;;;3142:19:7;;::::1;::::0;;::::1;;3190:15:::0;;;;;;3212:10:::1;:25:::0;;;;::::1;::::0;;3124:4:::1;3246:14:::0;;;:8:::1;:14;::::0;;;;:37;;;3290:26:::1;:16;3131:4:::0;3290:26:::1;:20;:26;:::i;:::-;-1:-1:-1::0;3359:12:7::1;::::0;3330:42:::1;::::0;;;;;;-1:-1:-1;;;;;3330:42:7;::::1;::::0;3347:3:::1;::::0;-1:-1:-1;;;;;;;;;;;3330:42:7;;;;::::1;::::0;;::::1;1268:14:4::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:4;;;1264:55;2894:484:7;;;;:::o;3860:90::-;3937:7;3930:14;;;;;;;;-1:-1:-1;;3930:14:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3908:13;;3930:14;;3937:7;;3930:14;;3937:7;3930:14;;;;;;;;;;;;;;;;;;;;;;;;14503:125;1479:12:5;:10;:12::i;:::-;1469:6;;-1:-1:-1;;;;;1469:6:5;;;:22;;;1461:67;;;;;-1:-1:-1;;;1461:67:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1461:67:5;;;;;;;;;;;;;;;14592:10:7::1;:30:::0;;-1:-1:-1;;;;;;14592:30:7::1;-1:-1:-1::0;;;;;14592:30:7;;;::::1;::::0;;;::::1;::::0;;14503:125::o;9483:238::-;3512:7;;9589:4;;-1:-1:-1;;;3512:7:7;;;;:16;;:41;;;3546:7;:5;:7::i;:::-;-1:-1:-1;;;;;3532:21:7;:10;-1:-1:-1;;;;;3532:21:7;;3512:41;:69;;;-1:-1:-1;3571:10:7;;-1:-1:-1;;;;;3571:10:7;3557;:24;3512:69;3504:78;;12:1:-1;9;2:12;3504:78:7;9611:10:::1;9633:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;9633:41:7;::::1;::::0;;:31:::1;;:41:::0;;;;;;9602:95:::1;::::0;9611:10;9623:8;;9633:63:::1;::::0;9679:16;9633:63:::1;:45;:63;:::i;9848:416::-:0;3512:7;;9915:4;;-1:-1:-1;;;3512:7:7;;;;:16;;:41;;;3546:7;:5;:7::i;:::-;-1:-1:-1;;;;;3532:21:7;:10;-1:-1:-1;;;;;3532:21:7;;3512:41;:69;;;-1:-1:-1;3571:10:7;;-1:-1:-1;;;;;3571:10:7;3557;:24;3512:69;3504:78;;12:1:-1;9;2:12;3504:78:7;9947:4:::1;9936:7;:15;;9928:24;;12:1:-1;9::::0;2:12:::1;9928:24:7;9992:7;9967:21;9977:10;9967:9;:21::i;:::-;:32;;9959:41;;12:1:-1;9::::0;2:12:::1;9959:41:7;10040:10;10007:21;10031:20:::0;;;:8:::1;:20;::::0;;;;10075:14;;:27:::1;::::0;10094:7;10075:27:::1;:18;:27;:::i;:::-;10058:44:::0;;10125:13:::1;::::0;::::1;::::0;:26:::1;::::0;10143:7;10125:26:::1;:17;:26;:::i;:::-;10109:13;::::0;::::1;:42:::0;10161:44:::1;::::0;;;;;;;10190:4:::1;::::0;10170:10:::1;::::0;-1:-1:-1;;;;;;;;;;;10161:44:7;;;;::::1;::::0;;::::1;10215:26;::::0;;;;;;;10221:10:::1;::::0;10215:26:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;10255:4:7::1;::::0;9848:416;-1:-1:-1;;9848:416:7:o;7164:169::-;3512:7;;7254:4;;-1:-1:-1;;;3512:7:7;;;;:16;;:41;;;3546:7;:5;:7::i;:::-;-1:-1:-1;;;;;3532:21:7;:10;-1:-1:-1;;;;;3532:21:7;;3512:41;:69;;;-1:-1:-1;3571:10:7;;-1:-1:-1;;;;;3571:10:7;3557;:24;3512:69;3504:78;;12:1:-1;9;2:12;3504:78:7;7267:42:::1;7277:10;7289;7301:7;7267:9;:42::i;5384:118::-:0;-1:-1:-1;;;;;5472:17:7;5449:7;5472:17;;;:8;:17;;;;;:24;;;;5384:118::o;14267:88::-;1479:12:5;:10;:12::i;:::-;1469:6;;-1:-1:-1;;;;;1469:6:5;;;:22;;;1461:67;;;;;-1:-1:-1;;;1461:67:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1461:67:5;;;;;;;;;;;;;;;14332:7:7::1;:17:::0;;;::::1;;-1:-1:-1::0;;;14332:17:7::1;-1:-1:-1::0;;;;14332:17:7;;::::1;::::0;;;::::1;::::0;;14267:88::o;6684:253::-;6738:7;;;6779:133;6803:25;:16;:23;:25::i;:::-;6799:1;:29;6779:133;;;6853:51;6864:8;:32;6873:22;:16;6893:1;6873:22;:19;:22;:::i;:::-;-1:-1:-1;;;;;6864:32:7;;;;;;;;;;;;-1:-1:-1;6864:32:7;:39;;;6853:6;;:51;:10;:51;:::i;:::-;6844:60;-1:-1:-1;6830:3:7;;6779:133;;6039:149;-1:-1:-1;;;;;6145:16:7;;;6122:7;6145:16;;;:8;:16;;;;;;;;:37;;;;;;:27;;;;:37;;;;;;6039:149::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;;;;;;;;;;;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;13574:266:7:-;-1:-1:-1;;;;;13666:22:7;;13658:31;;12:1:-1;9;2:12;13658:31:7;-1:-1:-1;;;;;13704:24:7;;13696:33;;12:1:-1;9;2:12;13696:33:7;-1:-1:-1;;;;;13738:16:7;;;;;;;:8;:16;;;;;;;;:37;;;;;;:27;;;;:37;;;;;;:47;;;13799:35;;;;;;;;;;;;;;;;;13574:266;;;:::o;930:104:0:-;1017:10;930:104;:::o;12614:709:7:-;-1:-1:-1;;;;;12710:23:7;;12702:32;;12:1:-1;9;2:12;12702:32:7;-1:-1:-1;;;;;12749:26:7;;12741:35;;12:1:-1;9;2:12;12741:35:7;-1:-1:-1;;;;;12809:17:7;;;12785:21;12809:17;;;:8;:17;;;;;;12860:20;;;;;;;12897:14;;:25;-1:-1:-1;12897:25:7;12889:34;;12:1:-1;9;2:12;12889:34:7;12936:37;:16;12962:10;12936:37;:25;:37;:::i;:::-;12932:201;;;13004:17;;:30;;13026:7;13004:30;:21;:30;:::i;:::-;12984:50;;12932:201;;;13057:27;;;13093:32;:16;13114:10;13093:32;:20;:32;:::i;:::-;;12932:201;13156:14;;:27;;13175:7;13156:27;:18;:27;:::i;:::-;13139:44;;13194:16;13202:7;13194;:16::i;:::-;13190:76;;13226:32;:16;13250:7;13226:32;:23;:32;:::i;:::-;;13190:76;13297:10;-1:-1:-1;;;;;13279:38:7;13288:7;-1:-1:-1;;;;;13279:38:7;-1:-1:-1;;;;;;;;;;;13309:7:7;13279:38;;;;;;;;;;;;;;;;;;12614: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:14285:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;346:14285:7;;;-1:-1:-1;346:14285:7;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://d248c04cc12d31ad13ff25ca8419ba112caddf590ea5bc60860623f6e7b3deb3
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.