ETH Price: $3,398.61 (-1.00%)

Token

UNIFARM Token (UFARM)
 

Overview

Max Total Supply

988,969,000 UFARM

Holders

2,147 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH (-2.22%)

Onchain Market Cap

$156,336.22

Circulating Supply Market Cap

$52,987.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
304.672706641367109995 UFARM

Value
$0.05 ( ~1.47118764845481E-05 Eth) [0.0000%]
0xb29c7dfad742c10e62b0d7dddcee03620f44cff6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A decentralized farming pool of DeFi's projects.

Market

Volume (24H):$10.75
Market Capitalization:$52,987.00
Circulating Supply:335,198,389.00 UFARM
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
UnifarmToken

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-26
*/

// Sources flattened with hardhat v2.1.2 https://hardhat.org

// File contracts/interfaces/IERC20.sol

// SPDX-License-Identifier: MIT;

pragma solidity ^0.7.6;

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

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

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

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

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

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

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

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

// File contracts/libraries/SafeMath.sol

pragma solidity ^0.7.6;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
  /**
   * @dev Returns the addition of two unsigned integers, with an overflow flag.
   *
   * _Available since v3.4._
   */
  function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    uint256 c = a + b;
    if (c < a) return (false, 0);
    return (true, c);
  }

  /**
   * @dev Returns the substraction of two unsigned integers, with an overflow flag.
   *
   * _Available since v3.4._
   */
  function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    if (b > a) return (false, 0);
    return (true, a - b);
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
   *
   * _Available since v3.4._
   */
  function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
    if (a == 0) return (true, 0);
    uint256 c = a * b;
    if (c / a != b) return (false, 0);
    return (true, c);
  }

  /**
   * @dev Returns the division of two unsigned integers, with a division by zero flag.
   *
   * _Available since v3.4._
   */
  function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    if (b == 0) return (false, 0);
    return (true, a / b);
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
   *
   * _Available since v3.4._
   */
  function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    if (b == 0) return (false, 0);
    return (true, a % b);
  }

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

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

  /**
   * @dev Returns the multiplication of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `*` operator.
   *
   * Requirements:
   *
   * - Multiplication cannot overflow.
   */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) return 0;
    uint256 c = a * b;
    require(c / a == b, "SafeMath: multiplication overflow");
    return c;
  }

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

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

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
   * overflow (when the result is negative).
   *
   * CAUTION: This function is deprecated because it requires allocating memory for the error
   * message unnecessarily. For custom revert reasons use {trySub}.
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   *
   * - Subtraction cannot overflow.
   */
  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    return a - b;
  }

  /**
   * @dev Returns the integer division of two unsigned integers, reverting with custom message on
   * division by zero. The result is rounded towards zero.
   *
   * CAUTION: This function is deprecated because it requires allocating memory for the error
   * message unnecessarily. For custom revert reasons use {tryDiv}.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function div(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b > 0, errorMessage);
    return a / b;
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * reverting with custom message when dividing by zero.
   *
   * CAUTION: This function is deprecated because it requires allocating memory for the error
   * message unnecessarily. For custom revert reasons use {tryMod}.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function mod(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b > 0, errorMessage);
    return a % b;
  }
}

// File contracts/access/Context.sol

pragma solidity ^0.7.6;

/*
 * @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.
 */
