ETH Price: $3,291.40 (+1.53%)
Gas: 1 Gwei

Token

DragosToken (DRGSTKN)
 

Overview

Max Total Supply

73,861.081944444444444429 DRGSTKN

Holders

260

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
360 DRGSTKN

Value
$0.00
0xE6F2B600fd7df131b832F781174DB4CBc70a1131
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DragosToken

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-07
*/

pragma solidity ^0.8.0;

// Part: IDragos - Needed to interface with the Dragos NFT contract

interface IDragos {
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function transferFrom(address from, address to, uint256 tokenId) external;
}

// Part: OpenZeppelin/[email protected]/Address

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// Part: OpenZeppelin/[email protected]/Context

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

// Part: OpenZeppelin/[email protected]/IERC20

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

// Part: OpenZeppelin/[email protected]/SafeMath

/**
 * @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, 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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * 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);
        uint256 c = a - b;

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// Part: OpenZeppelin/[email protected]/ERC20

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        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) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

// File: DragosContract.sol

contract DragosToken is Ownable, ERC20("DragosToken", "DRGSTKN") {
	using SafeMath for uint256;

    mapping(uint256 => address) public addressOfDragosStaker;
    mapping(uint256 => uint256) public tokenStakePayout;
    mapping(address => uint256[]) public dragosStakedAddress;
    mapping(address => uint256) public dragosAddressStakeLength;

    mapping(uint256 => uint256) public dragosClaimDate;
    mapping(uint256 => uint256) public dragosStakeDate;

    bool public stakingOpen;

    uint256[] stakeLengths = [
        1 days,
        30 days,
        60 days
    ];

    uint256[] rewardRates = [
        1,
        30,
        120
    ];

	IDragos public dragosContract;

	event RewardPaid(address indexed user, uint256 reward);

	constructor() {
        
        dragosContract = IDragos(0xB0858AC51bca73c11BA3203712E319b7C45b0896);
	}

    // Necessary function letting the sending contract know this contract
    // Is prepared to hold an ERC721 token
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) public pure returns (bytes4) {
        return this.onERC721Received.selector ^ 0x23b872dd;
    }

    function stakeDragos(uint256[] memory dragosTokenId, uint256 stakingTypeIndex) external 
    {
        require(stakingOpen, "Staking is not open");
        uint256 claimDate = block.timestamp + stakeLengths[stakingTypeIndex - 1];
        uint256 reward = rewardRates[stakingTypeIndex - 1];

        address from = _msgSender();
        for(uint256 i = 0; i < dragosTokenId.length; i++)
        {
            require(dragosContract.ownerOf(dragosTokenId[i]) == from, "You don't own that Dragos");

            dragosContract.transferFrom(from, address(this), dragosTokenId[i]);

            dragosStakedAddress[from].push(dragosTokenId[i]);
            dragosAddressStakeLength[from]++;

            tokenStakePayout[dragosTokenId[i]] = reward;
            addressOfDragosStaker[dragosTokenId[i]] = from;
            if(stakingTypeIndex > 1)
            {
                dragosClaimDate[dragosTokenId[i]] = claimDate;
            }
            dragosStakeDate[dragosTokenId[i]] = block.timestamp;
        }
    }

    function calculateReward(uint256 tokenId) internal view returns(uint256)
    {
        uint256 payout;
        if(tokenStakePayout[tokenId] == 1)
        {
            payout = (((block.timestamp - dragosStakeDate[tokenId]) * 1 ether) / 1 days) / 2;

            if(payout > (29 * 1 ether))
            {
                payout = 29 * 1 ether;
            }
        }
        else{
            return tokenStakePayout[tokenId] * 1 ether;
        }

        return payout;
    }

    function claimDragos(uint256[] memory dragosTokenId) external
    {
        uint256 reward;
        address _to = _msgSender();
        for(uint256 i = 0; i < dragosTokenId.length; i++)
        {
            require(addressOfDragosStaker[dragosTokenId[i]] == _to, "You are not the staker of this Dragos");
            require(block.timestamp >= dragosClaimDate[dragosTokenId[i]], "Dragos cannot be unstaked yet");

            reward += calculateReward(dragosTokenId[i]);

            delete tokenStakePayout[dragosTokenId[i]];
            delete addressOfDragosStaker[dragosTokenId[i]];
            delete dragosClaimDate[dragosTokenId[i]];
            delete dragosStakeDate[dragosTokenId[i]];

            dragosContract.transferFrom(address(this), _to, dragosTokenId[i]);
        }

         _mint(_to, reward);
        emit RewardPaid(_to, reward);
    }

    function hasDragosBeenStaked(uint256 tokenId) public view returns(bool)
    {
        if(addressOfDragosStaker[tokenId] == address(0))
        {
            return false;
        }

        return true;
    }

    function currentTime() external view returns(uint256){
        return block.timestamp;
    }

    function dragosUnstakeTime(uint256 tokenId) external view returns(uint256){
        require(dragosClaimDate[tokenId] > 0, "Dragos has not been staked");
        return dragosClaimDate[tokenId];
    }

    function setStakingOpen() external onlyOwner {
        stakingOpen = !stakingOpen;
    }

    function setDragosContract(address _address) public onlyOwner {
        dragosContract = IDragos(_address);
    }

	function burn(address _from, uint256 _amount) external {
		require(_from == _msgSender(), "You do not own those tokens");
		_burn(_from, _amount);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressOfDragosStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"dragosTokenId","type":"uint256[]"}],"name":"claimDragos","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentTime","outputs":[{"internalType":"uint256","name":"","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":"","type":"address"}],"name":"dragosAddressStakeLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dragosClaimDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dragosContract","outputs":[{"internalType":"contract IDragos","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dragosStakeDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"dragosStakedAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"dragosUnstakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasDragosBeenStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setDragosContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStakingOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"dragosTokenId","type":"uint256[]"},{"internalType":"uint256","name":"stakingTypeIndex","type":"uint256"}],"name":"stakeDragos","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenStakePayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e060405262015180608090815262278d0060a052624f1a0060c0526200002b90600e90600362000182565b506040805160608101825260018152601e60208201526078918101919091526200005a90600f906003620001d9565b503480156200006857600080fd5b506040518060400160405280600b81526020016a223930b3b7b9aa37b5b2b760a91b81525060405180604001604052806007815260200166222923a9aa25a760c91b815250620000c7620000c16200012e60201b60201c565b62000132565b8151620000dc9060049060208501906200021c565b508051620000f29060059060208401906200021c565b50506006805460ff1916601217905550601080546001600160a01b03191673b0858ac51bca73c11ba3203712e319b7c45b0896179055620002ed565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620001c7579160200282015b82811115620001c7578251829062ffffff16905591602001919060010190620001a3565b50620001d592915062000299565b5090565b828054828255906000526020600020908101928215620001c7579160200282015b82811115620001c7578251829060ff16905591602001919060010190620001fa565b8280546200022a90620002b0565b90600052602060002090601f0160209004810192826200024e5760008555620001c7565b82601f106200026957805160ff1916838001178555620001c7565b82800160010185558215620001c7579182015b82811115620001c75782518255916020019190600101906200027c565b5b80821115620001d557600081556001016200029a565b600181811c90821680620002c557607f821691505b60208210811415620002e757634e487b7160e01b600052602260045260246000fd5b50919050565b611bc280620002fd6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063c9447bb2116100a2578063e10d2f6611610071578063e10d2f661461046f578063f2fde38b14610482578063f47b3b8b14610495578063f5268d18146104b557600080fd5b8063c9447bb214610408578063d18e81b314610410578063d851fc9e14610416578063dd62ed3e1461043657600080fd5b80639dc29fac116100de5780639dc29fac146103bc578063a457c2d7146103cf578063a9059cbb146103e2578063a97ac3fc146103f557600080fd5b806370a082311461035e578063715018a6146103875780638da5cb5b1461038f57806395d89b41146103b457600080fd5b806338760298116101875780634d2bcfe8116101565780634d2bcfe8146103055780635eea2447146103255780636837041b146103385780636a9acef81461034b57600080fd5b806338760298146102b257806339509351146102bf5780634961819e146102d257806349670f72146102f257600080fd5b8063150b7a02116101c3578063150b7a021461024057806318160ddd1461027857806323b872dd1461028a578063313ce5671461029d57600080fd5b806306fdde03146101ea578063095ea7b3146102085780630cf2cc381461022b575b600080fd5b6101f26104de565b6040516101ff9190611950565b60405180910390f35b61021b610216366004611889565b610570565b60405190151581526020016101ff565b61023e610239366004611736565b610586565b005b61025f61024e3660046117ea565b6336b308df60e01b95945050505050565b6040516001600160e01b031990911681526020016101ff565b6003545b6040519081526020016101ff565b61021b6102983660046117a9565b6105db565b60065460405160ff90911681526020016101ff565b600d5461021b9060ff1681565b61021b6102cd366004611889565b610644565b61027c6102e0366004611937565b600b6020526000908152604090205481565b61023e6103003660046118b5565b61067a565b61027c610313366004611736565b600a6020526000908152604090205481565b61027c610333366004611937565b6109b3565b61021b610346366004611937565b610a21565b61027c610359366004611889565b610a4d565b61027c61036c366004611736565b6001600160a01b031660009081526001602052604090205490565b61023e610a7e565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101ff565b6101f2610ab4565b61023e6103ca366004611889565b610ac3565b61021b6103dd366004611889565b610b29565b61021b6103f0366004611889565b610b78565b60105461039c906001600160a01b031681565b61023e610b85565b4261027c565b61027c610424366004611937565b60086020526000908152604090205481565b61027c610444366004611770565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61023e61047d3660046118f2565b610bc3565b61023e610490366004611736565b610f88565b61027c6104a3366004611937565b600c6020526000908152604090205481565b61039c6104c3366004611937565b6007602052600090815260409020546001600160a01b031681565b6060600480546104ed90611a4a565b80601f016020809104026020016040519081016040528092919081815260200182805461051990611a4a565b80156105665780601f1061053b57610100808354040283529160200191610566565b820191906000526020600020905b81548152906001019060200180831161054957829003601f168201915b5050505050905090565b600061057d338484611023565b50600192915050565b6000546001600160a01b031633146105b95760405162461bcd60e51b81526004016105b0906119a5565b60405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006105e8848484611148565b61063a843361063585604051806060016040528060288152602001611b40602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906112ce565b611023565b5060019392505050565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909161057d9185906106359086611308565b600033815b835181101561096057816001600160a01b0316600760008684815181106106a8576106a8611ab6565b6020908102919091018101518252810191909152604001600020546001600160a01b0316146107275760405162461bcd60e51b815260206004820152602560248201527f596f7520617265206e6f7420746865207374616b6572206f66207468697320446044820152647261676f7360d81b60648201526084016105b0565b600b600085838151811061073d5761073d611ab6565b60200260200101518152602001908152602001600020544210156107a35760405162461bcd60e51b815260206004820152601d60248201527f447261676f732063616e6e6f7420626520756e7374616b65642079657400000060448201526064016105b0565b6107c58482815181106107b8576107b8611ab6565b602002602001015161136e565b6107cf90846119da565b9250600860008583815181106107e7576107e7611ab6565b60200260200101518152602001908152602001600020600090556007600085838151811061081757610817611ab6565b6020026020010151815260200190815260200160002060006101000a8154906001600160a01b030219169055600b600085838151811061085957610859611ab6565b6020026020010151815260200190815260200160002060009055600c600085838151811061088957610889611ab6565b6020026020010151815260200190815260200160002060009055601060009054906101000a90046001600160a01b03166001600160a01b03166323b872dd30848785815181106108db576108db611ab6565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561093557600080fd5b505af1158015610949573d6000803e3d6000fd5b50505050808061095890611a85565b91505061067f565b5061096b8183611419565b806001600160a01b03167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486836040516109a691815260200190565b60405180910390a2505050565b6000818152600b6020526040812054610a0e5760405162461bcd60e51b815260206004820152601a60248201527f447261676f7320686173206e6f74206265656e207374616b656400000000000060448201526064016105b0565b506000908152600b602052604090205490565b6000818152600760205260408120546001600160a01b0316610a4557506000919050565b506001919050565b60096020528160005260406000208181548110610a6957600080fd5b90600052602060002001600091509150505481565b6000546001600160a01b03163314610aa85760405162461bcd60e51b81526004016105b0906119a5565b610ab260006114ff565b565b6060600580546104ed90611a4a565b6001600160a01b0382163314610b1b5760405162461bcd60e51b815260206004820152601b60248201527f596f7520646f206e6f74206f776e2074686f736520746f6b656e73000000000060448201526064016105b0565b610b25828261154f565b5050565b600061057d338461063585604051806060016040528060258152602001611b68602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906112ce565b600061057d338484611148565b6000546001600160a01b03163314610baf5760405162461bcd60e51b81526004016105b0906119a5565b600d805460ff19811660ff90911615179055565b600d5460ff16610c0b5760405162461bcd60e51b815260206004820152601360248201527229ba30b5b4b7339034b9903737ba1037b832b760691b60448201526064016105b0565b6000600e610c1a600184611a33565b81548110610c2a57610c2a611ab6565b906000526020600020015442610c4091906119da565b90506000600f610c51600185611a33565b81548110610c6157610c61611ab6565b6000918252602082200154915033905b8551811015610f805760105486516001600160a01b03808516921690636352211e90899085908110610ca557610ca5611ab6565b60200260200101516040518263ffffffff1660e01b8152600401610ccb91815260200190565b60206040518083038186803b158015610ce357600080fd5b505afa158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b9190611753565b6001600160a01b031614610d715760405162461bcd60e51b815260206004820152601960248201527f596f7520646f6e2774206f776e207468617420447261676f730000000000000060448201526064016105b0565b60105486516001600160a01b03909116906323b872dd90849030908a9086908110610d9e57610d9e611ab6565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b505050506001600160a01b03821660009081526009602052604090208651879083908110610e3c57610e3c611ab6565b6020908102919091018101518254600181018455600093845282842001556001600160a01b0384168252600a905260408120805491610e7a83611a85565b91905055508260086000888481518110610e9657610e96611ab6565b60200260200101518152602001908152602001600020819055508160076000888481518110610ec757610ec7611ab6565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001851115610f3c5783600b6000888481518110610f2157610f21611ab6565b60200260200101518152602001908152602001600020819055505b42600c6000888481518110610f5357610f53611ab6565b60200260200101518152602001908152602001600020819055508080610f7890611a85565b915050610c71565b505050505050565b6000546001600160a01b03163314610fb25760405162461bcd60e51b81526004016105b0906119a5565b6001600160a01b0381166110175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105b0565b611020816114ff565b50565b6001600160a01b0383166110855760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105b0565b6001600160a01b0382166110e65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105b0565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166111ac5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105b0565b6001600160a01b03821661120e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105b0565b61124b81604051806060016040528060268152602001611b1a602691396001600160a01b03861660009081526001602052604090205491906112ce565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461127a9082611308565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061113b9085815260200190565b600081848411156112f25760405162461bcd60e51b81526004016105b09190611950565b5060006112ff8486611a33565b95945050505050565b60008061131583856119da565b9050838110156113675760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016105b0565b9392505050565b6000818152600860205260408120548190600114156113f2576000838152600c602052604090205460029062015180906113a89042611a33565b6113ba90670de0b6b3a7640000611a14565b6113c491906119f2565b6113ce91906119f2565b905068019274b259f65400008111156113ed575068019274b259f65400005b611413565b60008381526008602052604090205461136790670de0b6b3a7640000611a14565b92915050565b6001600160a01b03821661146f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105b0565b60035461147c9082611308565b6003556001600160a01b0382166000908152600160205260409020546114a29082611308565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906114f39085815260200190565b60405180910390a35050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166115af5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105b0565b6115ec81604051806060016040528060228152602001611af8602291396001600160a01b03851660009081526001602052604090205491906112ce565b6001600160a01b0383166000908152600160205260409020556003546116129082611653565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016114f3565b600061136783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506112ce565b600082601f8301126116a657600080fd5b8135602067ffffffffffffffff808311156116c3576116c3611acc565b8260051b604051601f19603f830116810181811084821117156116e8576116e8611acc565b6040528481528381019250868401828801850189101561170757600080fd5b600092505b8583101561172a57803584529284019260019290920191840161170c565b50979650505050505050565b60006020828403121561174857600080fd5b813561136781611ae2565b60006020828403121561176557600080fd5b815161136781611ae2565b6000806040838503121561178357600080fd5b823561178e81611ae2565b9150602083013561179e81611ae2565b809150509250929050565b6000806000606084860312156117be57600080fd5b83356117c981611ae2565b925060208401356117d981611ae2565b929592945050506040919091013590565b60008060008060006080868803121561180257600080fd5b853561180d81611ae2565b9450602086013561181d81611ae2565b935060408601359250606086013567ffffffffffffffff8082111561184157600080fd5b818801915088601f83011261185557600080fd5b81358181111561186457600080fd5b89602082850101111561187657600080fd5b9699959850939650602001949392505050565b6000806040838503121561189c57600080fd5b82356118a781611ae2565b946020939093013593505050565b6000602082840312156118c757600080fd5b813567ffffffffffffffff8111156118de57600080fd5b6118ea84828501611695565b949350505050565b6000806040838503121561190557600080fd5b823567ffffffffffffffff81111561191c57600080fd5b61192885828601611695565b95602094909401359450505050565b60006020828403121561194957600080fd5b5035919050565b600060208083528351808285015260005b8181101561197d57858101830151858201604001528201611961565b8181111561198f576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156119ed576119ed611aa0565b500190565b600082611a0f57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611a2e57611a2e611aa0565b500290565b600082821015611a4557611a45611aa0565b500390565b600181811c90821680611a5e57607f821691505b60208210811415611a7f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611a9957611a99611aa0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461102057600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f8706726c0f7ac599d59ac2c97c1c44e7e2e2b8cf8df441b1e21dc4d21d6aecf64736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063c9447bb2116100a2578063e10d2f6611610071578063e10d2f661461046f578063f2fde38b14610482578063f47b3b8b14610495578063f5268d18146104b557600080fd5b8063c9447bb214610408578063d18e81b314610410578063d851fc9e14610416578063dd62ed3e1461043657600080fd5b80639dc29fac116100de5780639dc29fac146103bc578063a457c2d7146103cf578063a9059cbb146103e2578063a97ac3fc146103f557600080fd5b806370a082311461035e578063715018a6146103875780638da5cb5b1461038f57806395d89b41146103b457600080fd5b806338760298116101875780634d2bcfe8116101565780634d2bcfe8146103055780635eea2447146103255780636837041b146103385780636a9acef81461034b57600080fd5b806338760298146102b257806339509351146102bf5780634961819e146102d257806349670f72146102f257600080fd5b8063150b7a02116101c3578063150b7a021461024057806318160ddd1461027857806323b872dd1461028a578063313ce5671461029d57600080fd5b806306fdde03146101ea578063095ea7b3146102085780630cf2cc381461022b575b600080fd5b6101f26104de565b6040516101ff9190611950565b60405180910390f35b61021b610216366004611889565b610570565b60405190151581526020016101ff565b61023e610239366004611736565b610586565b005b61025f61024e3660046117ea565b6336b308df60e01b95945050505050565b6040516001600160e01b031990911681526020016101ff565b6003545b6040519081526020016101ff565b61021b6102983660046117a9565b6105db565b60065460405160ff90911681526020016101ff565b600d5461021b9060ff1681565b61021b6102cd366004611889565b610644565b61027c6102e0366004611937565b600b6020526000908152604090205481565b61023e6103003660046118b5565b61067a565b61027c610313366004611736565b600a6020526000908152604090205481565b61027c610333366004611937565b6109b3565b61021b610346366004611937565b610a21565b61027c610359366004611889565b610a4d565b61027c61036c366004611736565b6001600160a01b031660009081526001602052604090205490565b61023e610a7e565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101ff565b6101f2610ab4565b61023e6103ca366004611889565b610ac3565b61021b6103dd366004611889565b610b29565b61021b6103f0366004611889565b610b78565b60105461039c906001600160a01b031681565b61023e610b85565b4261027c565b61027c610424366004611937565b60086020526000908152604090205481565b61027c610444366004611770565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61023e61047d3660046118f2565b610bc3565b61023e610490366004611736565b610f88565b61027c6104a3366004611937565b600c6020526000908152604090205481565b61039c6104c3366004611937565b6007602052600090815260409020546001600160a01b031681565b6060600480546104ed90611a4a565b80601f016020809104026020016040519081016040528092919081815260200182805461051990611a4a565b80156105665780601f1061053b57610100808354040283529160200191610566565b820191906000526020600020905b81548152906001019060200180831161054957829003601f168201915b5050505050905090565b600061057d338484611023565b50600192915050565b6000546001600160a01b031633146105b95760405162461bcd60e51b81526004016105b0906119a5565b60405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006105e8848484611148565b61063a843361063585604051806060016040528060288152602001611b40602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906112ce565b611023565b5060019392505050565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909161057d9185906106359086611308565b600033815b835181101561096057816001600160a01b0316600760008684815181106106a8576106a8611ab6565b6020908102919091018101518252810191909152604001600020546001600160a01b0316146107275760405162461bcd60e51b815260206004820152602560248201527f596f7520617265206e6f7420746865207374616b6572206f66207468697320446044820152647261676f7360d81b60648201526084016105b0565b600b600085838151811061073d5761073d611ab6565b60200260200101518152602001908152602001600020544210156107a35760405162461bcd60e51b815260206004820152601d60248201527f447261676f732063616e6e6f7420626520756e7374616b65642079657400000060448201526064016105b0565b6107c58482815181106107b8576107b8611ab6565b602002602001015161136e565b6107cf90846119da565b9250600860008583815181106107e7576107e7611ab6565b60200260200101518152602001908152602001600020600090556007600085838151811061081757610817611ab6565b6020026020010151815260200190815260200160002060006101000a8154906001600160a01b030219169055600b600085838151811061085957610859611ab6565b6020026020010151815260200190815260200160002060009055600c600085838151811061088957610889611ab6565b6020026020010151815260200190815260200160002060009055601060009054906101000a90046001600160a01b03166001600160a01b03166323b872dd30848785815181106108db576108db611ab6565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561093557600080fd5b505af1158015610949573d6000803e3d6000fd5b50505050808061095890611a85565b91505061067f565b5061096b8183611419565b806001600160a01b03167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486836040516109a691815260200190565b60405180910390a2505050565b6000818152600b6020526040812054610a0e5760405162461bcd60e51b815260206004820152601a60248201527f447261676f7320686173206e6f74206265656e207374616b656400000000000060448201526064016105b0565b506000908152600b602052604090205490565b6000818152600760205260408120546001600160a01b0316610a4557506000919050565b506001919050565b60096020528160005260406000208181548110610a6957600080fd5b90600052602060002001600091509150505481565b6000546001600160a01b03163314610aa85760405162461bcd60e51b81526004016105b0906119a5565b610ab260006114ff565b565b6060600580546104ed90611a4a565b6001600160a01b0382163314610b1b5760405162461bcd60e51b815260206004820152601b60248201527f596f7520646f206e6f74206f776e2074686f736520746f6b656e73000000000060448201526064016105b0565b610b25828261154f565b5050565b600061057d338461063585604051806060016040528060258152602001611b68602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906112ce565b600061057d338484611148565b6000546001600160a01b03163314610baf5760405162461bcd60e51b81526004016105b0906119a5565b600d805460ff19811660ff90911615179055565b600d5460ff16610c0b5760405162461bcd60e51b815260206004820152601360248201527229ba30b5b4b7339034b9903737ba1037b832b760691b60448201526064016105b0565b6000600e610c1a600184611a33565b81548110610c2a57610c2a611ab6565b906000526020600020015442610c4091906119da565b90506000600f610c51600185611a33565b81548110610c6157610c61611ab6565b6000918252602082200154915033905b8551811015610f805760105486516001600160a01b03808516921690636352211e90899085908110610ca557610ca5611ab6565b60200260200101516040518263ffffffff1660e01b8152600401610ccb91815260200190565b60206040518083038186803b158015610ce357600080fd5b505afa158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b9190611753565b6001600160a01b031614610d715760405162461bcd60e51b815260206004820152601960248201527f596f7520646f6e2774206f776e207468617420447261676f730000000000000060448201526064016105b0565b60105486516001600160a01b03909116906323b872dd90849030908a9086908110610d9e57610d9e611ab6565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b505050506001600160a01b03821660009081526009602052604090208651879083908110610e3c57610e3c611ab6565b6020908102919091018101518254600181018455600093845282842001556001600160a01b0384168252600a905260408120805491610e7a83611a85565b91905055508260086000888481518110610e9657610e96611ab6565b60200260200101518152602001908152602001600020819055508160076000888481518110610ec757610ec7611ab6565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001851115610f3c5783600b6000888481518110610f2157610f21611ab6565b60200260200101518152602001908152602001600020819055505b42600c6000888481518110610f5357610f53611ab6565b60200260200101518152602001908152602001600020819055508080610f7890611a85565b915050610c71565b505050505050565b6000546001600160a01b03163314610fb25760405162461bcd60e51b81526004016105b0906119a5565b6001600160a01b0381166110175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105b0565b611020816114ff565b50565b6001600160a01b0383166110855760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105b0565b6001600160a01b0382166110e65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105b0565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166111ac5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105b0565b6001600160a01b03821661120e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105b0565b61124b81604051806060016040528060268152602001611b1a602691396001600160a01b03861660009081526001602052604090205491906112ce565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461127a9082611308565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061113b9085815260200190565b600081848411156112f25760405162461bcd60e51b81526004016105b09190611950565b5060006112ff8486611a33565b95945050505050565b60008061131583856119da565b9050838110156113675760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016105b0565b9392505050565b6000818152600860205260408120548190600114156113f2576000838152600c602052604090205460029062015180906113a89042611a33565b6113ba90670de0b6b3a7640000611a14565b6113c491906119f2565b6113ce91906119f2565b905068019274b259f65400008111156113ed575068019274b259f65400005b611413565b60008381526008602052604090205461136790670de0b6b3a7640000611a14565b92915050565b6001600160a01b03821661146f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105b0565b60035461147c9082611308565b6003556001600160a01b0382166000908152600160205260409020546114a29082611308565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906114f39085815260200190565b60405180910390a35050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166115af5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105b0565b6115ec81604051806060016040528060228152602001611af8602291396001600160a01b03851660009081526001602052604090205491906112ce565b6001600160a01b0383166000908152600160205260409020556003546116129082611653565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016114f3565b600061136783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506112ce565b600082601f8301126116a657600080fd5b8135602067ffffffffffffffff808311156116c3576116c3611acc565b8260051b604051601f19603f830116810181811084821117156116e8576116e8611acc565b6040528481528381019250868401828801850189101561170757600080fd5b600092505b8583101561172a57803584529284019260019290920191840161170c565b50979650505050505050565b60006020828403121561174857600080fd5b813561136781611ae2565b60006020828403121561176557600080fd5b815161136781611ae2565b6000806040838503121561178357600080fd5b823561178e81611ae2565b9150602083013561179e81611ae2565b809150509250929050565b6000806000606084860312156117be57600080fd5b83356117c981611ae2565b925060208401356117d981611ae2565b929592945050506040919091013590565b60008060008060006080868803121561180257600080fd5b853561180d81611ae2565b9450602086013561181d81611ae2565b935060408601359250606086013567ffffffffffffffff8082111561184157600080fd5b818801915088601f83011261185557600080fd5b81358181111561186457600080fd5b89602082850101111561187657600080fd5b9699959850939650602001949392505050565b6000806040838503121561189c57600080fd5b82356118a781611ae2565b946020939093013593505050565b6000602082840312156118c757600080fd5b813567ffffffffffffffff8111156118de57600080fd5b6118ea84828501611695565b949350505050565b6000806040838503121561190557600080fd5b823567ffffffffffffffff81111561191c57600080fd5b61192885828601611695565b95602094909401359450505050565b60006020828403121561194957600080fd5b5035919050565b600060208083528351808285015260005b8181101561197d57858101830151858201604001528201611961565b8181111561198f576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156119ed576119ed611aa0565b500190565b600082611a0f57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611a2e57611a2e611aa0565b500290565b600082821015611a4557611a45611aa0565b500390565b600181811c90821680611a5e57607f821691505b60208210811415611a7f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611a9957611a99611aa0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461102057600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f8706726c0f7ac599d59ac2c97c1c44e7e2e2b8cf8df441b1e21dc4d21d6aecf64736f6c63430008060033

Deployed Bytecode Sourcemap

28600:4592:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19754:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21860:169;;;;;;:::i;:::-;;:::i;:::-;;;5267:14:1;;5260:22;5242:41;;5230:2;5215:18;21860:169:0;5197:92:1;32917:115:0;;;;;;:::i;:::-;;:::i;:::-;;29604:237;;;;;;:::i;:::-;-1:-1:-1;;;29604:237:0;;;;;;;;;;;-1:-1:-1;;;;;;5456:33:1;;;5438:52;;5426:2;5411:18;29604:237:0;5393:103:1;20829:100:0;20909:12;;20829:100;;;12152:25:1;;;12140:2;12125:18;20829:100:0;12107:76:1;22503:321:0;;;;;;:::i;:::-;;:::i;20681:83::-;20747:9;;20681:83;;20747:9;;;;12330:36:1;;12318:2;12303:18;20681:83:0;12285:87:1;29072:23:0;;;;;;;;;23233:218;;;;;;:::i;:::-;;:::i;28956:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;31395:880;;;;;;:::i;:::-;;:::i;28888:59::-;;;;;;:::i;:::-;;;;;;;;;;;;;;32609:202;;;;;;:::i;:::-;;:::i;32283:216::-;;;;;;:::i;:::-;;:::i;28825:56::-;;;;;;:::i;:::-;;:::i;20992:119::-;;;;;;:::i;:::-;-1:-1:-1;;;;;21085:18:0;21058:7;21085:18;;;:9;:18;;;;;;;20992:119;16972:94;;;:::i;16321:87::-;16367:7;16394:6;-1:-1:-1;;;;;16394:6:0;16321:87;;;-1:-1:-1;;;;;4678:32:1;;;4660:51;;4648:2;4633:18;16321:87:0;4615:102:1;19956:87:0;;;:::i;33037:152::-;;;;;;:::i;:::-;;:::i;23954:269::-;;;;;;:::i;:::-;;:::i;21324:175::-;;;;;;:::i;:::-;;:::i;29274:29::-;;;;;-1:-1:-1;;;;;29274:29:0;;;32819:90;;;:::i;32507:94::-;32578:15;32507:94;;28767:51;;;;;;:::i;:::-;;;;;;;;;;;;;;21562:151;;;;;;:::i;:::-;-1:-1:-1;;;;;21678:18:0;;;21651:7;21678:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21562:151;29849:1036;;;;;;:::i;:::-;;:::i;17221:192::-;;;;;;:::i;:::-;;:::i;29013:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;28704:56;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;28704:56:0;;;19754:83;19791:13;19824:5;19817:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19754:83;:::o;21860:169::-;21943:4;21960:39;7007:10;21983:7;21992:6;21960:8;:39::i;:::-;-1:-1:-1;22017:4:0;21860:169;;;;:::o;32917:115::-;16367:7;16394:6;-1:-1:-1;;;;;16394:6:0;7007:10;16541:23;16533:68;;;;-1:-1:-1;;;16533:68:0;;;;;;;:::i;:::-;;;;;;;;;32990:14:::1;:34:::0;;-1:-1:-1;;;;;;32990:34:0::1;-1:-1:-1::0;;;;;32990:34:0;;;::::1;::::0;;;::::1;::::0;;32917:115::o;22503:321::-;22609:4;22626:36;22636:6;22644:9;22655:6;22626:9;:36::i;:::-;22673:121;22682:6;7007:10;22704:89;22742:6;22704:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22704:19:0;;;;;;:11;:19;;;;;;;;7007:10;22704:33;;;;;;;;;;:37;:89::i;:::-;22673:8;:121::i;:::-;-1:-1:-1;22812:4:0;22503:321;;;;;:::o;23233:218::-;7007:10;23321:4;23370:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;23370:34:0;;;;;;;;;;23321:4;;23338:83;;23361:7;;23370:50;;23409:10;23370:38;:50::i;31395:880::-;31473:14;7007:10;31473:14;31535:662;31558:13;:20;31554:1;:24;31535:662;;;31660:3;-1:-1:-1;;;;;31617:46:0;:21;:39;31639:13;31653:1;31639:16;;;;;;;;:::i;:::-;;;;;;;;;;;;31617:39;;;;;;;;;;-1:-1:-1;31617:39:0;;-1:-1:-1;;;;;31617:39:0;:46;31609:96;;;;-1:-1:-1;;;31609:96:0;;6931:2:1;31609:96:0;;;6913:21:1;6970:2;6950:18;;;6943:30;7009:34;6989:18;;;6982:62;-1:-1:-1;;;7060:18:1;;;7053:35;7105:19;;31609:96:0;6903:227:1;31609:96:0;31747:15;:33;31763:13;31777:1;31763:16;;;;;;;;:::i;:::-;;;;;;;31747:33;;;;;;;;;;;;31728:15;:52;;31720:94;;;;-1:-1:-1;;;31720:94:0;;8503:2:1;31720:94:0;;;8485:21:1;8542:2;8522:18;;;8515:30;8581:31;8561:18;;;8554:59;8630:18;;31720:94:0;8475:179:1;31720:94:0;31841:33;31857:13;31871:1;31857:16;;;;;;;;:::i;:::-;;;;;;;31841:15;:33::i;:::-;31831:43;;;;:::i;:::-;;;31898:16;:34;31915:13;31929:1;31915:16;;;;;;;;:::i;:::-;;;;;;;31898:34;;;;;;;;;;;31891:41;;;31954:21;:39;31976:13;31990:1;31976:16;;;;;;;;:::i;:::-;;;;;;;31954:39;;;;;;;;;;;;31947:46;;;;;-1:-1:-1;;;;;31947:46:0;;;;;32015:15;:33;32031:13;32045:1;32031:16;;;;;;;;:::i;:::-;;;;;;;32015:33;;;;;;;;;;;32008:40;;;32070:15;:33;32086:13;32100:1;32086:16;;;;;;;;:::i;:::-;;;;;;;32070:33;;;;;;;;;;;32063:40;;;32120:14;;;;;;;;;-1:-1:-1;;;;;32120:14:0;-1:-1:-1;;;;;32120:27:0;;32156:4;32163:3;32168:13;32182:1;32168:16;;;;;;;;:::i;:::-;;;;;;;;;;;32120:65;;-1:-1:-1;;;;;;32120:65:0;;;;;;;-1:-1:-1;;;;;4980:15:1;;;32120:65:0;;;4962:34:1;5032:15;;;;5012:18;;;5005:43;5064:18;;;5057:34;4897:18;;32120:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31580:3;;;;;:::i;:::-;;;;31535:662;;;;32210:18;32216:3;32221:6;32210:5;:18::i;:::-;32255:3;-1:-1:-1;;;;;32244:23:0;;32260:6;32244:23;;;;12152:25:1;;12140:2;12125:18;;12107:76;32244:23:0;;;;;;;;31462:813;;31395:880;:::o;32609:202::-;32675:7;32702:24;;;:15;:24;;;;;;32694:67;;;;-1:-1:-1;;;32694:67:0;;10732:2:1;32694:67:0;;;10714:21:1;10771:2;10751:18;;;10744:30;10810:28;10790:18;;;10783:56;10856:18;;32694:67:0;10704:176:1;32694:67:0;-1:-1:-1;32779:24:0;;;;:15;:24;;;;;;;32609:202::o;32283:216::-;32349:4;32374:30;;;:21;:30;;;;;;-1:-1:-1;;;;;32374:30:0;32371:97;;-1:-1:-1;32451:5:0;;32283:216;-1:-1:-1;32283:216:0:o;32371:97::-;-1:-1:-1;32487:4:0;;32283:216;-1:-1:-1;32283:216:0:o;28825:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16972:94::-;16367:7;16394:6;-1:-1:-1;;;;;16394:6:0;7007:10;16541:23;16533:68;;;;-1:-1:-1;;;16533:68:0;;;;;;;:::i;:::-;17037:21:::1;17055:1;17037:9;:21::i;:::-;16972:94::o:0;19956:87::-;19995:13;20028:7;20021:14;;;;;:::i;33037:152::-;-1:-1:-1;;;;;33105:21:0;;7007:10;33105:21;33097:61;;;;-1:-1:-1;;;33097:61:0;;11492:2:1;33097:61:0;;;11474:21:1;11531:2;11511:18;;;11504:30;11570:29;11550:18;;;11543:57;11617:18;;33097:61:0;11464:177:1;33097:61:0;33163:21;33169:5;33176:7;33163:5;:21::i;:::-;33037:152;;:::o;23954:269::-;24047:4;24064:129;7007:10;24087:7;24096:96;24135:15;24096:96;;;;;;;;;;;;;;;;;7007:10;24096:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;24096:34:0;;;;;;;;;;;;:38;:96::i;21324:175::-;21410:4;21427:42;7007:10;21451:9;21462:6;21427:9;:42::i;32819:90::-;16367:7;16394:6;-1:-1:-1;;;;;16394:6:0;7007:10;16541:23;16533:68;;;;-1:-1:-1;;;16533:68:0;;;;;;;:::i;:::-;32890:11:::1;::::0;;-1:-1:-1;;32875:26:0;::::1;32890:11;::::0;;::::1;32889:12;32875:26;::::0;;32819:90::o;29849:1036::-;29962:11;;;;29954:43;;;;-1:-1:-1;;;29954:43:0;;9576:2:1;29954:43:0;;;9558:21:1;9615:2;9595:18;;;9588:30;-1:-1:-1;;;9634:18:1;;;9627:49;9693:18;;29954:43:0;9548:169:1;29954:43:0;30008:17;30046:12;30059:20;30078:1;30059:16;:20;:::i;:::-;30046:34;;;;;;;;:::i;:::-;;;;;;;;;30028:15;:52;;;;:::i;:::-;30008:72;-1:-1:-1;30091:14:0;30108:11;30120:20;30139:1;30120:16;:20;:::i;:::-;30108:33;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;7007:10:0;;30192:686;30215:13;:20;30211:1;:24;30192:686;;;30274:14;;30297:16;;-1:-1:-1;;;;;30274:48:0;;;;:14;;:22;;30297:13;;30311:1;;30297:16;;;;;;:::i;:::-;;;;;;;30274:40;;;;;;;;;;;;;12152:25:1;;12140:2;12125:18;;12107:76;30274:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30274:48:0;;30266:86;;;;-1:-1:-1;;;30266:86:0;;8861:2:1;30266:86:0;;;8843:21:1;8900:2;8880:18;;;8873:30;8939:27;8919:18;;;8912:55;8984:18;;30266:86:0;8833:175:1;30266:86:0;30369:14;;30418:16;;-1:-1:-1;;;;;30369:14:0;;;;:27;;30397:4;;30411;;30418:13;;30432:1;;30418:16;;;;;;:::i;:::-;;;;;;;;;;;30369:66;;-1:-1:-1;;;;;;30369:66:0;;;;;;;-1:-1:-1;;;;;4980:15:1;;;30369:66:0;;;4962:34:1;5032:15;;;;5012:18;;;5005:43;5064:18;;;5057:34;4897:18;;30369:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;30452:25:0;;;;;;:19;:25;;;;;30483:16;;;;30497:1;;30483:16;;;;;;:::i;:::-;;;;;;;;;;;;30452:48;;;;;;;-1:-1:-1;30452:48:0;;;;;;;;-1:-1:-1;;;;;30515:30:0;;;;:24;:30;;;;;:32;;;;;;:::i;:::-;;;;;;30601:6;30564:16;:34;30581:13;30595:1;30581:16;;;;;;;;:::i;:::-;;;;;;;30564:34;;;;;;;;;;;:43;;;;30664:4;30622:21;:39;30644:13;30658:1;30644:16;;;;;;;;:::i;:::-;;;;;;;30622:39;;;;;;;;;;;;:46;;;;;-1:-1:-1;;;;;30622:46:0;;;;;-1:-1:-1;;;;;30622:46:0;;;;;;30705:1;30686:16;:20;30683:118;;;30776:9;30740:15;:33;30756:13;30770:1;30756:16;;;;;;;;:::i;:::-;;;;;;;30740:33;;;;;;;;;;;:45;;;;30683:118;30851:15;30815;:33;30831:13;30845:1;30831:16;;;;;;;;:::i;:::-;;;;;;;30815:33;;;;;;;;;;;:51;;;;30237:3;;;;;:::i;:::-;;;;30192:686;;;;29943:942;;;29849:1036;;:::o;17221:192::-;16367:7;16394:6;-1:-1:-1;;;;;16394:6:0;7007:10;16541:23;16533:68;;;;-1:-1:-1;;;16533:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17310:22:0;::::1;17302:73;;;::::0;-1:-1:-1;;;17302:73:0;;7337:2:1;17302:73:0::1;::::0;::::1;7319:21:1::0;7376:2;7356:18;;;7349:30;7415:34;7395:18;;;7388:62;-1:-1:-1;;;7466:18:1;;;7459:36;7512:19;;17302:73:0::1;7309:228:1::0;17302:73:0::1;17386:19;17396:8;17386:9;:19::i;:::-;17221:192:::0;:::o;27099:346::-;-1:-1:-1;;;;;27201:19:0;;27193:68;;;;-1:-1:-1;;;27193:68:0;;11087:2:1;27193:68:0;;;11069:21:1;11126:2;11106:18;;;11099:30;11165:34;11145:18;;;11138:62;-1:-1:-1;;;11216:18:1;;;11209:34;11260:19;;27193:68:0;11059:226:1;27193:68:0;-1:-1:-1;;;;;27280:21:0;;27272:68;;;;-1:-1:-1;;;27272:68:0;;7744:2:1;27272:68:0;;;7726:21:1;7783:2;7763:18;;;7756:30;7822:34;7802:18;;;7795:62;-1:-1:-1;;;7873:18:1;;;7866:32;7915:19;;27272:68:0;7716:224:1;27272:68:0;-1:-1:-1;;;;;27353:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;27405:32;;12152:25:1;;;27405:32:0;;12125:18:1;27405:32:0;;;;;;;;27099:346;;;:::o;24713:539::-;-1:-1:-1;;;;;24819:20:0;;24811:70;;;;-1:-1:-1;;;24811:70:0;;10326:2:1;24811:70:0;;;10308:21:1;10365:2;10345:18;;;10338:30;10404:34;10384:18;;;10377:62;-1:-1:-1;;;10455:18:1;;;10448:35;10500:19;;24811:70:0;10298:227:1;24811:70:0;-1:-1:-1;;;;;24900:23:0;;24892:71;;;;-1:-1:-1;;;24892:71:0;;6527:2:1;24892:71:0;;;6509:21:1;6566:2;6546:18;;;6539:30;6605:34;6585:18;;;6578:62;-1:-1:-1;;;6656:18:1;;;6649:33;6699:19;;24892:71:0;6499:225:1;24892:71:0;25056;25078:6;25056:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25056:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;25036:17:0;;;;;;;:9;:17;;;;;;:91;;;;25161:20;;;;;;;:32;;25186:6;25161:24;:32::i;:::-;-1:-1:-1;;;;;25138:20:0;;;;;;;:9;:20;;;;;;;:55;;;;25209:35;;;;;;;;;;25237:6;12152:25:1;;12140:2;12125:18;;12107:76;11854:192:0;11940:7;11976:12;11968:6;;;;11960:29;;;;-1:-1:-1;;;11960:29:0;;;;;;;;:::i;:::-;-1:-1:-1;12000:9:0;12012:5;12016:1;12012;:5;:::i;:::-;12000:17;11854:192;-1:-1:-1;;;;;11854:192:0:o;10951:181::-;11009:7;;11041:5;11045:1;11041;:5;:::i;:::-;11029:17;;11070:1;11065;:6;;11057:46;;;;-1:-1:-1;;;11057:46:0;;8147:2:1;11057:46:0;;;8129:21:1;8186:2;8166:18;;;8159:30;8225:29;8205:18;;;8198:57;8272:18;;11057:46:0;8119:177:1;11057:46:0;11123:1;10951:181;-1:-1:-1;;;10951:181:0:o;30893:494::-;30957:7;31010:25;;;:16;:25;;;;;;30957:7;;31039:1;31010:30;31007:347;;;31096:24;;;;:15;:24;;;;;;31145:1;;31135:6;;31078:42;;:15;:42;:::i;:::-;31077:54;;31124:7;31077:54;:::i;:::-;31076:65;;;;:::i;:::-;31075:71;;;;:::i;:::-;31066:80;;31176:12;31166:6;:23;31163:97;;;-1:-1:-1;31232:12:0;31163:97;31007:347;;;31307:25;;;;:16;:25;;;;;;:35;;31335:7;31307:35;:::i;31007:347::-;31373:6;30893:494;-1:-1:-1;;30893:494:0:o;25533:378::-;-1:-1:-1;;;;;25617:21:0;;25609:65;;;;-1:-1:-1;;;25609:65:0;;11848:2:1;25609:65:0;;;11830:21:1;11887:2;11867:18;;;11860:30;11926:33;11906:18;;;11899:61;11977:18;;25609:65:0;11820:181:1;25609:65:0;25764:12;;:24;;25781:6;25764:16;:24::i;:::-;25749:12;:39;-1:-1:-1;;;;;25820:18:0;;;;;;:9;:18;;;;;;:30;;25843:6;25820:22;:30::i;:::-;-1:-1:-1;;;;;25799:18:0;;;;;;:9;:18;;;;;;:51;;;;25866:37;;25799:18;;;25866:37;;;;25896:6;12152:25:1;;12140:2;12125:18;;12107:76;25866:37:0;;;;;;;;25533:378;;:::o;17421:173::-;17477:16;17496:6;;-1:-1:-1;;;;;17513:17:0;;;-1:-1:-1;;;;;;17513:17:0;;;;;;17546:40;;17496:6;;;;;;;17546:40;;17477:16;17546:40;17466:128;17421:173;:::o;26243:418::-;-1:-1:-1;;;;;26327:21:0;;26319:67;;;;-1:-1:-1;;;26319:67:0;;9924:2:1;26319:67:0;;;9906:21:1;9963:2;9943:18;;;9936:30;10002:34;9982:18;;;9975:62;-1:-1:-1;;;10053:18:1;;;10046:31;10094:19;;26319:67:0;9896:223:1;26319:67:0;26482:68;26505:6;26482:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26482:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;26461:18:0;;;;;;:9;:18;;;;;:89;26576:12;;:24;;26593:6;26576:16;:24::i;:::-;26561:12;:39;26616:37;;12152:25:1;;;26642:1:0;;-1:-1:-1;;;;;26616:37:0;;;;;12140:2:1;12125:18;26616:37:0;12107:76:1;11415:136:0;11473:7;11500:43;11504:1;11507;11500:43;;;;;;;;;;;;;;;;;:3;:43::i;14:913:1:-;68:5;121:3;114:4;106:6;102:17;98:27;88:2;;139:1;136;129:12;88:2;175:6;162:20;201:4;224:18;261:2;257;254:10;251:2;;;267:18;;:::i;:::-;313:2;310:1;306:10;345:2;339:9;408:2;404:7;399:2;395;391:11;387:25;379:6;375:38;463:6;451:10;448:22;443:2;431:10;428:18;425:46;422:2;;;474:18;;:::i;:::-;510:2;503:22;560:18;;;594:15;;;;-1:-1:-1;629:15:1;;;663;;;659:24;;656:33;-1:-1:-1;653:2:1;;;702:1;699;692:12;653:2;724:1;715:10;;734:163;748:2;745:1;742:9;734:163;;;805:17;;793:30;;843:12;;;;766:1;759:9;;;;;875:12;;734:163;;;-1:-1:-1;915:6:1;78:849;-1:-1:-1;;;;;;;78:849:1:o;932:247::-;991:6;1044:2;1032:9;1023:7;1019:23;1015:32;1012:2;;;1060:1;1057;1050:12;1012:2;1099:9;1086:23;1118:31;1143:5;1118:31;:::i;1184:251::-;1254:6;1307:2;1295:9;1286:7;1282:23;1278:32;1275:2;;;1323:1;1320;1313:12;1275:2;1355:9;1349:16;1374:31;1399:5;1374:31;:::i;1440:388::-;1508:6;1516;1569:2;1557:9;1548:7;1544:23;1540:32;1537:2;;;1585:1;1582;1575:12;1537:2;1624:9;1611:23;1643:31;1668:5;1643:31;:::i;:::-;1693:5;-1:-1:-1;1750:2:1;1735:18;;1722:32;1763:33;1722:32;1763:33;:::i;:::-;1815:7;1805:17;;;1527:301;;;;;:::o;1833:456::-;1910:6;1918;1926;1979:2;1967:9;1958:7;1954:23;1950:32;1947:2;;;1995:1;1992;1985:12;1947:2;2034:9;2021:23;2053:31;2078:5;2053:31;:::i;:::-;2103:5;-1:-1:-1;2160:2:1;2145:18;;2132:32;2173:33;2132:32;2173:33;:::i;:::-;1937:352;;2225:7;;-1:-1:-1;;;2279:2:1;2264:18;;;;2251:32;;1937:352::o;2294:936::-;2391:6;2399;2407;2415;2423;2476:3;2464:9;2455:7;2451:23;2447:33;2444:2;;;2493:1;2490;2483:12;2444:2;2532:9;2519:23;2551:31;2576:5;2551:31;:::i;:::-;2601:5;-1:-1:-1;2658:2:1;2643:18;;2630:32;2671:33;2630:32;2671:33;:::i;:::-;2723:7;-1:-1:-1;2777:2:1;2762:18;;2749:32;;-1:-1:-1;2832:2:1;2817:18;;2804:32;2855:18;2885:14;;;2882:2;;;2912:1;2909;2902:12;2882:2;2950:6;2939:9;2935:22;2925:32;;2995:7;2988:4;2984:2;2980:13;2976:27;2966:2;;3017:1;3014;3007:12;2966:2;3057;3044:16;3083:2;3075:6;3072:14;3069:2;;;3099:1;3096;3089:12;3069:2;3144:7;3139:2;3130:6;3126:2;3122:15;3118:24;3115:37;3112:2;;;3165:1;3162;3155:12;3112:2;2434:796;;;;-1:-1:-1;2434:796:1;;-1:-1:-1;3196:2:1;3188:11;;3218:6;2434:796;-1:-1:-1;;;2434:796:1:o;3235:315::-;3303:6;3311;3364:2;3352:9;3343:7;3339:23;3335:32;3332:2;;;3380:1;3377;3370:12;3332:2;3419:9;3406:23;3438:31;3463:5;3438:31;:::i;:::-;3488:5;3540:2;3525:18;;;;3512:32;;-1:-1:-1;;;3322:228:1:o;3555:348::-;3639:6;3692:2;3680:9;3671:7;3667:23;3663:32;3660:2;;;3708:1;3705;3698:12;3660:2;3748:9;3735:23;3781:18;3773:6;3770:30;3767:2;;;3813:1;3810;3803:12;3767:2;3836:61;3889:7;3880:6;3869:9;3865:22;3836:61;:::i;:::-;3826:71;3650:253;-1:-1:-1;;;;3650:253:1:o;3908:416::-;4001:6;4009;4062:2;4050:9;4041:7;4037:23;4033:32;4030:2;;;4078:1;4075;4068:12;4030:2;4118:9;4105:23;4151:18;4143:6;4140:30;4137:2;;;4183:1;4180;4173:12;4137:2;4206:61;4259:7;4250:6;4239:9;4235:22;4206:61;:::i;:::-;4196:71;4314:2;4299:18;;;;4286:32;;-1:-1:-1;;;;4020:304:1:o;4329:180::-;4388:6;4441:2;4429:9;4420:7;4416:23;4412:32;4409:2;;;4457:1;4454;4447:12;4409:2;-1:-1:-1;4480:23:1;;4399:110;-1:-1:-1;4399:110:1:o;5723:597::-;5835:4;5864:2;5893;5882:9;5875:21;5925:6;5919:13;5968:6;5963:2;5952:9;5948:18;5941:34;5993:1;6003:140;6017:6;6014:1;6011:13;6003:140;;;6112:14;;;6108:23;;6102:30;6078:17;;;6097:2;6074:26;6067:66;6032:10;;6003:140;;;6161:6;6158:1;6155:13;6152:2;;;6231:1;6226:2;6217:6;6206:9;6202:22;6198:31;6191:42;6152:2;-1:-1:-1;6304:2:1;6283:15;-1:-1:-1;;6279:29:1;6264:45;;;;6311:2;6260:54;;5844:476;-1:-1:-1;;;5844:476:1:o;9013:356::-;9215:2;9197:21;;;9234:18;;;9227:30;9293:34;9288:2;9273:18;;9266:62;9360:2;9345:18;;9187:182::o;12377:128::-;12417:3;12448:1;12444:6;12441:1;12438:13;12435:2;;;12454:18;;:::i;:::-;-1:-1:-1;12490:9:1;;12425:80::o;12510:217::-;12550:1;12576;12566:2;;12620:10;12615:3;12611:20;12608:1;12601:31;12655:4;12652:1;12645:15;12683:4;12680:1;12673:15;12566:2;-1:-1:-1;12712:9:1;;12556:171::o;12732:168::-;12772:7;12838:1;12834;12830:6;12826:14;12823:1;12820:21;12815:1;12808:9;12801:17;12797:45;12794:2;;;12845:18;;:::i;:::-;-1:-1:-1;12885:9:1;;12784:116::o;12905:125::-;12945:4;12973:1;12970;12967:8;12964:2;;;12978:18;;:::i;:::-;-1:-1:-1;13015:9:1;;12954:76::o;13035:380::-;13114:1;13110:12;;;;13157;;;13178:2;;13232:4;13224:6;13220:17;13210:27;;13178:2;13285;13277:6;13274:14;13254:18;13251:38;13248:2;;;13331:10;13326:3;13322:20;13319:1;13312:31;13366:4;13363:1;13356:15;13394:4;13391:1;13384:15;13248:2;;13090:325;;;:::o;13420:135::-;13459:3;-1:-1:-1;;13480:17:1;;13477:2;;;13500:18;;:::i;:::-;-1:-1:-1;13547:1:1;13536:13;;13467:88::o;13560:127::-;13621:10;13616:3;13612:20;13609:1;13602:31;13652:4;13649:1;13642:15;13676:4;13673:1;13666:15;13692:127;13753:10;13748:3;13744:20;13741:1;13734:31;13784:4;13781:1;13774:15;13808:4;13805:1;13798:15;13824:127;13885:10;13880:3;13876:20;13873:1;13866:31;13916:4;13913:1;13906:15;13940:4;13937:1;13930:15;13956:131;-1:-1:-1;;;;;14031:31:1;;14021:42;;14011:2;;14077:1;14074;14067:12

Swarm Source

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