abstract contract Context {
  function _msgSender() internal view virtual returns (address payable) {
    return msg.sender;
  }

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

// File contracts/security/Pausable.sol

pragma solidity ^0.7.6;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
  /**
   * @dev Emitted when the pause is triggered by `account`.
   */
  event Paused(address account);

  /**
   * @dev Emitted when the pause is lifted by `account`.
   */
  event Unpaused(address account);

  bool private _paused;

  /**
   * @dev Initializes the contract in unpaused state.
   */
  constructor() {
    _paused = false;
  }

  /**
   * @dev Returns true if the contract is paused, and false otherwise.
   */
  function paused() public view virtual returns (bool) {
    return _paused;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   *
   * Requirements:
   *
   * - The contract must not be paused.
   */
  modifier whenNotPaused() {
    require(!paused(), "Pausable: paused");
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   *
   * Requirements:
   *
   * - The contract must be paused.
   */
  modifier whenPaused() {
    require(paused(), "Pausable: not paused");
    _;
  }

  /**
   * @dev Triggers stopped state.
   *
   * Requirements:
   *
   * - The contract must not be paused.
   */
  function _pause() internal virtual whenNotPaused {
    _paused = true;
    emit Paused(_msgSender());
  }

  /**
   * @dev Returns to normal state.
   *
   * Requirements:
   *
   * - The contract must be paused.
   */
  function _unpause() internal virtual whenPaused {
    _paused = false;
    emit Unpaused(_msgSender());
  }
}

// File contracts/access/Ownable.sol

pragma solidity ^0.7.6;

abstract contract Ownable is Pausable {
  address public _owner;
  address public _admin;

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

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

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

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

  /**
   * @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 onlyAdmin {
    emit OwnershipTransferred(_owner, _admin);
    _owner = _admin;
  }

  /**
   * @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;
  }
}

// File contracts/UnifarmToken.sol

pragma solidity ^0.7.6;

contract UnifarmToken is Ownable {
  /// @notice EIP-20 token name for this token
  string public constant name = "UNIFARM Token";

  /// @notice EIP-20 token symbol for this token
  string public constant symbol = "UFARM";

  /// @notice EIP-20 token decimals for this token
  uint8 public constant decimals = 18;

  /// @notice Total number of tokens in circulation
  uint256 public totalSupply = 1000000000e18; // 1 billion UFARM

  using SafeMath for uint256;

  mapping(address => mapping(address => uint256)) internal allowances;

  mapping(address => uint256) internal balances;

  /// @notice A record of each accounts delegate
  mapping(address => address) public delegates;

  /// @notice A checkpoint for marking number of votes from a given block
  struct Checkpoint {
    uint32 fromBlock;
    uint256 votes;
  }

  /// @notice A record of votes checkpoints for each account, by index
  mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

  mapping(address => uint256) public lockedTokens;

  /// @notice The number of checkpoints for each account
  mapping(address => uint32) public numCheckpoints;

  /// @notice The EIP-712 typehash for the contract's domain
  bytes32 public constant DOMAIN_TYPEHASH =
    keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

  /// @notice The EIP-712 typehash for the delegation struct used by the contract
  bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

  /// @notice The EIP-712 typehash for the permit struct used by the contract
  bytes32 public constant PERMIT_TYPEHASH =
    keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

  /// @notice A record of states for signing / validating signatures
  mapping(address => uint256) public nonces;

  /// @notice An event thats emitted when an account changes its delegate
  event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

  /// @notice An event thats emitted when a delegate account's vote balance changes
  event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);

  /// @notice The standard EIP-20 transfer event
  event Transfer(address indexed from, address indexed to, uint256 amount);

  /// @notice The standard EIP-20 approval event
  event Approval(address indexed owner, address indexed spender, uint256 amount);

  /**
   * @notice Construct a new UFARM token
   * @param account The initial account to grant all the tokens
   */
  constructor(address account) Ownable(account) {
    balances[account] = uint256(totalSupply);
    emit Transfer(address(0), account, totalSupply);
  }

  /**
   * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
   * @param account The address of the account holding the funds
   * @param spender The address of the account spending the funds
   * @return The number of tokens approved
   */
  function allowance(address account, address spender) external view returns (uint256) {
    return allowances[account][spender];
  }

  /**
   * @notice Approve `spender` to transfer up to `amount` from `src`
   * @dev This will overwrite the approval amount for `spender`
   *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
   * @param spender The address of the account which may transfer tokens
   * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
   * @return Whether or not the approval succeeded
   */
  function approve(address spender, uint256 rawAmount) external returns (bool) {
    require(spender != address(0), "UFARM::approve: invalid spender address");

    uint256 amount;
    if (rawAmount == uint256(-1)) {
      amount = uint256(-1);
    } else {
      amount = rawAmount; //safe96(rawAmount, "UFARM::approve: amount exceeds 96 bits");
    }

    allowances[msg.sender][spender] = amount;

    emit Approval(msg.sender, spender, amount);
    return true;
  }

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

  /**
   * @dev Atomically decreases the allowance granted to `spender` by the caller.
   *
   * This is an alternative to {approve} that can be used as a mitigation for
   * problems described in {IERC20-approve}.
   *
   * Emits an {Approval} event indicating the updated allowance.
   *
   * Requirements:
   *
   * - `spender` cannot be the zero address.
   * - `spender` must have allowance for the caller of at least
   * `subtractedValue`.
   */
  function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
    require(spender != address(0), "UFARM::approve: invalid spender address");
    uint256 currentAllowance = allowances[_msgSender()][spender];
    require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");

    allowances[_msgSender()][spender] = currentAllowance.sub(subtractedValue);
    emit Approval(msg.sender, spender, currentAllowance.sub(subtractedValue));
    return true;
  }

  /**
   * @notice Triggers an approval from owner to spends
   * @param owner The address to approve from
   * @param spender The address to be approved
   * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
   * @param deadline The time at which to expire the signature
   * @param v The recovery byte of the signature
   * @param r Half of the ECDSA signature pair
   * @param s Half of the ECDSA signature pair
   */
  function permit(
    address owner,
    address spender,
    uint256 rawAmount,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external {
    uint256 amount;
    if (rawAmount == uint256(-1)) {
      amount = uint256(-1);
    } else {
      amount = rawAmount; //safe96(rawAmount, "UFARM::permit: amount exceeds 96 bits");
    }

    bytes32 domainSeparator =
      keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this)));
    bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, rawAmount, nonces[owner]++, deadline));
    bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    address signatory = ecrecover(digest, v, r, s);
    require(signatory != address(0), "UFARM::permit: invalid signature");
    require(signatory == owner, "UFARM::permit: unauthorized");
    require(block.timestamp <= deadline, "UFARM::permit: signature expired");

    allowances[owner][spender] = amount;

    emit Approval(owner, spender, amount);
  }

  /**
   * @notice Get the number of tokens held by the `account`
   * @param account The address of the account to get the balance of
   * @return The number of tokens held
   */
  function balanceOf(address account) external view returns (uint256) {
    return balances[account];
  }

  /**
   * @notice Transfer `amount` tokens from `msg.sender` to `dst`
   * @param dst The address of the destination account
   * @param rawAmount The number of tokens to transfer
   * @return Whether or not the transfer succeeded
   */
  function transfer(address dst, uint256 rawAmount) external returns (bool) {
    _transferTokens(msg.sender, dst, rawAmount);
    return true;
  }

  /**
   * @notice Transfer `amount` tokens from `src` to `dst`
   * @param src The address of the source account
   * @param dst The address of the destination account
   * @param rawAmount The number of tokens to transfer
   * @return Whether or not the transfer succeeded
   */
  function transferFrom(
    address src,
    address dst,
    uint256 rawAmount
  ) external returns (bool) {
    address spender = msg.sender;
    uint256 spenderAllowance = allowances[src][spender];

    if (spender != src && spenderAllowance != uint256(-1)) {
      uint256 newAllowance = spenderAllowance.sub(rawAmount, "UFARM::transferFrom: exceeds allowance");
      allowances[src][spender] = newAllowance;

      emit Approval(src, spender, newAllowance);
    }

    _transferTokens(src, dst, rawAmount);
    return true;
  }

  /**
   * @notice Delegate votes from `msg.sender` to `delegatee`
   * @param delegatee The address to delegate votes to
   */
  function delegate(address delegatee) external returns (bool) {
    _delegate(msg.sender, delegatee);
    return true;
  }

  /**
   * @notice Delegates votes from signatory to `delegatee`
   * @param delegatee The address to delegate votes to
   * @param nonce The contract state required to match the signature
   * @param expiry The time at which to expire the signature
   * @param v The recovery byte of the signature
   * @param r Half of the ECDSA signature pair
   * @param s Half of the ECDSA signature pair
   */
  function delegateBySig(
    address delegatee,
    uint256 nonce,
    uint256 expiry,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external {
    require(block.timestamp <= expiry, "UFARM::delegateBySig: signature expired");
    bytes32 domainSeparator =
      keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this)));
    bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
    bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    address signatory = ecrecover(digest, v, r, s);
    require(signatory != address(0), "UFARM::delegateBySig: invalid signature");
    require(nonce == nonces[signatory]++, "UFARM::delegateBySig: invalid nonce");
    return _delegate(signatory, delegatee);
  }

  /**
   * @notice Gets the current votes balance for `account`
   * @param account The address to get votes balance
   * @return The number of current votes for `account`
   */
  function getCurrentVotes(address account) external view returns (uint256) {
    uint32 nCheckpoints = numCheckpoints[account];
    return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
  }

  /**
   * @notice Determine the prior number of votes for an account as of a block number
   * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
   * @param account The address of the account to check
   * @param blockNumber The block number to get the vote balance at
   * @return The number of votes the account had as of the given block
   */
  function getPriorVotes(address account, uint256 blockNumber) external view returns (uint256) {
    require(blockNumber < block.number, "UFARM::getPriorVotes: not yet determined");

    uint32 nCheckpoints = numCheckpoints[account];
    if (nCheckpoints == 0) {
      return 0;
    }

    // First check most recent balance
    if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
      return checkpoints[account][nCheckpoints - 1].votes;
    }

    // Next check implicit zero balance
    if (checkpoints[account][0].fromBlock > blockNumber) {
      return 0;
    }

    uint32 lower = 0;
    uint32 upper = nCheckpoints - 1;
    while (upper > lower) {
      uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
      Checkpoint memory cp = checkpoints[account][center];
      if (cp.fromBlock == blockNumber) {
        return cp.votes;
      } else if (cp.fromBlock < blockNumber) {
        lower = center;
      } else {
        upper = center - 1;
      }
    }
    return checkpoints[account][lower].votes;
  }

  /**
   * @notice burn the token of any token holder.
   * @dev balance should be greater than amount. function will revert will balance is less than amount.
   * @param holder the addrress of token holder.
   * @param amount number of tokens to burn.
   * @return true when burnToken succeeded.
   */

  function burnToken(address holder, uint256 amount) external onlyOwner returns (bool) {
    require(balances[holder] >= amount, "UFARM::burnToken: Insufficient balance");

    balances[holder] = balances[holder].sub(amount);
    totalSupply = totalSupply.sub(amount);
    _moveDelegates(delegates[holder], delegates[address(0)], amount);
    return true;
  }

  /**
   * @notice lock the token of any token holder.
   * @dev balance should be greater than amount. function will revert will balance is less than amount.
   * @param holder the addrress of token holder.
   * @param amount number of tokens to burn.
   * @return true when lockToken succeeded.
   */

  function lockToken(address holder, uint256 amount) external onlyOwner returns (bool) {
    require(balances[holder] >= amount, "UFARM::burnToken: Insufficient balance");

    balances[holder] = balances[holder].sub(amount);
    lockedTokens[holder] = lockedTokens[holder].add(amount);
    _moveDelegates(delegates[holder], delegates[address(0)], amount);
    return true;
  }

  /**
   * @notice unLock the token of any token holder.
   * @dev locked balance should be greater than amount. function will revert will locked balance is less than amount.
   * @param holder the addrress of token holder.
   * @param amount number of tokens to burn.
   * @return true when unLockToken succeeded.
   */

  function unlockToken(address holder, uint256 amount) external onlyOwner returns (bool) {
    require(lockedTokens[holder] >= amount, "UFARM::unlockToken: OverflowLocked balance");

    lockedTokens[holder] = lockedTokens[holder].sub(amount);
    balances[holder] = balances[holder].add(amount);
    _moveDelegates(delegates[address(0)], delegates[holder], amount);
    return true;
  }

  /**
   * @notice set the delegatee.
   * @dev delegatee address should not be zero address.
   * @param delegator the addrress of token holder.
   * @param delegatee number of tokens to burn.
   */

  function _delegate(address delegator, address delegatee) internal {
    require(delegatee != address(0), "UFARM::_delegate: invalid delegatee address");
    address currentDelegate = delegates[delegator];
    uint256 delegatorBalance = balances[delegator];
    delegates[delegator] = delegatee;

    emit DelegateChanged(delegator, currentDelegate, delegatee);

    _moveDelegates(currentDelegate, delegatee, delegatorBalance);
  }

  /**
   * @notice transfer tokens to src --> dst.
   * @dev src address should be valid ethereum address.
   * @dev dst address should be valid ethereum address.
   * @dev amount should be greater than zero.
   * @param src the source address.
   * @param dst the destination address.
   * @param amount number of token to transfer.
   */

  function _transferTokens(
    address src,
    address dst,
    uint256 amount
  ) internal {
    require(src != address(0), "UFARM::_transferTokens: cannot transfer from the zero address");
    require(dst != address(0), "UFARM::_transferTokens: cannot transfer to the zero address");
    require(amount > 0, "UFARM::_transferTokens: invalid amount wut??");

    balances[src] = balances[src].sub(amount, "UFARM::_transferTokens: exceeds balance");
    balances[dst] = balances[dst].add(amount);
    emit Transfer(src, dst, amount);

    _moveDelegates(delegates[src], delegates[dst], amount);
  }

  /**
   * @notice transfer the vote token.
   * @dev srcRep address should be valid ethereum address.
   * @dev dstRep address should be valid ethereum address.
   * @dev amount should be greater than zero.
   * @param srcRep the source vote address.
   * @param dstRep the destination vote address.
   * @param amount number of vote token to transfer.
   */

  function _moveDelegates(
    address srcRep,
    address dstRep,
    uint256 amount
  ) internal {
    if (srcRep != dstRep && amount > 0) {
      if (srcRep != address(0)) {
        uint32 srcRepNum = numCheckpoints[srcRep];
        uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
        uint256 srcRepNew = srcRepOld.sub(amount);
        _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
      }

      if (dstRep != address(0)) {
        uint32 dstRepNum = numCheckpoints[dstRep];
        uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
        uint256 dstRepNew = dstRepOld.add(amount);
        _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
      }
    }
  }

  /**
   * @notice write checkpoint for delegatee.
   * @dev blocknumber should be uint32.
   * @param delegatee the address of delegatee.
   * @param nCheckpoints no of checkpoints.
   * @param oldVotes number of old votes.
   * @param newVotes number of new votes.
   */

  function _writeCheckpoint(
    address delegatee,
    uint32 nCheckpoints,
    uint256 oldVotes,
    uint256 newVotes
  ) internal {
    uint32 blockNumber = safe32(block.number, "UFARM::_writeCheckpoint: block number exceeds 32 bits");

    if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
      checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
    } else {
      checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
      numCheckpoints[delegatee] = nCheckpoints + 1;
    }

    emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
  }

  /**
   * @notice safe32 function using for uint32 type.
   * @param n the data.
   * @param errorMessage set the errorMessage.
   * @return uint32 data.
   */

  function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) {
    require(n < 2**32, errorMessage);
    return uint32(n);
  }

  /**
   * @notice get the chainId from inline assembly.
   * @return uint256 chainId of Node.
   */

  function getChainId() internal pure returns (uint256) {
    uint256 chainId;
    assembly {
      chainId := chainid()
    }
    return chainId;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","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":"rawAmount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","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":"holder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unlockToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526b033b2e3c9fd0803ce800000060025534801561002057600080fd5b506040516126773803806126778339818101604052602081101561004357600080fd5b50516000805460ff191690558061005861011d565b60008054610100600160a81b0319166101006001600160a01b03938416810291909117808355600180546001600160a01b031916868616179055604051919004909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506002546001600160a01b0382166000818152600460209081526040808320859055805194855251929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350610121565b3390565b612547806101306000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063b4b5ea57116100a2578063dd62ed3e11610071578063dd62ed3e14610665578063e7a324dc14610693578063f1127ed81461069b578063f2fde38b146106ed576101f0565b8063b4b5ea571461057b578063c3cda520146105a1578063d1df306c146105e8578063d505accf14610614576101f0565b806395d89b41116100de57806395d89b4114610513578063a457c2d71461051b578063a9059cbb14610547578063b2bdfa7b14610573576101f0565b806370a0823114610491578063715018a6146104b7578063782d6fe1146104c15780637ecebe00146104ed576101f0565b8063313ce567116101875780635c19a95c116101565780635c19a95c146103fe5780635c975abb146104245780635eb7413a1461042c5780636fcfff4514610452576101f0565b8063313ce5671461036257806331e9e9c01461038057806339509351146103ac578063587cde1e146103d8576101f0565b806318160ddd116101c357806318160ddd1461030257806320606b701461031c57806323b872dd1461032457806330adf81f1461035a576101f0565b806301bc45c9146101f557806306fdde0314610219578063095ea7b31461029657806317be3fa5146102d6575b600080fd5b6101fd610713565b604080516001600160a01b039092168252519081900360200190f35b610221610722565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025b578181015183820152602001610243565b50505050905090810190601f1680156102885780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102c2600480360360408110156102ac57600080fd5b506001600160a01b03813516906020013561074b565b604080519115158252519081900360200190f35b6102c2600480360360408110156102ec57600080fd5b506001600160a01b038135169060200135610802565b61030a61096e565b60408051918252519081900360200190f35b61030a610974565b6102c26004803603606081101561033a57600080fd5b506001600160a01b03813581169160208101359091169060400135610998565b61030a610a68565b61036a610a8c565b6040805160ff9092168252519081900360200190f35b6102c26004803603604081101561039657600080fd5b506001600160a01b038135169060200135610a91565b6102c2600480360360408110156103c257600080fd5b506001600160a01b038135169060200135610bf1565b6101fd600480360360208110156103ee57600080fd5b50356001600160a01b0316610ce2565b6102c26004803603602081101561041457600080fd5b50356001600160a01b0316610cfd565b6102c2610d11565b61030a6004803603602081101561044257600080fd5b50356001600160a01b0316610d1a565b6104786004803603602081101561046857600080fd5b50356001600160a01b0316610d2c565b6040805163ffffffff9092168252519081900360200190f35b61030a600480360360208110156104a757600080fd5b50356001600160a01b0316610d44565b6104bf610d5f565b005b61030a600480360360408110156104d757600080fd5b506001600160a01b038135169060200135610e37565b61030a6004803603602081101561050357600080fd5b50356001600160a01b031661103a565b61022161104c565b6102c26004803603604081101561053157600080fd5b506001600160a01b03813516906020013561106d565b6102c26004803603604081101561055d57600080fd5b506001600160a01b0381351690602001356111a8565b6101fd6111b5565b61030a6004803603602081101561059157600080fd5b50356001600160a01b03166111c9565b6104bf600480360360c08110156105b757600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a0013561122d565b6102c2600480360360408110156105fe57600080fd5b506001600160a01b0381351690602001356114d7565b6104bf600480360360e081101561062a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611627565b61030a6004803603604081101561067b57600080fd5b506001600160a01b03813581169160200135166119c3565b61030a6119ee565b6106cd600480360360408110156106b157600080fd5b5080356001600160a01b0316906020013563ffffffff16611a12565b6040805163ffffffff909316835260208301919091528051918290030190f35b6104bf6004803603602081101561070357600080fd5b50356001600160a01b0316611a3f565b6001546001600160a01b031681565b6040518060400160405280600d81526020016c2aa724a320a926902a37b5b2b760991b81525081565b60006001600160a01b0383166107925760405162461bcd60e51b81526004018080602001828103825260278152602001806124a06027913960400191505060405180910390fd5b60006000198314156107a757506000196107aa565b50815b3360008181526003602090815260408083206001600160a01b0389168085529083529281902085905580518581529051929392600080516020612454833981519152929181900390910190a360019150505b92915050565b600061080c611b47565b60005461010090046001600160a01b03908116911614610861576040805162461bcd60e51b815260206004820181905260248201526000805160206123bb833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600460205260409020548211156108b85760405162461bcd60e51b81526004018080602001828103825260268152602001806122746026913960400191505060405180910390fd5b6001600160a01b0383166000908152600460205260409020546108db9083611b4b565b6001600160a01b03841660009081526004602090815260408083209390935560079052205461090a9083611ba8565b6001600160a01b0380851660009081526007602090815260408083209490945560059052918220549180527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc54610965928216911684611c02565b50600192915050565b60025481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6001600160a01b0383166000818152600360209081526040808320338085529252822054919290919082148015906109d257506000198114155b15610a515760006109fe856040518060600160405280602681526020016124c760269139849190611d44565b6001600160a01b03808916600081815260036020908152604080832094891680845294825291829020859055815185815291519495509293919260008051602061245483398151915292918290030190a3505b610a5c868686611ddb565b50600195945050505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000610a9b611b47565b60005461010090046001600160a01b03908116911614610af0576040805162461bcd60e51b815260206004820181905260248201526000805160206123bb833981519152604482015290519081900360640190fd5b6001600160a01b038316600090815260076020526040902054821115610b475760405162461bcd60e51b815260040180806020018281038252602a81526020018061242a602a913960400191505060405180910390fd5b6001600160a01b038316600090815260076020526040902054610b6a9083611b4b565b6001600160a01b038416600090815260076020908152604080832093909355600490522054610b999083611ba8565b6001600160a01b03848116600090815260046020908152604080832094909455600590527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5492902054610965928216911684611c02565b60006001600160a01b038316610c385760405162461bcd60e51b81526004018080602001828103825260278152602001806124a06027913960400191505060405180910390fd5b6000610c7a8360036000610c4a611b47565b6001600160a01b03908116825260208083019390935260409182016000908120918a168152925290205490611ba8565b90508060036000610c89611b47565b6001600160a01b0390811682526020808301939093526040918201600090812091891680825291845282902093909355805184815290513392600080516020612454833981519152928290030190a35060019392505050565b6005602052600090815260409020546001600160a01b031681565b6000610d093383611f99565b506001919050565b60005460ff1690565b60076020526000908152604090205481565b60086020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526004602052604090205490565b610d67611b47565b6001546001600160a01b03908116911614610dc9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652061646d696e604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000438210610e775760405162461bcd60e51b81526004018080602001828103825260288152602001806123db6028913960400191505060405180910390fd5b6001600160a01b03831660009081526008602052604090205463ffffffff1680610ea55760009150506107fc565b6001600160a01b038416600090815260066020908152604080832063ffffffff600019860181168552925290912054168310610f14576001600160a01b03841660009081526006602090815260408083206000199490940163ffffffff168352929052206001015490506107fc565b6001600160a01b038416600090815260066020908152604080832083805290915290205463ffffffff16831015610f4f5760009150506107fc565b600060001982015b8163ffffffff168163ffffffff161115611003576000600263ffffffff848403166001600160a01b038916600090815260066020908152604080832094909304860363ffffffff8181168452948252918390208351808501909452805490941680845260019094015490830152925090871415610fde576020015194506107fc9350505050565b805163ffffffff16871115610ff557819350610ffc565b6001820392505b5050610f57565b506001600160a01b038516600090815260066020908152604080832063ffffffff9094168352929052206001015491505092915050565b60096020526000908152604090205481565b60405180604001604052806005815260200164554641524d60d81b81525081565b60006001600160a01b0383166110b45760405162461bcd60e51b81526004018080602001828103825260278152602001806124a06027913960400191505060405180910390fd5b6000600360006110c2611b47565b6001600160a01b039081168252602080830193909352604091820160009081209188168152925290205490508281101561112d5760405162461bcd60e51b81526004018080602001828103825260258152602001806124ed6025913960400191505060405180910390fd5b6111378184611b4b565b60036000611143611b47565b6001600160a01b03908116825260208083019390935260409182016000908120918916808252919093529120919091553360008051602061245483398151915261118d8487611b4b565b60408051918252519081900360200190a35060019392505050565b6000610965338484611ddb565b60005461010090046001600160a01b031681565b6001600160a01b03811660009081526008602052604081205463ffffffff16806111f4576000611226565b6001600160a01b038316600090815260066020908152604080832063ffffffff60001986011684529091529020600101545b9392505050565b8342111561126c5760405162461bcd60e51b815260040180806020018281038252602781526020018061224d6027913960400191505060405180910390fd5b60408051808201909152600d81526c2aa724a320a926902a37b5b2b760991b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f23d7047e3ccda78d89a7daf750061d29f81e02411d2d3c27d5353e565b48b9486112dd61205e565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401835280519085012061190160f01b6101608501526101628401829052610182808501829052835180860390910181526101a285018085528151918701919091206000918290526101c2860180865281905260ff8b166101e287015261020286018a90526102228601899052935192965090949293909260019261024280840193601f198301929081900390910190855afa158015611410573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166114625760405162461bcd60e51b81526004018080602001828103825260278152602001806122266027913960400191505060405180910390fd5b6001600160a01b038116600090815260096020526040902080546001810190915589146114c05760405162461bcd60e51b81526004018080602001828103825260238152602001806122c06023913960400191505060405180910390fd5b6114ca818b611f99565b505050505b505050505050565b60006114e1611b47565b60005461010090046001600160a01b03908116911614611536576040805162461bcd60e51b815260206004820181905260248201526000805160206123bb833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526004602052604090205482111561158d5760405162461bcd60e51b81526004018080602001828103825260268152602001806122746026913960400191505060405180910390fd5b6001600160a01b0383166000908152600460205260409020546115b09083611b4b565b6001600160a01b0384166000908152600460205260409020556002546115d69083611b4b565b6002556001600160a01b038084166000908152600560205260408120549080527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5461096592918216911684611c02565b600060001986141561163c575060001961163f565b50845b60408051808201909152600d81526c2aa724a320a926902a37b5b2b760991b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f23d7047e3ccda78d89a7daf750061d29f81e02411d2d3c27d5353e565b48b9486116b061205e565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401206001600160a01b038d8116600081815260098752848120805460018082019092557f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960c089015260e0880193909352928f1661010087015261012086018e90526101408601919091526101608086018d9052845180870390910181526101808601855280519087012061190160f01b6101a08701526101a286018490526101c2808701829052855180880390910181526101e2870180875281519189019190912090839052610202870180875281905260ff8d1661022288015261024287018c905261026287018b90529451939750959394909391926102828083019392601f198301929081900390910190855afa15801561180c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611874576040805162461bcd60e51b815260206004820181905260248201527f554641524d3a3a7065726d69743a20696e76616c6964207369676e6174757265604482015290519081900360640190fd5b8b6001600160a01b0316816001600160a01b0316146118da576040805162461bcd60e51b815260206004820152601b60248201527f554641524d3a3a7065726d69743a20756e617574686f72697a65640000000000604482015290519081900360640190fd5b8842111561192f576040805162461bcd60e51b815260206004820181905260248201527f554641524d3a3a7065726d69743a207369676e61747572652065787069726564604482015290519081900360640190fd5b84600360008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055508a6001600160a01b03168c6001600160a01b0316600080516020612454833981519152876040518082815260200191505060405180910390a3505050505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60066020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b611a47611b47565b60005461010090046001600160a01b03908116911614611a9c576040805162461bcd60e51b815260206004820181905260248201526000805160206123bb833981519152604482015290519081900360640190fd5b6001600160a01b038116611ae15760405162461bcd60e51b815260040180806020018281038252602681526020018061229a6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b3390565b600082821115611ba2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611226576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b031614158015611c245750600081115b15611d3f576001600160a01b03831615611cb6576001600160a01b03831660009081526008602052604081205463ffffffff169081611c64576000611c96565b6001600160a01b038516600090815260066020908152604080832063ffffffff60001987011684529091529020600101545b90506000611ca48285611b4b565b9050611cb286848484612062565b5050505b6001600160a01b03821615611d3f576001600160a01b03821660009081526008602052604081205463ffffffff169081611cf1576000611d23565b6001600160a01b038416600090815260066020908152604080832063ffffffff60001987011684529091529020600101545b90506000611d318285611ba8565b90506114cf85848484612062565b505050565b60008184841115611dd35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d98578181015183820152602001611d80565b50505050905090810190601f168015611dc55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038316611e205760405162461bcd60e51b815260040180806020018281038252603d815260200180612343603d913960400191505060405180910390fd5b6001600160a01b038216611e655760405162461bcd60e51b815260040180806020018281038252603b815260200180612380603b913960400191505060405180910390fd5b60008111611ea45760405162461bcd60e51b815260040180806020018281038252602c815260200180612474602c913960400191505060405180910390fd5b611ee181604051806060016040528060278152602001612403602791396001600160a01b0386166000908152600460205260409020549190611d44565b6001600160a01b038085166000908152600460205260408082209390935590841681522054611f109082611ba8565b6001600160a01b0380841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a36001600160a01b03808416600090815260056020526040808220548584168352912054611d3f92918216911683611c02565b6001600160a01b038116611fde5760405162461bcd60e51b815260040180806020018281038252602b815260200180612318602b913960400191505060405180910390fd5b6001600160a01b03808316600081815260056020818152604080842080546004845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612058828483611c02565b50505050565b4690565b6000612086436040518060600160405280603581526020016122e3603591396121c7565b905060008463ffffffff161180156120cf57506001600160a01b038516600090815260066020908152604080832063ffffffff6000198901811685529252909120548282169116145b1561210c576001600160a01b038516600090815260066020908152604080832063ffffffff6000198901168452909152902060010182905561217d565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600684528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260089092529390208054928801909116919092161790555b604080518481526020810184905281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b600081640100000000841061221d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611d98578181015183820152602001611d80565b50919291505056fe554641524d3a3a64656c656761746542795369673a20696e76616c6964207369676e6174757265554641524d3a3a64656c656761746542795369673a207369676e61747572652065787069726564554641524d3a3a6275726e546f6b656e3a20496e73756666696369656e742062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373554641524d3a3a64656c656761746542795369673a20696e76616c6964206e6f6e6365554641524d3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473554641524d3a3a5f64656c65676174653a20696e76616c69642064656c6567617465652061646472657373554641524d3a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207472616e736665722066726f6d20746865207a65726f2061646472657373554641524d3a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572554641524d3a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e6564554641524d3a3a5f7472616e73666572546f6b656e733a20657863656564732062616c616e6365554641524d3a3a756e6c6f636b546f6b656e3a204f766572666c6f774c6f636b65642062616c616e63658c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925554641524d3a3a5f7472616e73666572546f6b656e733a20696e76616c696420616d6f756e74207775743f3f554641524d3a3a617070726f76653a20696e76616c6964207370656e6465722061646472657373554641524d3a3a7472616e7366657246726f6d3a206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208539a2dcc8e19a758a9e265149175977bf0bc3c1da56d5b8cb68b86bfb2efe0264736f6c63430007060033000000000000000000000000cbc9bf9507b55f11304678f21456e1ee3579f056

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063b4b5ea57116100a2578063dd62ed3e11610071578063dd62ed3e14610665578063e7a324dc14610693578063f1127ed81461069b578063f2fde38b146106ed576101f0565b8063b4b5ea571461057b578063c3cda520146105a1578063d1df306c146105e8578063d505accf14610614576101f0565b806395d89b41116100de57806395d89b4114610513578063a457c2d71461051b578063a9059cbb14610547578063b2bdfa7b14610573576101f0565b806370a0823114610491578063715018a6146104b7578063782d6fe1146104c15780637ecebe00146104ed576101f0565b8063313ce567116101875780635c19a95c116101565780635c19a95c146103fe5780635c975abb146104245780635eb7413a1461042c5780636fcfff4514610452576101f0565b8063313ce5671461036257806331e9e9c01461038057806339509351146103ac578063587cde1e146103d8576101f0565b806318160ddd116101c357806318160ddd1461030257806320606b701461031c57806323b872dd1461032457806330adf81f1461035a576101f0565b806301bc45c9146101f557806306fdde0314610219578063095ea7b31461029657806317be3fa5146102d6575b600080fd5b6101fd610713565b604080516001600160a01b039092168252519081900360200190f35b610221610722565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025b578181015183820152602001610243565b50505050905090810190601f1680156102885780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102c2600480360360408110156102ac57600080fd5b506001600160a01b03813516906020013561074b565b604080519115158252519081900360200190f35b6102c2600480360360408110156102ec57600080fd5b506001600160a01b038135169060200135610802565b61030a61096e565b60408051918252519081900360200190f35b61030a610974565b6102c26004803603606081101561033a57600080fd5b506001600160a01b03813581169160208101359091169060400135610998565b61030a610a68565b61036a610a8c565b6040805160ff9092168252519081900360200190f35b6102c26004803603604081101561039657600080fd5b506001600160a01b038135169060200135610a91565b6102c2600480360360408110156103c257600080fd5b506001600160a01b038135169060200135610bf1565b6101fd600480360360208110156103ee57600080fd5b50356001600160a01b0316610ce2565b6102c26004803603602081101561041457600080fd5b50356001600160a01b0316610cfd565b6102c2610d11565b61030a6004803603602081101561044257600080fd5b50356001600160a01b0316610d1a565b6104786004803603602081101561046857600080fd5b50356001600160a01b0316610d2c565b6040805163ffffffff9092168252519081900360200190f35b61030a600480360360208110156104a757600080fd5b50356001600160a01b0316610d44565b6104bf610d5f565b005b61030a600480360360408110156104d757600080fd5b506001600160a01b038135169060200135610e37565b61030a6004803603602081101561050357600080fd5b50356001600160a01b031661103a565b61022161104c565b6102c26004803603604081101561053157600080fd5b506001600160a01b03813516906020013561106d565b6102c26004803603604081101561055d57600080fd5b506001600160a01b0381351690602001356111a8565b6101fd6111b5565b61030a6004803603602081101561059157600080fd5b50356001600160a01b03166111c9565b6104bf600480360360c08110156105b757600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a0013561122d565b6102c2600480360360408110156105fe57600080fd5b506001600160a01b0381351690602001356114d7565b6104bf600480360360e081101561062a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611627565b61030a6004803603604081101561067b57600080fd5b506001600160a01b03813581169160200135166119c3565b61030a6119ee565b6106cd600480360360408110156106b157600080fd5b5080356001600160a01b0316906020013563ffffffff16611a12565b6040805163ffffffff909316835260208301919091528051918290030190f35b6104bf6004803603602081101561070357600080fd5b50356001600160a01b0316611a3f565b6001546001600160a01b031681565b6040518060400160405280600d81526020016c2aa724a320a926902a37b5b2b760991b81525081565b60006001600160a01b0383166107925760405162461bcd60e51b81526004018080602001828103825260278152602001806124a06027913960400191505060405180910390fd5b60006000198314156107a757506000196107aa565b50815b3360008181526003602090815260408083206001600160a01b0389168085529083529281902085905580518581529051929392600080516020612454833981519152929181900390910190a360019150505b92915050565b600061080c611b47565b60005461010090046001600160a01b03908116911614610861576040805162461bcd60e51b815260206004820181905260248201526000805160206123bb833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600460205260409020548211156108b85760405162461bcd60e51b81526004018080602001828103825260268152602001806122746026913960400191505060405180910390fd5b6001600160a01b0383166000908152600460205260409020546108db9083611b4b565b6001600160a01b03841660009081526004602090815260408083209390935560079052205461090a9083611ba8565b6001600160a01b0380851660009081526007602090815260408083209490945560059052918220549180527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc54610965928216911684611c02565b50600192915050565b60025481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6001600160a01b0383166000818152600360209081526040808320338085529252822054919290919082148015906109d257506000198114155b15610a515760006109fe856040518060600160405280602681526020016124c760269139849190611d44565b6001600160a01b03808916600081815260036020908152604080832094891680845294825291829020859055815185815291519495509293919260008051602061245483398151915292918290030190a3505b610a5c868686611ddb565b50600195945050505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000610a9b611b47565b60005461010090046001600160a01b03908116911614610af0576040805162461bcd60e51b815260206004820181905260248201526000805160206123bb833981519152604482015290519081900360640190fd5b6001600160a01b038316600090815260076020526040902054821115610b475760405162461bcd60e51b815260040180806020018281038252602a81526020018061242a602a913960400191505060405180910390fd5b6001600160a01b038316600090815260076020526040902054610b6a9083611b4b565b6001600160a01b038416600090815260076020908152604080832093909355600490522054610b999083611ba8565b6001600160a01b03848116600090815260046020908152604080832094909455600590527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5492902054610965928216911684611c02565b60006001600160a01b038316610c385760405162461bcd60e51b81526004018080602001828103825260278152602001806124a06027913960400191505060405180910390fd5b6000610c7a8360036000610c4a611b47565b6001600160a01b03908116825260208083019390935260409182016000908120918a168152925290205490611ba8565b90508060036000610c89611b47565b6001600160a01b0390811682526020808301939093526040918201600090812091891680825291845282902093909355805184815290513392600080516020612454833981519152928290030190a35060019392505050565b6005602052600090815260409020546001600160a01b031681565b6000610d093383611f99565b506001919050565b60005460ff1690565b60076020526000908152604090205481565b60086020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526004602052604090205490565b610d67611b47565b6001546001600160a01b03908116911614610dc9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652061646d696e604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000438210610e775760405162461bcd60e51b81526004018080602001828103825260288152602001806123db6028913960400191505060405180910390fd5b6001600160a01b03831660009081526008602052604090205463ffffffff1680610ea55760009150506107fc565b6001600160a01b038416600090815260066020908152604080832063ffffffff600019860181168552925290912054168310610f14576001600160a01b03841660009081526006602090815260408083206000199490940163ffffffff168352929052206001015490506107fc565b6001600160a01b038416600090815260066020908152604080832083805290915290205463ffffffff16831015610f4f5760009150506107fc565b600060001982015b8163ffffffff168163ffffffff161115611003576000600263ffffffff848403166001600160a01b038916600090815260066020908152604080832094909304860363ffffffff8181168452948252918390208351808501909452805490941680845260019094015490830152925090871415610fde576020015194506107fc9350505050565b805163ffffffff16871115610ff557819350610ffc565b6001820392505b5050610f57565b506001600160a01b038516600090815260066020908152604080832063ffffffff9094168352929052206001015491505092915050565b60096020526000908152604090205481565b60405180604001604052806005815260200164554641524d60d81b81525081565b60006001600160a01b0383166110b45760405162461bcd60e51b81526004018080602001828103825260278152602001806124a06027913960400191505060405180910390fd5b6000600360006110c2611b47565b6001600160a01b039081168252602080830193909352604091820160009081209188168152925290205490508281101561112d5760405162461bcd60e51b81526004018080602001828103825260258152602001806124ed6025913960400191505060405180910390fd5b6111378184611b4b565b60036000611143611b47565b6001600160a01b03908116825260208083019390935260409182016000908120918916808252919093529120919091553360008051602061245483398151915261118d8487611b4b565b60408051918252519081900360200190a35060019392505050565b6000610965338484611ddb565b60005461010090046001600160a01b031681565b6001600160a01b03811660009081526008602052604081205463ffffffff16806111f4576000611226565b6001600160a01b038316600090815260066020908152604080832063ffffffff60001986011684529091529020600101545b9392505050565b8342111561126c5760405162461bcd60e51b815260040180806020018281038252602781526020018061224d6027913960400191505060405180910390fd5b60408051808201909152600d81526c2aa724a320a926902a37b5b2b760991b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f23d7047e3ccda78d89a7daf750061d29f81e02411d2d3c27d5353e565b48b9486112dd61205e565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401835280519085012061190160f01b6101608501526101628401829052610182808501829052835180860390910181526101a285018085528151918701919091206000918290526101c2860180865281905260ff8b166101e287015261020286018a90526102228601899052935192965090949293909260019261024280840193601f198301929081900390910190855afa158015611410573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166114625760405162461bcd60e51b81526004018080602001828103825260278152602001806122266027913960400191505060405180910390fd5b6001600160a01b038116600090815260096020526040902080546001810190915589146114c05760405162461bcd60e51b81526004018080602001828103825260238152602001806122c06023913960400191505060405180910390fd5b6114ca818b611f99565b505050505b505050505050565b60006114e1611b47565b60005461010090046001600160a01b03908116911614611536576040805162461bcd60e51b815260206004820181905260248201526000805160206123bb833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526004602052604090205482111561158d5760405162461bcd60e51b81526004018080602001828103825260268152602001806122746026913960400191505060405180910390fd5b6001600160a01b0383166000908152600460205260409020546115b09083611b4b565b6001600160a01b0384166000908152600460205260409020556002546115d69083611b4b565b6002556001600160a01b038084166000908152600560205260408120549080527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5461096592918216911684611c02565b600060001986141561163c575060001961163f565b50845b60408051808201909152600d81526c2aa724a320a926902a37b5b2b760991b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f23d7047e3ccda78d89a7daf750061d29f81e02411d2d3c27d5353e565b48b9486116b061205e565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401206001600160a01b038d8116600081815260098752848120805460018082019092557f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960c089015260e0880193909352928f1661010087015261012086018e90526101408601919091526101608086018d9052845180870390910181526101808601855280519087012061190160f01b6101a08701526101a286018490526101c2808701829052855180880390910181526101e2870180875281519189019190912090839052610202870180875281905260ff8d1661022288015261024287018c905261026287018b90529451939750959394909391926102828083019392601f198301929081900390910190855afa15801561180c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611874576040805162461bcd60e51b815260206004820181905260248201527f554641524d3a3a7065726d69743a20696e76616c6964207369676e6174757265604482015290519081900360640190fd5b8b6001600160a01b0316816001600160a01b0316146118da576040805162461bcd60e51b815260206004820152601b60248201527f554641524d3a3a7065726d69743a20756e617574686f72697a65640000000000604482015290519081900360640190fd5b8842111561192f576040805162461bcd60e51b815260206004820181905260248201527f554641524d3a3a7065726d69743a207369676e61747572652065787069726564604482015290519081900360640190fd5b84600360008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055508a6001600160a01b03168c6001600160a01b0316600080516020612454833981519152876040518082815260200191505060405180910390a3505050505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60066020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b611a47611b47565b60005461010090046001600160a01b03908116911614611a9c576040805162461bcd60e51b815260206004820181905260248201526000805160206123bb833981519152604482015290519081900360640190fd5b6001600160a01b038116611ae15760405162461bcd60e51b815260040180806020018281038252602681526020018061229a6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b3390565b600082821115611ba2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611226576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b031614158015611c245750600081115b15611d3f576001600160a01b03831615611cb6576001600160a01b03831660009081526008602052604081205463ffffffff169081611c64576000611c96565b6001600160a01b038516600090815260066020908152604080832063ffffffff60001987011684529091529020600101545b90506000611ca48285611b4b565b9050611cb286848484612062565b5050505b6001600160a01b03821615611d3f576001600160a01b03821660009081526008602052604081205463ffffffff169081611cf1576000611d23565b6001600160a01b038416600090815260066020908152604080832063ffffffff60001987011684529091529020600101545b90506000611d318285611ba8565b90506114cf85848484612062565b505050565b60008184841115611dd35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d98578181015183820152602001611d80565b50505050905090810190601f168015611dc55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038316611e205760405162461bcd60e51b815260040180806020018281038252603d815260200180612343603d913960400191505060405180910390fd5b6001600160a01b038216611e655760405162461bcd60e51b815260040180806020018281038252603b815260200180612380603b913960400191505060405180910390fd5b60008111611ea45760405162461bcd60e51b815260040180806020018281038252602c815260200180612474602c913960400191505060405180910390fd5b611ee181604051806060016040528060278152602001612403602791396001600160a01b0386166000908152600460205260409020549190611d44565b6001600160a01b038085166000908152600460205260408082209390935590841681522054611f109082611ba8565b6001600160a01b0380841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a36001600160a01b03808416600090815260056020526040808220548584168352912054611d3f92918216911683611c02565b6001600160a01b038116611fde5760405162461bcd60e51b815260040180806020018281038252602b815260200180612318602b913960400191505060405180910390fd5b6001600160a01b03808316600081815260056020818152604080842080546004845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612058828483611c02565b50505050565b4690565b6000612086436040518060600160405280603581526020016122e3603591396121c7565b905060008463ffffffff161180156120cf57506001600160a01b038516600090815260066020908152604080832063ffffffff6000198901811685529252909120548282169116145b1561210c576001600160a01b038516600090815260066020908152604080832063ffffffff6000198901168452909152902060010182905561217d565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600684528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260089092529390208054928801909116919092161790555b604080518481526020810184905281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b600081640100000000841061221d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611d98578181015183820152602001611d80565b50919291505056fe554641524d3a3a64656c656761746542795369673a20696e76616c6964207369676e6174757265554641524d3a3a64656c656761746542795369673a207369676e61747572652065787069726564554641524d3a3a6275726e546f6b656e3a20496e73756666696369656e742062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373554641524d3a3a64656c656761746542795369673a20696e76616c6964206e6f6e6365554641524d3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473554641524d3a3a5f64656c65676174653a20696e76616c69642064656c6567617465652061646472657373554641524d3a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207472616e736665722066726f6d20746865207a65726f2061646472657373554641524d3a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572554641524d3a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e6564554641524d3a3a5f7472616e73666572546f6b656e733a20657863656564732062616c616e6365554641524d3a3a756e6c6f636b546f6b656e3a204f766572666c6f774c6f636b65642062616c616e63658c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925554641524d3a3a5f7472616e73666572546f6b656e733a20696e76616c696420616d6f756e74207775743f3f554641524d3a3a617070726f76653a20696e76616c6964207370656e6465722061646472657373554641524d3a3a7472616e7366657246726f6d3a206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208539a2dcc8e19a758a9e265149175977bf0bc3c1da56d5b8cb68b86bfb2efe0264736f6c63430007060033

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

000000000000000000000000cbc9bf9507b55f11304678f21456e1ee3579f056

-----Decoded View---------------
Arg [0] : account (address): 0xcbc9Bf9507B55F11304678f21456e1Ee3579f056

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000cbc9bf9507b55f11304678f21456e1ee3579f056


Deployed Bytecode Sourcemap

14667:18836:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13016:21;;;:::i;:::-;;;;-1:-1:-1;;;;;13016:21:0;;;;;;;;;;;;;;14753:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18385:481;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18385:481:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;28099:382;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28099:382:0;;;;;;;;:::i;15048:42::-;;;:::i;:::-;;;;;;;;;;;;;;;;15900:127;;;:::i;23152:549::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23152:549:0;;;;;;;;;;;;;;;;;:::i;16320:142::-;;;:::i;14953:35::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28817:392;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28817:392:0;;;;;;;;:::i;19249:381::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19249:381:0;;;;;;;;:::i;15325:44::-;;;;;;;;;;;;;;;;-1:-1:-1;15325:44:0;-1:-1:-1;;;;;15325:44:0;;:::i;23839:124::-;;;;;;;;;;;;;;;;-1:-1:-1;23839:124:0;-1:-1:-1;;;;;23839:124:0;;:::i;11804:80::-;;;:::i;15671:47::-;;;;;;;;;;;;;;;;-1:-1:-1;15671:47:0;-1:-1:-1;;;;;15671:47:0;;:::i;15783:48::-;;;;;;;;;;;;;;;;-1:-1:-1;15783:48:0;-1:-1:-1;;;;;15783:48:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;22355:105;;;;;;;;;;;;;;;;-1:-1:-1;22355:105:0;-1:-1:-1;;;;;22355:105:0;;:::i;14098:122::-;;;:::i;:::-;;26014:1085;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26014:1085:0;;;;;;;;:::i;16539:41::-;;;;;;;;;;;;;;;;-1:-1:-1;16539:41:0;-1:-1:-1;;;;;16539:41:0;;:::i;14855:39::-;;;:::i;20103:518::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20103:518:0;;;;;;;;:::i;22710:148::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22710:148:0;;;;;;;;:::i;12990:21::-;;;:::i;25386:213::-;;;;;;;;;;;;;;;;-1:-1:-1;25386:213:0;-1:-1:-1;;;;;25386:213:0;;:::i;24377:820::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24377:820:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27417:364::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27417:364:0;;;;;;;;:::i;21089:1075::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21089:1075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17792:133::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17792:133:0;;;;;;;;;;:::i;16117:117::-;;;:::i;15596:68::-;;;;;;;;;;;;;;;;-1:-1:-1;15596:68:0;;-1:-1:-1;;;;;15596:68:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;14365:230;;;;;;;;;;;;;;;;-1:-1:-1;14365:230:0;-1:-1:-1;;;;;14365:230:0;;:::i;13016:21::-;;;-1:-1:-1;;;;;13016:21:0;;:::o;14753:45::-;;;;;;;;;;;;;;-1:-1:-1;;;14753:45:0;;;;:::o;18385:481::-;18456:4;-1:-1:-1;;;;;18477:21:0;;18469:73;;;;-1:-1:-1;;;18469:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18551:14;-1:-1:-1;;18576:9:0;:24;18572:171;;;-1:-1:-1;;;18572:171:0;;;-1:-1:-1;18663:9:0;18572:171;18762:10;18751:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;18751:31:0;;;;;;;;;;;;:40;;;18805:37;;;;;;;18751:31;;18762:10;-1:-1:-1;;;;;;;;;;;18805:37:0;;;;;;;;;;18856:4;18849:11;;;18385:481;;;;;:::o;28099:382::-;28178:4;13506:12;:10;:12::i;:::-;13496:6;;;;;-1:-1:-1;;;;;13496:6:0;;;:22;;;13488:67;;;;;-1:-1:-1;;;13488:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13488:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28199:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:26;-1:-1:-1;28199:26:0::1;28191:77;;;;-1:-1:-1::0;;;28191:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;28296:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:28:::1;::::0;28317:6;28296:20:::1;:28::i;:::-;-1:-1:-1::0;;;;;28277:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;:47;;;;28354:12:::1;:20:::0;;;;:32:::1;::::0;28379:6;28354:24:::1;:32::i;:::-;-1:-1:-1::0;;;;;28331:20:0;;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;:55;;;;28408:9:::1;:17:::0;;;;;;28427:21;;;;;28393:64:::1;::::0;28408:17;::::1;::::0;28427:21:::1;28450:6:::0;28393:14:::1;:64::i;:::-;-1:-1:-1::0;28471:4:0::1;28099:382:::0;;;;:::o;15048:42::-;;;;:::o;15900:127::-;15947:80;15900:127;:::o;23152:549::-;-1:-1:-1;;;;;23332:15:0;;23257:4;23332:15;;;:10;:15;;;;;;;;23288:10;23332:24;;;;;;;;23257:4;;23288:10;;23332:24;23369:14;;;;;:49;;;-1:-1:-1;;23387:16:0;:31;;23369:49;23365:268;;;23429:20;23452:73;23473:9;23452:73;;;;;;;;;;;;;;;;;:16;;:73;:20;:73::i;:::-;-1:-1:-1;;;;;23534:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;:39;;;23589:36;;;;;;;23429:96;;-1:-1:-1;23534:24:0;;:15;;-1:-1:-1;;;;;;;;;;;23589:36:0;;;;;;;;23365:268;;23641:36;23657:3;23662;23667:9;23641:15;:36::i;:::-;-1:-1:-1;23691:4:0;;23152:549;-1:-1:-1;;;;;23152:549:0:o;16320:142::-;16367:95;16320:142;:::o;14953:35::-;14986:2;14953:35;:::o;28817:392::-;28898:4;13506:12;:10;:12::i;:::-;13496:6;;;;;-1:-1:-1;;;;;13496:6:0;;;:22;;;13488:67;;;;;-1:-1:-1;;;13488:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13488:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28919:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;:30;-1:-1:-1;28919:30:0::1;28911:85;;;;-1:-1:-1::0;;;28911:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;29028:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;:32:::1;::::0;29053:6;29028:24:::1;:32::i;:::-;-1:-1:-1::0;;;;;29005:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;:55;;;;29086:8:::1;:16:::0;;;;:28:::1;::::0;29107:6;29086:20:::1;:28::i;:::-;-1:-1:-1::0;;;;;29067:16:0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;:47;;;;29136:9:::1;:21:::0;;;;29159:17;;;;29121:64:::1;::::0;29136:21;::::1;::::0;29159:17:::1;29178:6:::0;29121:14:::1;:64::i;19249:381::-:0;19331:4;-1:-1:-1;;;;;19352:21:0;;19344:73;;;;-1:-1:-1;;;19344:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19424:20;19447:49;19485:10;19447;:24;19458:12;:10;:12::i;:::-;-1:-1:-1;;;;;19447:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;19447:24:0;;;:33;;;;;;;;;;;:37;:49::i;:::-;19424:72;;19539:12;19503:10;:24;19514:12;:10;:12::i;:::-;-1:-1:-1;;;;;19503:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;19503:24:0;;;:33;;;;;;;;;;;;:48;;;;19563:43;;;;;;;19572:10;;-1:-1:-1;;;;;;;;;;;19563:43:0;;;;;;;-1:-1:-1;19620:4:0;;19249:381;-1:-1:-1;;;19249:381:0:o;15325:44::-;;;;;;;;;;;;-1:-1:-1;;;;;15325:44:0;;:::o;23839:124::-;23894:4;23907:32;23917:10;23929:9;23907;:32::i;:::-;-1:-1:-1;23953:4:0;23839:124;;;:::o;11804:80::-;11851:4;11871:7;;;11804:80;:::o;15671:47::-;;;;;;;;;;;;;:::o;15783:48::-;;;;;;;;;;;;;;;:::o;22355:105::-;-1:-1:-1;;;;;22437:17:0;22414:7;22437:17;;;:8;:17;;;;;;;22355:105::o;14098:122::-;13700:12;:10;:12::i;:::-;13690:6;;-1:-1:-1;;;;;13690:6:0;;;:22;;;13682:67;;;;;-1:-1:-1;;;13682:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14185:6:::1;::::0;::::1;14177::::0;;14156:36:::1;::::0;-1:-1:-1;;;;;14185:6:0;;::::1;::::0;::::1;14177::::0;;::::1;::::0;;::::1;::::0;14156:36:::1;::::0;::::1;14208:6;::::0;::::1;14199:15:::0;;-1:-1:-1;;;;;14208:6:0;;::::1;;14199:15;-1:-1:-1::0;;;;;;14199:15:0;;::::1;::::0;;;::::1;::::0;;14098:122::o;26014:1085::-;26098:7;26136:12;26122:11;:26;26114:79;;;;-1:-1:-1;;;26114:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26224:23:0;;26202:19;26224:23;;;:14;:23;;;;;;;;26258:17;26254:48;;26293:1;26286:8;;;;;26254:48;-1:-1:-1;;;;;26354:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;26375:16:0;;26354:38;;;;;;;;;:48;;:63;-1:-1:-1;26350:137:0;;-1:-1:-1;;;;;26435:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;26456:16:0;;;;26435:38;;;;;;;;26471:1;26435:44;;;-1:-1:-1;26428:51:0;;26350:137;-1:-1:-1;;;;;26540:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;26536:78:0;;;26605:1;26598:8;;;;;26536:78;26622:12;-1:-1:-1;;26660:16:0;;26683:364;26698:5;26690:13;;:5;:13;;;26683:364;;;26714:13;26756:1;26738:19;26739:13;;;26738:19;-1:-1:-1;;;;;26816:20:0;;26793;26816;;;:11;:20;;;;;;;;26738:19;;;;26730:27;;26816:28;;;;;;;;;;;;;26793:51;;;;;;;;;;;;;;;;;;;;;;;;;26730:27;-1:-1:-1;26793:51:0;26857:27;;26853:187;;;26904:8;;;;-1:-1:-1;26897:15:0;;-1:-1:-1;;;;26897:15:0;26853:187;26932:12;;:26;;;-1:-1:-1;26928:112:0;;;26979:6;26971:14;;26928:112;;;27029:1;27020:6;:10;27012:18;;26928:112;26683:364;;;;;-1:-1:-1;;;;;;27060:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;26014:1085:0;;;;:::o;16539:41::-;;;;;;;;;;;;;:::o;14855:39::-;;;;;;;;;;;;;;-1:-1:-1;;;14855:39:0;;;;:::o;20103:518::-;20190:4;-1:-1:-1;;;;;20211:21:0;;20203:73;;;;-1:-1:-1;;;20203:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20283:24;20310:10;:24;20321:12;:10;:12::i;:::-;-1:-1:-1;;;;;20310:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;20310:24:0;;;:33;;;;;;;;;;;-1:-1:-1;20358:35:0;;;;20350:85;;;;-1:-1:-1;;;20350:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20480:37;:16;20501:15;20480:20;:37::i;:::-;20444:10;:24;20455:12;:10;:12::i;:::-;-1:-1:-1;;;;;20444:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;20444:24:0;;;:33;;;;;;;;;;;;:73;;;;20538:10;-1:-1:-1;;;;;;;;;;;20559:37:0;:16;20580:15;20559:20;:37::i;:::-;20529:68;;;;;;;;;;;;;;;-1:-1:-1;20611:4:0;;20103:518;-1:-1:-1;;;20103:518:0:o;22710:148::-;22778:4;22791:43;22807:10;22819:3;22824:9;22791:15;:43::i;12990:21::-;;;;;;-1:-1:-1;;;;;12990:21:0;;:::o;25386:213::-;-1:-1:-1;;;;;25489:23:0;;25451:7;25489:23;;;:14;:23;;;;;;;;25526:16;:67;;25592:1;25526:67;;;-1:-1:-1;;;;;25545:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;25566:16:0;;25545:38;;;;;;;;25581:1;25545:44;;25526:67;25519:74;25386:213;-1:-1:-1;;;25386:213:0:o;24377:820::-;24559:6;24540:15;:25;;24532:77;;;;-1:-1:-1;;;24532:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24703:4;;;;;;;;;;;;-1:-1:-1;;;24703:4:0;;;;;24616:23;15947:80;24687:22;24711:12;:10;:12::i;:::-;24659:80;;;;;;;;;;;;;;;;;;;;;;;;;24733:4;24659:80;;;;;;;;;;;;;;;;;;;;;;;24649:91;;;;;;16163:71;24778:57;;;;-1:-1:-1;;;;;24778:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24768:68;;;;;;-1:-1:-1;;;24870:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24860:68;;;;;;;;;-1:-1:-1;24955:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24649:91;;-1:-1:-1;24768:68:0;;24860;;-1:-1:-1;;24955:26:0;;;;;;;-1:-1:-1;;24955:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24955:26:0;;-1:-1:-1;;24955:26:0;;;-1:-1:-1;;;;;;;24996:23:0;;24988:75;;;;-1:-1:-1;;;24988:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25087:17:0;;;;;;:6;:17;;;;;:19;;;;;;;;25078:28;;25070:76;;;;-1:-1:-1;;;25070:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25160:31;25170:9;25181;25160;:31::i;:::-;25153:38;;;;24377:820;;;;;;;:::o;27417:364::-;27496:4;13506:12;:10;:12::i;:::-;13496:6;;;;;-1:-1:-1;;;;;13496:6:0;;;:22;;;13488:67;;;;;-1:-1:-1;;;13488:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13488:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27517:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:26;-1:-1:-1;27517:26:0::1;27509:77;;;;-1:-1:-1::0;;;27509:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;27614:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:28:::1;::::0;27635:6;27614:20:::1;:28::i;:::-;-1:-1:-1::0;;;;;27595:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;:47;27663:11:::1;::::0;:23:::1;::::0;27679:6;27663:15:::1;:23::i;:::-;27649:11;:37:::0;-1:-1:-1;;;;;27708:17:0;;::::1;;::::0;;;:9:::1;:17;::::0;;;;;27727:21;;;;;27693:64:::1;::::0;27708:17;;::::1;::::0;27727:21:::1;27750:6:::0;27693:14:::1;:64::i;21089:1075::-:0;21261:14;-1:-1:-1;;21286:9:0;:24;21282:170;;;-1:-1:-1;;;21282:170:0;;;-1:-1:-1;21373:9:0;21282:170;21547:4;;;;;;;;;;;;-1:-1:-1;;;21547:4:0;;;;;21460:23;15947:80;21531:22;21555:12;:10;:12::i;:::-;21503:80;;;;;;;;;;;;;;;;;;;;;;;;;21577:4;21503:80;;;;;;;;;;;;;;;;;;;;;;;21493:91;;;;;;-1:-1:-1;;;;;21677:13:0;;;-1:-1:-1;21677:13:0;;;:6;:13;;;;;:15;;;;;;;;;16367:95;21622:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21612:92;;;;;;-1:-1:-1;;;21738:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21728:68;;;;;;;;;21823:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21493:91;;-1:-1:-1;21612:92:0;21728:68;;-1:-1:-1;;21677:15:0;;21823:26;;;;;21503:80;-1:-1:-1;;21823:26:0;;;;;;;;;;;21677:15;21823:26;;;;;;;;;;;;;;;-1:-1:-1;;21823:26:0;;-1:-1:-1;;21823:26:0;;;-1:-1:-1;;;;;;;21864:23:0;;21856:68;;;;;-1:-1:-1;;;21856:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21952:5;-1:-1:-1;;;;;21939:18:0;:9;-1:-1:-1;;;;;21939:18:0;;21931:58;;;;;-1:-1:-1;;;21931:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22023:8;22004:15;:27;;21996:72;;;;;-1:-1:-1;;;21996:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22106:6;22077:10;:17;22088:5;-1:-1:-1;;;;;22077:17:0;-1:-1:-1;;;;;22077:17:0;;;;;;;;;;;;:26;22095:7;-1:-1:-1;;;;;22077:26:0;-1:-1:-1;;;;;22077:26:0;;;;;;;;;;;;:35;;;;22142:7;-1:-1:-1;;;;;22126:32:0;22135:5;-1:-1:-1;;;;;22126:32:0;-1:-1:-1;;;;;;;;;;;22151:6:0;22126:32;;;;;;;;;;;;;;;;;;21089:1075;;;;;;;;;;;;:::o;17792:133::-;-1:-1:-1;;;;;17891:19:0;;;17868:7;17891:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;17792:133::o;16117:117::-;16163:71;16117:117;:::o;15596:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14365:230::-;13506:12;:10;:12::i;:::-;13496:6;;;;;-1:-1:-1;;;;;13496:6:0;;;:22;;;13488:67;;;;;-1:-1:-1;;;13488:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13488:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14450:22:0;::::1;14442:73;;;;-1:-1:-1::0;;;14442:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14548:6;::::0;;14527:38:::1;::::0;-1:-1:-1;;;;;14527:38:0;;::::1;::::0;14548:6:::1;::::0;;::::1;;::::0;14527:38:::1;::::0;::::1;14572:6;:17:::0;;-1:-1:-1;;;;;14572:17:0;;::::1;;;-1:-1:-1::0;;;;;;14572:17:0;;::::1;::::0;;;::::1;::::0;;14365:230::o;10455:100::-;10539:10;10455:100;:::o;5826:148::-;5884:7;5913:1;5908;:6;;5900:49;;;;;-1:-1:-1;;;5900:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5963:5:0;;;5826:148::o;5400:165::-;5458:7;5486:5;;;5506:6;;;;5498:46;;;;;-1:-1:-1;;;5498:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;31209:773;31331:6;-1:-1:-1;;;;;31321:16:0;:6;-1:-1:-1;;;;;31321:16:0;;;:30;;;;;31350:1;31341:6;:10;31321:30;31317:660;;;-1:-1:-1;;;;;31366:20:0;;;31362:299;;-1:-1:-1;;;;;31418:22:0;;31399:16;31418:22;;;:14;:22;;;;;;;;;31471:13;:60;;31530:1;31471:60;;;-1:-1:-1;;;;;31487:19:0;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;31507:13:0;;31487:34;;;;;;;;31519:1;31487:40;;31471:60;31451:80;-1:-1:-1;31542:17:0;31562:21;31451:80;31576:6;31562:13;:21::i;:::-;31542:41;;31594:57;31611:6;31619:9;31630;31641;31594:16;:57::i;:::-;31362:299;;;;-1:-1:-1;;;;;31675:20:0;;;31671:299;;-1:-1:-1;;;;;31727:22:0;;31708:16;31727:22;;;:14;:22;;;;;;;;;31780:13;:60;;31839:1;31780:60;;;-1:-1:-1;;;;;31796:19:0;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;31816:13:0;;31796:34;;;;;;;;31828:1;31796:40;;31780:60;31760:80;-1:-1:-1;31851:17:0;31871:21;31760:80;31885:6;31871:13;:21::i;:::-;31851:41;;31903:57;31920:6;31928:9;31939;31950;31903:16;:57::i;31671:299::-;31209:773;;;:::o;8041:176::-;8147:7;8179:12;8171:6;;;;8163:29;;;;-1:-1:-1;;;8163:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8206:5:0;;;8041:176::o;30220:612::-;-1:-1:-1;;;;;30331:17:0;;30323:91;;;;-1:-1:-1;;;30323:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30429:17:0;;30421:89;;;;-1:-1:-1;;;30421:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30534:1;30525:6;:10;30517:67;;;;-1:-1:-1;;;30517:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30609:68;30627:6;30609:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30609:13:0;;;;;;:8;:13;;;;;;;:68;:17;:68::i;:::-;-1:-1:-1;;;;;30593:13:0;;;;;;;:8;:13;;;;;;:84;;;;30700:13;;;;;;;:25;;30718:6;30700:17;:25::i;:::-;-1:-1:-1;;;;;30684:13:0;;;;;;;:8;:13;;;;;;;;;:41;;;;30737:26;;;;;;;30684:13;;30737:26;;;;;;;;;;;;;-1:-1:-1;;;;;30787:14:0;;;;;;;:9;:14;;;;;;;30803;;;;;;;;30772:54;;30787:14;;;;30803;30819:6;30772:14;:54::i;29423:440::-;-1:-1:-1;;;;;29504:23:0;;29496:79;;;;-1:-1:-1;;;29496:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29608:20:0;;;29582:23;29608:20;;;:9;:20;;;;;;;;;;29662:8;:19;;;;;;29688:20;;;;:32;;;-1:-1:-1;;;;;;29688:32:0;;;;;;;29734:54;;29608:20;;;;;29662:19;;29688:32;;29608:20;;;29734:54;;29582:23;29734:54;29797:60;29812:15;29829:9;29840:16;29797:14;:60::i;:::-;29423:440;;;;:::o;33346:154::-;33458:9;33346:154;:::o;32271:633::-;32414:18;32435:77;32442:12;32435:77;;;;;;;;;;;;;;;;;:6;:77::i;:::-;32414:98;;32540:1;32525:12;:16;;;:85;;;;-1:-1:-1;;;;;;32545:22:0;;;;;;:11;:22;;;;;;;;:65;-1:-1:-1;;32568:16:0;;32545:40;;;;;;;;;:50;:65;;;:50;;:65;32525:85;32521:313;;;-1:-1:-1;;;;;32621:22:0;;;;;;:11;:22;;;;;;;;:40;-1:-1:-1;;32644:16:0;;32621:40;;;;;;;;32659:1;32621:46;:57;;;32521:313;;;32740:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32701:22:0;;-1:-1:-1;32701:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;-1:-1:-1;;32701:72:0;;;;;;;;;;;;;32782:25;;;:14;:25;;;;;;:44;;32810:16;;;32782:44;;;;;;;;;;32521:313;32847:51;;;;;;;;;;;;;;-1:-1:-1;;;;;32847:51:0;;;;;;;;;;;32271:633;;;;;:::o;33079:154::-;33157:6;33191:12;33184:5;33180:9;;33172:32;;;;-1:-1:-1;;;33172:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33225:1:0;;33079:154;-1:-1:-1;;33079:154:0:o

Swarm Source

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