ETH Price: $3,911.29 (-0.41%)

Token

ERC-20: BOOTY LOOT (BLOOTY)
 

Overview

Max Total Supply

50,000,000 BLOOTY

Holders

14

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
firehousejeff.eth
Balance
43,632.443333333333333331 BLOOTY

Value
$0.00
0x6b904259c1469260e87e609a1f6212d276d3dd81
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:
BlootyLoot

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-26
*/

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

// File: contracts\libs\Context.sol

pragma solidity ^0.8.0;

/*
 * @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 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) {
        return msg.sender;
    }

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

// File: contracts\libs\Ownable.sol

pragma solidity ^0.8.0;


abstract contract Ownable is Context {
    address private _owner;

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

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

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    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\libs\IERC20.sol

pragma solidity >=0.4.0;

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

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the erc20 token owner.
     */
    function getOwner() external view returns (address);

    /**
     * @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\libs\SafeMath.sol

pragma solidity ^0.8.0;

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

// File: contracts\libs\Address.sol

pragma solidity ^0.8.0;

/**
 * @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 on 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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        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);
            }
        }
    }
}

// File: contracts\libs\ERC20.sol

pragma solidity ^0.8.0;





/**
 * @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, Ownable {
    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 tokenName, string memory tokenSymbol) {
        _name = tokenName;
        _symbol = tokenSymbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external override view returns (address) {
        return owner();
    }

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

    /**
     * @dev Returns the token decimals.
     */
    function decimals() public override view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev Returns the token symbol.
     */
    function symbol() public override view returns (string memory) {
        return _symbol;
    }

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

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

    /**
     * @dev See {ERC20-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 override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

    /**
     * @dev See {ERC20-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 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 {ERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public 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 {ERC20-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 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");

        _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 {
        require(account != address(0), "ERC20: mint to the zero address");

        _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 {
        require(account != address(0), "ERC20: burn from the zero address");

        _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 is 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 {
        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 Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(
            account,
            _msgSender(),
            _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")
        );
    }
}

// File: contracts\AntiBotERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


/**
 * @notice ERC20 standard token with anti-bot feature integrated
 * Blacklis feature
 * Max TX Amount feature
 * Max Wallet Amount feature
 */
contract AntiBotERC20 is ERC20 {
    using SafeMath for uint256;
    using Address for address;

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant ZERO = address(0);

    mapping(address => bool) private _isExcludedFromAntiWhales;
    mapping(address => bool) private _blacklist;

    uint256 public constant MAX_TX_AMOUNT_MIN_LIMIT = 1 ether;
    uint256 public constant MAX_WALLET_AMOUNT_MIN_LIMIT = 100 ether;

    uint256 public _maxTxAmount = 10000 ether;
    uint256 public _maxWalletAmount = 100000 ether;

    event ExcludedFromBlacklist(address indexed account);
    event IncludedInBlacklist(address indexed account);
    event ExcludedFromAntiWhales(address indexed account);
    event IncludedInAntiWhales(address indexed account);

    constructor(string memory tokenName, string memory tokenSymbol)
        ERC20(tokenName, tokenSymbol)
    {
        _isExcludedFromAntiWhales[_msgSender()] = true;
        _isExcludedFromAntiWhales[DEAD] = true;
        _isExcludedFromAntiWhales[ZERO] = true;
        _isExcludedFromAntiWhales[address(this)] = true;
    }

    /**
     * @notice Exclude the account from black list
     * @param account: the account to be excluded
     * @dev Only callable by owner
     */
    function excludeFromBlacklist(address account) public onlyOwner {
        _blacklist[account] = false;
        emit ExcludedFromBlacklist(account);
    }

    /**
     * @notice Include the account in black list
     * @param account: the account to be included
     * @dev Only callable by owner
     */
    function includeInBlacklist(address account) public onlyOwner {
        _blacklist[account] = true;
        emit IncludedInBlacklist(account);
    }

    /**
     * @notice Check if the account is included in black list
     * @param account: the account to be checked
     */
    function isIncludedInBlacklist(address account) public view returns (bool) {
        return _blacklist[account];
    }

    /**
     * @notice Exclude the account from anti whales limit
     * @param account: the account to be excluded
     * @dev Only callable by owner
     */
    function excludeFromAntiWhales(address account) public onlyOwner {
        _isExcludedFromAntiWhales[account] = true;
        emit ExcludedFromAntiWhales(account);
    }

    /**
     * @notice Include the account in anti whales limit
     * @param account: the account to be included
     * @dev Only callable by owner
     */
    function includeInAntiWhales(address account) public onlyOwner {
        _isExcludedFromAntiWhales[account] = false;
        emit IncludedInAntiWhales(account);
    }

    /**
     * @notice Check if the account is excluded from anti whales limit
     * @param account: the account to be checked
     */
    function isExcludedFromAntiWhales(address account) public view returns (bool) {
        return _isExcludedFromAntiWhales[account];
    }

    /**
     * @notice Set anti whales limit configuration
     * @param maxTxAmount: max amount of token in a transaction
     * @param maxWalletAmount: max amount of token can be kept in a wallet
     * @dev Only callable by owner
     */
    function setAntiWhalesConfiguration(
        uint256 maxTxAmount,
        uint256 maxWalletAmount
    ) external onlyOwner {
        require(
            maxTxAmount >= MAX_TX_AMOUNT_MIN_LIMIT,
            "Max tx amount too small"
        );
        require(
            maxWalletAmount >= MAX_WALLET_AMOUNT_MIN_LIMIT,
            "Max wallet amount too small"
        );
        _maxTxAmount = maxTxAmount;
        _maxWalletAmount = maxWalletAmount;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        require(amount > 0, "Transfer amount must be greater than zero");

        require(!_blacklist[from] && !_blacklist[to], "Transfer from or to the blacklisted account");

        // Check max tx limit
        if (!_isExcludedFromAntiWhales[from] || !_isExcludedFromAntiWhales[to]) {
            require(
                amount <= _maxTxAmount,
                "Too many tokens are going to be transferred"
            );
        }

        // Check max wallet amount limit
        if (!_isExcludedFromAntiWhales[to]) {
            require(
                balanceOf(to).add(amount) <= _maxWalletAmount,
                "Too many tokens are going to be stored in target account"
            );
        }

        super._transfer(from, to, amount);
    }

    function recoverToken(address tokenAddress, uint256 tokenAmount)
        external
        onlyOwner
    {
        // do not allow recovering self token
        require(tokenAddress != address(this), "Self withdraw");
        IERC20(tokenAddress).transfer(owner(), tokenAmount);
    }
}

// File: contracts\GoatedToken.sol

pragma solidity ^0.8.0;


contract BlootyLoot is AntiBotERC20("BOOTY LOOT", "BLOOTY") {
    using SafeMath for uint256;
    using Address for address;

    uint16 public constant MAX_BURN_FEE = 400; // 4% max
    uint16 public constant MAX_TREASURY_FEE = 400; // 4% max
    uint16 public constant MAX_STAKING_FEE = 400; // 4% max
    uint16 public constant MAX_COMMUNITY_FEE = 400; // 4% max
    
    uint16 public _burnFee = 400; // Fee for burning token
    uint16 public _treasuryFee = 400; // Fee for treasury pool
    uint16 public _stakingFee = 400; // Fee for staking rewards pool
    uint16 public _communityFee = 400; // Fee for community rewards pool

    address public _treasuryPool;
    address public _stakingPool;
    address public _communityPool;

    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isPair;

    constructor() {
        _isExcludedFromFee[_msgSender()] = true;
        _mint(_msgSender(), 50000000 * 10**18);
    }

    function excludeFromFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function excludeFromPair(address lpAddress) external onlyOwner {
        _isPair[lpAddress] = false;
    }

    function includeInPair(address lpAddress) external onlyOwner {
        _isPair[lpAddress] = true;
    }

    function isNftPair(address lpAddress) external view returns (bool) {
        return _isPair[lpAddress];
    }

    function setAllFeePercent(
        uint16 burnFee,
        uint16 treasuryFee,
        uint16 stakingFee,
        uint16 communityFee
    ) external onlyOwner {
        require(burnFee <= MAX_BURN_FEE, "Burn fee overflow");
        require(treasuryFee <= MAX_TREASURY_FEE, "Treasury fee overflow");
        require(stakingFee <= MAX_STAKING_FEE, "Staking fee overflow");
        require(communityFee <= MAX_COMMUNITY_FEE, "Community fee overflow");
        _burnFee = burnFee;
        _treasuryFee = treasuryFee;
        _stakingFee = stakingFee;
        _communityFee = communityFee;
    }

    function setPoolAddresses(
        address treasuryPool,
        address stakingPool,
        address communityPool
    ) external onlyOwner {
        require(treasuryPool != address(0), "Invalid treasury pool");
        require(stakingPool != address(0), "Invalid staking pool");
        require(communityPool != address(0), "Invalid community pool");
        _treasuryPool = treasuryPool;
        _stakingPool = stakingPool;
        _communityPool = communityPool;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from zero address");
        require(to != address(0), "ERC20: transfer to zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        // indicates if fee should be deducted from transfer
        // if any account belongs to _isExcludedFromFee account then remove the fee
        bool takeFee = !_isExcludedFromFee[from] &&
            !_isExcludedFromFee[to] &&
            _isPair[to];

        if (takeFee) {
            uint256 burnFeeAmount = amount.mul(_burnFee).div(10000);
            super._transfer(from, DEAD, burnFeeAmount);
            amount = amount.sub(burnFeeAmount);

            uint256 treasuryFeeAmount = amount.mul(_treasuryFee).div(10000);
            if (treasuryFeeAmount > 0 && _treasuryPool != address(0)) {
                super._transfer(from, _treasuryPool, treasuryFeeAmount);
                amount = amount.sub(treasuryFeeAmount);
            }
            
            uint256 stakingFeeAmount = amount.mul(_stakingFee).div(10000);
            if (stakingFeeAmount > 0 && _stakingPool != address(0)) {
                super._transfer(from, _stakingPool, stakingFeeAmount);
                amount = amount.sub(stakingFeeAmount);
            }
            
            uint256 communityFeeAmount = amount.mul(_communityFee).div(10000);
            if (communityFeeAmount > 0 && _communityPool != address(0)) {
                super._transfer(from, _communityPool, communityFeeAmount);
                amount = amount.sub(communityFeeAmount);
            }
        }

        super._transfer(from, to, 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":"account","type":"address"}],"name":"ExcludedFromAntiWhales","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludedFromBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"IncludedInAntiWhales","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"IncludedInBlacklist","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_BURN_FEE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_COMMUNITY_FEE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STAKING_FEE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TREASURY_FEE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TX_AMOUNT_MIN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WALLET_AMOUNT_MIN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_communityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_communityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_stakingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_stakingPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_treasuryFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_treasuryPool","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":[],"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":"account","type":"address"}],"name":"excludeFromAntiWhales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpAddress","type":"address"}],"name":"excludeFromPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInAntiWhales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpAddress","type":"address"}],"name":"includeInPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromAntiWhales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isIncludedInBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpAddress","type":"address"}],"name":"isNftPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"burnFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"stakingFee","type":"uint16"},{"internalType":"uint16","name":"communityFee","type":"uint16"}],"name":"setAllFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"},{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"setAntiWhalesConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasuryPool","type":"address"},{"internalType":"address","name":"stakingPool","type":"address"},{"internalType":"address","name":"communityPool","type":"address"}],"name":"setPoolAddresses","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":"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"}]

608060405269021e19e0c9bab240000060095569152d02c7e14af6800000600a55600b80546001600160401b0319166701900190019001901790553480156200004757600080fd5b506040518060400160405280600a8152602001691093d3d516481313d3d560b21b81525060405180604001604052806006815260200165424c4f4f545960d01b815250818160006200009e6200022360201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508151620000fd9060049060208501906200039c565b508051620001139060059060208401906200039c565b50506006805460ff1916601217905550600160076000620001313390565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905560079092527fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d8054841660019081179091557f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df805485168217905530835290822080549093168117909255909250600e9150620001d73390565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556200021d6200020b3390565b6a295be96e6406697200000062000227565b620004a6565b3390565b6001600160a01b038216620002835760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b6200029f816003546200033260201b6200119c1790919060201c565b6003556001600160a01b038216600090815260016020908152604090912054620002d49183906200119c62000332821b17901c565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620003269085815260200190565b60405180910390a35050565b60008062000341838562000442565b905083811015620003955760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016200027a565b9392505050565b828054620003aa9062000469565b90600052602060002090601f016020900481019282620003ce576000855562000419565b82601f10620003e957805160ff191683800117855562000419565b8280016001018555821562000419579182015b8281111562000419578251825591602001919060010190620003fc565b50620004279291506200042b565b5090565b5b808211156200042757600081556001016200042c565b600082198211156200046457634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200047e57607f821691505b60208210811415620004a057634e487b7160e01b600052602260045260246000fd5b50919050565b611f3080620004b66000396000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c80637d1db4a51161015c578063a457c2d7116100ce578063dc06f1ad11610087578063dc06f1ad146105da578063dd62ed3e146105ef578063ea2f0b3714610628578063f2b3c80914610340578063f2fde38b1461063b578063fee98cc61461064e57600080fd5b8063a457c2d71461056d578063a9059cbb14610580578063ae85028114610593578063b29a8140146105a9578063b9038fe1146105bc578063c0b0fda2146105cc57600080fd5b80638ac19222116101205780638ac19222146105005780638da5cb5b146104ef578063931e48e61461051357806395d89b41146105265780639858d3da1461052e578063a0fae62f1461055a57600080fd5b80637d1db4a5146104ad5780637ffdc7ea146104b65780638597600f146104c957806388bb012a146104dc578063893d20e8146104ef57600080fd5b8063395093511161020057806350e8676c116101b957806350e8676c146103405780635342acb41461042d5780635bbb2452146104595780636c0a24eb1461047357806370a082311461047c578063715018a6146104a557600080fd5b806339509351146103715780633c3c3275146103845780633d074110146103b057806340b7566a146103db578063437823ec14610407578063459ea72d1461041a57600080fd5b806323b872dd1161025257806323b872dd1461030657806328f0b257146103195780632a62b52d146103405780632dde66f714610349578063313ce5671461035c578063368f243e1461034057600080fd5b806306fdde031461028f578063095ea7b3146102ad578063178872ac146102d057806318160ddd146102e557806320d947e8146102f7575b600080fd5b610297610661565b6040516102a49190611cf3565b60405180910390f35b6102c06102bb366004611c31565b6106f3565b60405190151581526020016102a4565b6102e36102de366004611b64565b61070a565b005b6003545b6040519081526020016102a4565b6102e9670de0b6b3a764000081565b6102c0610314366004611bf5565b610789565b600b5461032d9062010000900461ffff1681565b60405161ffff90911681526020016102a4565b61032d61019081565b6102e3610357366004611b64565b6107f2565b60065460405160ff90911681526020016102a4565b6102c061037f366004611c31565b61083d565b6102c0610392366004611b64565b6001600160a01b03166000908152600f602052604090205460ff1690565b600c546103c3906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b6102c06103e9366004611b64565b6001600160a01b031660009081526007602052604090205460ff1690565b6102e3610415366004611b64565b610873565b6102e3610428366004611c7d565b6108c1565b6102c061043b366004611b64565b6001600160a01b03166000908152600e602052604090205460ff1690565b600b546103c390600160401b90046001600160a01b031681565b6102e9600a5481565b6102e961048a366004611b64565b6001600160a01b031660009081526001602052604090205490565b6102e3610a7b565b6102e960095481565b600d546103c3906001600160a01b031681565b6102e36104d7366004611bb2565b610aef565b6102e36104ea366004611b64565b610c54565b6000546001600160a01b03166103c3565b6102e361050e366004611b64565b610cca565b6102e3610521366004611cd1565b610d3d565b610297610e23565b6102c061053c366004611b64565b6001600160a01b031660009081526008602052604090205460ff1690565b6102e3610568366004611b64565b610e32565b6102c061057b366004611c31565b610e80565b6102c061058e366004611c31565b610ecf565b600b5461032d90640100000000900461ffff1681565b6102e36105b7366004611c31565b610edc565b6102e968056bc75e2d6310000081565b600b5461032d9061ffff1681565b600b5461032d90600160301b900461ffff1681565b6102e96105fd366004611b7f565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6102e3610636366004611b64565b610ff5565b6102e3610649366004611b64565b611040565b6102e361065c366004611b64565b61112a565b60606004805461067090611e36565b80601f016020809104026020016040519081016040528092919081815260200182805461069c90611e36565b80156106e95780601f106106be576101008083540402835291602001916106e9565b820191906000526020600020905b8154815290600101906020018083116106cc57829003601f168201915b5050505050905090565b6000610700338484611202565b5060015b92915050565b6000546001600160a01b0316331461073d5760405162461bcd60e51b815260040161073490611d48565b60405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517fb6ef7f73baab9052ab7fc53a6a829c60fc2061319cbc5a8815cda0b168eaf2389190a250565b6000610796848484611327565b6107e884336107e385604051806060016040528060288152602001611eae602891396001600160a01b038a166000908152600260209081526040808320338452909152902054919061160c565b611202565b5060019392505050565b6000546001600160a01b0316331461081c5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916107009185906107e3908661119c565b6000546001600160a01b0316331461089d5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b6000546001600160a01b031633146108eb5760405162461bcd60e51b815260040161073490611d48565b61019061ffff851611156109355760405162461bcd60e51b81526020600482015260116024820152704275726e20666565206f766572666c6f7760781b6044820152606401610734565b61019061ffff841611156109835760405162461bcd60e51b8152602060048201526015602482015274547265617375727920666565206f766572666c6f7760581b6044820152606401610734565b61019061ffff831611156109d05760405162461bcd60e51b81526020600482015260146024820152735374616b696e6720666565206f766572666c6f7760601b6044820152606401610734565b61019061ffff82161115610a1f5760405162461bcd60e51b8152602060048201526016602482015275436f6d6d756e69747920666565206f766572666c6f7760501b6044820152606401610734565b600b805461ffff95861663ffffffff199091161762010000948616949094029390931767ffffffff0000000019166401000000009285169290920267ffff000000000000191691909117600160301b9190931602919091179055565b6000546001600160a01b03163314610aa55760405162461bcd60e51b815260040161073490611d48565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610b195760405162461bcd60e51b815260040161073490611d48565b6001600160a01b038316610b675760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081d1c99585cdd5c9e481c1bdbdb605a1b6044820152606401610734565b6001600160a01b038216610bb45760405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081cdd185ada5b99c81c1bdbdb60621b6044820152606401610734565b6001600160a01b038116610c035760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590818dbdb5b5d5b9a5d1e481c1bdbdb60521b6044820152606401610734565b600b80546001600160a01b03948516600160401b0268010000000000000000600160e01b0319909116179055600c80549284166001600160a01b0319938416179055600d8054919093169116179055565b6000546001600160a01b03163314610c7e5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b038116600081815260086020526040808220805460ff19166001179055517f96f70f92a95a1baee76cf33fb5179d2a057804f1637981f4e4307ed748add68b9190a250565b6000546001600160a01b03163314610cf45760405162461bcd60e51b815260040161073490611d48565b6001600160a01b038116600081815260076020526040808220805460ff19169055517f1be493c1fe0b35ef45c72eb37db7abbbb73dfd671e5f4218085604c30f690ca89190a250565b6000546001600160a01b03163314610d675760405162461bcd60e51b815260040161073490611d48565b670de0b6b3a7640000821015610dbf5760405162461bcd60e51b815260206004820152601760248201527f4d617820747820616d6f756e7420746f6f20736d616c6c0000000000000000006044820152606401610734565b68056bc75e2d63100000811015610e185760405162461bcd60e51b815260206004820152601b60248201527f4d61782077616c6c657420616d6f756e7420746f6f20736d616c6c00000000006044820152606401610734565b600991909155600a55565b60606005805461067090611e36565b6000546001600160a01b03163314610e5c5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b600061070033846107e385604051806060016040528060258152602001611ed6602591393360009081526002602090815260408083206001600160a01b038d168452909152902054919061160c565b6000610700338484611327565b6000546001600160a01b03163314610f065760405162461bcd60e51b815260040161073490611d48565b6001600160a01b038216301415610f4f5760405162461bcd60e51b815260206004820152600d60248201526c53656c6620776974686472617760981b6044820152606401610734565b816001600160a01b031663a9059cbb610f706000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff09190611c5b565b505050565b6000546001600160a01b0316331461101f5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6000546001600160a01b0316331461106a5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b0381166110cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610734565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111545760405162461bcd60e51b815260040161073490611d48565b6001600160a01b038116600081815260086020526040808220805460ff19169055517e1833734ad801e97532fe6d452adda05bf036ca3351ce1a433aa254ce50b2ac9190a250565b6000806111a98385611dc6565b9050838110156111fb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610734565b9392505050565b6001600160a01b0383166112645760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610734565b6001600160a01b0382166112c55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610734565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166113875760405162461bcd60e51b815260206004820152602160248201527f45524332303a207472616e736665722066726f6d207a65726f206164647265736044820152607360f81b6064820152608401610734565b6001600160a01b0382166113dd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a207472616e7366657220746f207a65726f2061646472657373006044820152606401610734565b600081116113fd5760405162461bcd60e51b815260040161073490611d7d565b6001600160a01b0383166000908152600e602052604081205460ff1615801561143f57506001600160a01b0383166000908152600e602052604090205460ff16155b801561146357506001600160a01b0383166000908152600f602052604090205460ff165b905080156115fb57600b5460009061148e906127109061148890869061ffff16611646565b906116c5565b905061149d8561dead83611707565b6114a78382611940565b600b549093506000906114cd906127109061148890879062010000900461ffff16611646565b90506000811180156114f05750600b54600160401b90046001600160a01b031615155b1561152157600b54611514908790600160401b90046001600160a01b031683611707565b61151e8482611940565b93505b600b546000906115469061271090611488908890640100000000900461ffff16611646565b90506000811180156115625750600c546001600160a01b031615155b1561158c57600c5461157f9088906001600160a01b031683611707565b6115898582611940565b94505b600b546000906115b09061271090611488908990600160301b900461ffff16611646565b90506000811180156115cc5750600d546001600160a01b031615155b156115f657600d546115e99089906001600160a01b031683611707565b6115f38682611940565b95505b505050505b611606848484611707565b50505050565b600081848411156116305760405162461bcd60e51b81526004016107349190611cf3565b50600061163d8486611e1f565b95945050505050565b60008261165557506000610704565b60006116618385611e00565b90508261166e8583611dde565b146111fb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610734565b60006111fb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611982565b600081116117275760405162461bcd60e51b815260040161073490611d7d565b6001600160a01b03831660009081526008602052604090205460ff1615801561176957506001600160a01b03821660009081526008602052604090205460ff16155b6117c95760405162461bcd60e51b815260206004820152602b60248201527f5472616e736665722066726f6d206f7220746f2074686520626c61636b6c697360448201526a1d1959081858d8dbdd5b9d60aa1b6064820152608401610734565b6001600160a01b03831660009081526007602052604090205460ff16158061180a57506001600160a01b03821660009081526007602052604090205460ff16155b15611875576009548111156118755760405162461bcd60e51b815260206004820152602b60248201527f546f6f206d616e7920746f6b656e732061726520676f696e6720746f2062652060448201526a1d1c985b9cd9995c9c995960aa1b6064820152608401610734565b6001600160a01b03821660009081526007602052604090205460ff1661193557600a546118c1826118bb856001600160a01b031660009081526001602052604090205490565b9061119c565b11156119355760405162461bcd60e51b815260206004820152603860248201527f546f6f206d616e7920746f6b656e732061726520676f696e6720746f2062652060448201527f73746f72656420696e20746172676574206163636f756e7400000000000000006064820152608401610734565b610ff08383836119b0565b60006111fb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061160c565b600081836119a35760405162461bcd60e51b81526004016107349190611cf3565b50600061163d8486611dde565b6001600160a01b038316611a145760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610734565b6001600160a01b038216611a765760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610734565b611ab381604051806060016040528060268152602001611e88602691396001600160a01b038616600090815260016020526040902054919061160c565b6001600160a01b038085166000908152600160205260408082209390935590841681522054611ae2908261119c565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061131a9085815260200190565b80356001600160a01b0381168114611b4d57600080fd5b919050565b803561ffff81168114611b4d57600080fd5b600060208284031215611b7657600080fd5b6111fb82611b36565b60008060408385031215611b9257600080fd5b611b9b83611b36565b9150611ba960208401611b36565b90509250929050565b600080600060608486031215611bc757600080fd5b611bd084611b36565b9250611bde60208501611b36565b9150611bec60408501611b36565b90509250925092565b600080600060608486031215611c0a57600080fd5b611c1384611b36565b9250611c2160208501611b36565b9150604084013590509250925092565b60008060408385031215611c4457600080fd5b611c4d83611b36565b946020939093013593505050565b600060208284031215611c6d57600080fd5b815180151581146111fb57600080fd5b60008060008060808587031215611c9357600080fd5b611c9c85611b52565b9350611caa60208601611b52565b9250611cb860408601611b52565b9150611cc660608601611b52565b905092959194509250565b60008060408385031215611ce457600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015611d2057858101830151858201604001528201611d04565b81811115611d32576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b60008219821115611dd957611dd9611e71565b500190565b600082611dfb57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611e1a57611e1a611e71565b500290565b600082821015611e3157611e31611e71565b500390565b600181811c90821680611e4a57607f821691505b60208210811415611e6b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c9144e043cf9a9ecce5ade175cfc1a51384df5ef44d99b974b3e2730405d258b64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061028a5760003560e01c80637d1db4a51161015c578063a457c2d7116100ce578063dc06f1ad11610087578063dc06f1ad146105da578063dd62ed3e146105ef578063ea2f0b3714610628578063f2b3c80914610340578063f2fde38b1461063b578063fee98cc61461064e57600080fd5b8063a457c2d71461056d578063a9059cbb14610580578063ae85028114610593578063b29a8140146105a9578063b9038fe1146105bc578063c0b0fda2146105cc57600080fd5b80638ac19222116101205780638ac19222146105005780638da5cb5b146104ef578063931e48e61461051357806395d89b41146105265780639858d3da1461052e578063a0fae62f1461055a57600080fd5b80637d1db4a5146104ad5780637ffdc7ea146104b65780638597600f146104c957806388bb012a146104dc578063893d20e8146104ef57600080fd5b8063395093511161020057806350e8676c116101b957806350e8676c146103405780635342acb41461042d5780635bbb2452146104595780636c0a24eb1461047357806370a082311461047c578063715018a6146104a557600080fd5b806339509351146103715780633c3c3275146103845780633d074110146103b057806340b7566a146103db578063437823ec14610407578063459ea72d1461041a57600080fd5b806323b872dd1161025257806323b872dd1461030657806328f0b257146103195780632a62b52d146103405780632dde66f714610349578063313ce5671461035c578063368f243e1461034057600080fd5b806306fdde031461028f578063095ea7b3146102ad578063178872ac146102d057806318160ddd146102e557806320d947e8146102f7575b600080fd5b610297610661565b6040516102a49190611cf3565b60405180910390f35b6102c06102bb366004611c31565b6106f3565b60405190151581526020016102a4565b6102e36102de366004611b64565b61070a565b005b6003545b6040519081526020016102a4565b6102e9670de0b6b3a764000081565b6102c0610314366004611bf5565b610789565b600b5461032d9062010000900461ffff1681565b60405161ffff90911681526020016102a4565b61032d61019081565b6102e3610357366004611b64565b6107f2565b60065460405160ff90911681526020016102a4565b6102c061037f366004611c31565b61083d565b6102c0610392366004611b64565b6001600160a01b03166000908152600f602052604090205460ff1690565b600c546103c3906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b6102c06103e9366004611b64565b6001600160a01b031660009081526007602052604090205460ff1690565b6102e3610415366004611b64565b610873565b6102e3610428366004611c7d565b6108c1565b6102c061043b366004611b64565b6001600160a01b03166000908152600e602052604090205460ff1690565b600b546103c390600160401b90046001600160a01b031681565b6102e9600a5481565b6102e961048a366004611b64565b6001600160a01b031660009081526001602052604090205490565b6102e3610a7b565b6102e960095481565b600d546103c3906001600160a01b031681565b6102e36104d7366004611bb2565b610aef565b6102e36104ea366004611b64565b610c54565b6000546001600160a01b03166103c3565b6102e361050e366004611b64565b610cca565b6102e3610521366004611cd1565b610d3d565b610297610e23565b6102c061053c366004611b64565b6001600160a01b031660009081526008602052604090205460ff1690565b6102e3610568366004611b64565b610e32565b6102c061057b366004611c31565b610e80565b6102c061058e366004611c31565b610ecf565b600b5461032d90640100000000900461ffff1681565b6102e36105b7366004611c31565b610edc565b6102e968056bc75e2d6310000081565b600b5461032d9061ffff1681565b600b5461032d90600160301b900461ffff1681565b6102e96105fd366004611b7f565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6102e3610636366004611b64565b610ff5565b6102e3610649366004611b64565b611040565b6102e361065c366004611b64565b61112a565b60606004805461067090611e36565b80601f016020809104026020016040519081016040528092919081815260200182805461069c90611e36565b80156106e95780601f106106be576101008083540402835291602001916106e9565b820191906000526020600020905b8154815290600101906020018083116106cc57829003601f168201915b5050505050905090565b6000610700338484611202565b5060015b92915050565b6000546001600160a01b0316331461073d5760405162461bcd60e51b815260040161073490611d48565b60405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517fb6ef7f73baab9052ab7fc53a6a829c60fc2061319cbc5a8815cda0b168eaf2389190a250565b6000610796848484611327565b6107e884336107e385604051806060016040528060288152602001611eae602891396001600160a01b038a166000908152600260209081526040808320338452909152902054919061160c565b611202565b5060019392505050565b6000546001600160a01b0316331461081c5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916107009185906107e3908661119c565b6000546001600160a01b0316331461089d5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b6000546001600160a01b031633146108eb5760405162461bcd60e51b815260040161073490611d48565b61019061ffff851611156109355760405162461bcd60e51b81526020600482015260116024820152704275726e20666565206f766572666c6f7760781b6044820152606401610734565b61019061ffff841611156109835760405162461bcd60e51b8152602060048201526015602482015274547265617375727920666565206f766572666c6f7760581b6044820152606401610734565b61019061ffff831611156109d05760405162461bcd60e51b81526020600482015260146024820152735374616b696e6720666565206f766572666c6f7760601b6044820152606401610734565b61019061ffff82161115610a1f5760405162461bcd60e51b8152602060048201526016602482015275436f6d6d756e69747920666565206f766572666c6f7760501b6044820152606401610734565b600b805461ffff95861663ffffffff199091161762010000948616949094029390931767ffffffff0000000019166401000000009285169290920267ffff000000000000191691909117600160301b9190931602919091179055565b6000546001600160a01b03163314610aa55760405162461bcd60e51b815260040161073490611d48565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610b195760405162461bcd60e51b815260040161073490611d48565b6001600160a01b038316610b675760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081d1c99585cdd5c9e481c1bdbdb605a1b6044820152606401610734565b6001600160a01b038216610bb45760405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081cdd185ada5b99c81c1bdbdb60621b6044820152606401610734565b6001600160a01b038116610c035760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590818dbdb5b5d5b9a5d1e481c1bdbdb60521b6044820152606401610734565b600b80546001600160a01b03948516600160401b0268010000000000000000600160e01b0319909116179055600c80549284166001600160a01b0319938416179055600d8054919093169116179055565b6000546001600160a01b03163314610c7e5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b038116600081815260086020526040808220805460ff19166001179055517f96f70f92a95a1baee76cf33fb5179d2a057804f1637981f4e4307ed748add68b9190a250565b6000546001600160a01b03163314610cf45760405162461bcd60e51b815260040161073490611d48565b6001600160a01b038116600081815260076020526040808220805460ff19169055517f1be493c1fe0b35ef45c72eb37db7abbbb73dfd671e5f4218085604c30f690ca89190a250565b6000546001600160a01b03163314610d675760405162461bcd60e51b815260040161073490611d48565b670de0b6b3a7640000821015610dbf5760405162461bcd60e51b815260206004820152601760248201527f4d617820747820616d6f756e7420746f6f20736d616c6c0000000000000000006044820152606401610734565b68056bc75e2d63100000811015610e185760405162461bcd60e51b815260206004820152601b60248201527f4d61782077616c6c657420616d6f756e7420746f6f20736d616c6c00000000006044820152606401610734565b600991909155600a55565b60606005805461067090611e36565b6000546001600160a01b03163314610e5c5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b600061070033846107e385604051806060016040528060258152602001611ed6602591393360009081526002602090815260408083206001600160a01b038d168452909152902054919061160c565b6000610700338484611327565b6000546001600160a01b03163314610f065760405162461bcd60e51b815260040161073490611d48565b6001600160a01b038216301415610f4f5760405162461bcd60e51b815260206004820152600d60248201526c53656c6620776974686472617760981b6044820152606401610734565b816001600160a01b031663a9059cbb610f706000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff09190611c5b565b505050565b6000546001600160a01b0316331461101f5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6000546001600160a01b0316331461106a5760405162461bcd60e51b815260040161073490611d48565b6001600160a01b0381166110cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610734565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111545760405162461bcd60e51b815260040161073490611d48565b6001600160a01b038116600081815260086020526040808220805460ff19169055517e1833734ad801e97532fe6d452adda05bf036ca3351ce1a433aa254ce50b2ac9190a250565b6000806111a98385611dc6565b9050838110156111fb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610734565b9392505050565b6001600160a01b0383166112645760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610734565b6001600160a01b0382166112c55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610734565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166113875760405162461bcd60e51b815260206004820152602160248201527f45524332303a207472616e736665722066726f6d207a65726f206164647265736044820152607360f81b6064820152608401610734565b6001600160a01b0382166113dd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a207472616e7366657220746f207a65726f2061646472657373006044820152606401610734565b600081116113fd5760405162461bcd60e51b815260040161073490611d7d565b6001600160a01b0383166000908152600e602052604081205460ff1615801561143f57506001600160a01b0383166000908152600e602052604090205460ff16155b801561146357506001600160a01b0383166000908152600f602052604090205460ff165b905080156115fb57600b5460009061148e906127109061148890869061ffff16611646565b906116c5565b905061149d8561dead83611707565b6114a78382611940565b600b549093506000906114cd906127109061148890879062010000900461ffff16611646565b90506000811180156114f05750600b54600160401b90046001600160a01b031615155b1561152157600b54611514908790600160401b90046001600160a01b031683611707565b61151e8482611940565b93505b600b546000906115469061271090611488908890640100000000900461ffff16611646565b90506000811180156115625750600c546001600160a01b031615155b1561158c57600c5461157f9088906001600160a01b031683611707565b6115898582611940565b94505b600b546000906115b09061271090611488908990600160301b900461ffff16611646565b90506000811180156115cc5750600d546001600160a01b031615155b156115f657600d546115e99089906001600160a01b031683611707565b6115f38682611940565b95505b505050505b611606848484611707565b50505050565b600081848411156116305760405162461bcd60e51b81526004016107349190611cf3565b50600061163d8486611e1f565b95945050505050565b60008261165557506000610704565b60006116618385611e00565b90508261166e8583611dde565b146111fb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610734565b60006111fb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611982565b600081116117275760405162461bcd60e51b815260040161073490611d7d565b6001600160a01b03831660009081526008602052604090205460ff1615801561176957506001600160a01b03821660009081526008602052604090205460ff16155b6117c95760405162461bcd60e51b815260206004820152602b60248201527f5472616e736665722066726f6d206f7220746f2074686520626c61636b6c697360448201526a1d1959081858d8dbdd5b9d60aa1b6064820152608401610734565b6001600160a01b03831660009081526007602052604090205460ff16158061180a57506001600160a01b03821660009081526007602052604090205460ff16155b15611875576009548111156118755760405162461bcd60e51b815260206004820152602b60248201527f546f6f206d616e7920746f6b656e732061726520676f696e6720746f2062652060448201526a1d1c985b9cd9995c9c995960aa1b6064820152608401610734565b6001600160a01b03821660009081526007602052604090205460ff1661193557600a546118c1826118bb856001600160a01b031660009081526001602052604090205490565b9061119c565b11156119355760405162461bcd60e51b815260206004820152603860248201527f546f6f206d616e7920746f6b656e732061726520676f696e6720746f2062652060448201527f73746f72656420696e20746172676574206163636f756e7400000000000000006064820152608401610734565b610ff08383836119b0565b60006111fb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061160c565b600081836119a35760405162461bcd60e51b81526004016107349190611cf3565b50600061163d8486611dde565b6001600160a01b038316611a145760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610734565b6001600160a01b038216611a765760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610734565b611ab381604051806060016040528060268152602001611e88602691396001600160a01b038616600090815260016020526040902054919061160c565b6001600160a01b038085166000908152600160205260408082209390935590841681522054611ae2908261119c565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061131a9085815260200190565b80356001600160a01b0381168114611b4d57600080fd5b919050565b803561ffff81168114611b4d57600080fd5b600060208284031215611b7657600080fd5b6111fb82611b36565b60008060408385031215611b9257600080fd5b611b9b83611b36565b9150611ba960208401611b36565b90509250929050565b600080600060608486031215611bc757600080fd5b611bd084611b36565b9250611bde60208501611b36565b9150611bec60408501611b36565b90509250925092565b600080600060608486031215611c0a57600080fd5b611c1384611b36565b9250611c2160208501611b36565b9150604084013590509250925092565b60008060408385031215611c4457600080fd5b611c4d83611b36565b946020939093013593505050565b600060208284031215611c6d57600080fd5b815180151581146111fb57600080fd5b60008060008060808587031215611c9357600080fd5b611c9c85611b52565b9350611caa60208601611b52565b9250611cb860408601611b52565b9150611cc660608601611b52565b905092959194509250565b60008060408385031215611ce457600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015611d2057858101830151858201604001528201611d04565b81811115611d32576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b60008219821115611dd957611dd9611e71565b500190565b600082611dfb57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611e1a57611e1a611e71565b500290565b600082821015611e3157611e31611e71565b500390565b600181811c90821680611e4a57607f821691505b60208210811415611e6b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c9144e043cf9a9ecce5ade175cfc1a51384df5ef44d99b974b3e2730405d258b64736f6c63430008070033

Deployed Bytecode Sourcemap

33772:4616:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20978:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22481:161;;;;;;:::i;:::-;;:::i;:::-;;;3336:14:1;;3329:22;3311:41;;3299:2;3284:18;22481:161:0;3171:187:1;30964:172:0;;;;;;:::i;:::-;;:::i;:::-;;21454:108;21542:12;;21454:108;;;13365:25:1;;;13353:2;13338:18;21454:108:0;13219:177:1;29094:57:0;;29144:7;29094:57;;23113:397;;;;;;:::i;:::-;;:::i;34216:32::-;;;;;;;;;;;;;;;13200:6:1;13188:19;;;13170:38;;13158:2;13143:18;34216:32:0;13026:188:1;34026:44:0;;34067:3;34026:44;;35144:108;;;;;;:::i;:::-;;:::i;21137:92::-;21212:9;;21137:92;;21212:9;;;;13543:36:1;;13531:2;13516:18;21137:92:0;13401:184:1;23918:210:0;;;;;;:::i;:::-;;:::i;35373:111::-;;;;;;:::i;:::-;-1:-1:-1;;;;;35458:18:0;35434:4;35458:18;;;:7;:18;;;;;;;;;35373:111;34461:27;;;;;-1:-1:-1;;;;;34461:27:0;;;;;;-1:-1:-1;;;;;2848:32:1;;;2830:51;;2818:2;2803:18;34461:27:0;2684:203:1;31623:138:0;;;;;;:::i;:::-;-1:-1:-1;;;;;31719:34:0;31695:4;31719:34;;;:25;:34;;;;;;;;;31623:138;34769:113;;;;;;:::i;:::-;;:::i;35492:604::-;;;;;;:::i;:::-;;:::i;35010:126::-;;;;;;:::i;:::-;-1:-1:-1;;;;;35101:27:0;35077:4;35101:27;;;:18;:27;;;;;;;;;35010:126;34426:28;;;;;-1:-1:-1;;;34426:28:0;;-1:-1:-1;;;;;34426:28:0;;;29278:46;;;;;;21624:127;;;;;;:::i;:::-;-1:-1:-1;;;;;21725:18:0;21698:7;21725:18;;;:9;:18;;;;;;;21624:127;1643:148;;;:::i;29230:41::-;;;;;;34495:29;;;;;-1:-1:-1;;;;;34495:29:0;;;36104:483;;;;;;:::i;:::-;;:::i;30382:151::-;;;;;;:::i;:::-;;:::i;20821:94::-;20873:7;1493:6;-1:-1:-1;;;;;1493:6:0;20821:94;;31306:169;;;;;;:::i;:::-;;:::i;32016:472::-;;;;;;:::i;:::-;;:::i;21294:96::-;;;:::i;30672:120::-;;;;;;:::i;:::-;-1:-1:-1;;;;;30765:19:0;30741:4;30765:19;;;:10;:19;;;;;;;;;30672:120;35260:105;;;;;;:::i;:::-;;:::i;24630:311::-;;;;;;:::i;:::-;;:::i;21963:167::-;;;;;;:::i;:::-;;:::i;34280:31::-;;;;;;;;;;;;33408:290;;;;;;:::i;:::-;;:::i;29158:63::-;;29212:9;29158:63;;34156:28;;;;;;;;;34350:33;;;;;-1:-1:-1;;;34350:33:0;;;;;;22192:143;;;;;;:::i;:::-;-1:-1:-1;;;;;22300:18:0;;;22273:7;22300:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22192:143;34890:112;;;;;;:::i;:::-;;:::i;1799:244::-;;;;;;:::i;:::-;;:::i;30063:156::-;;;;;;:::i;:::-;;:::i;20978:92::-;21024:13;21057:5;21050:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20978:92;:::o;22481:161::-;22556:4;22573:39;756:10;22596:7;22605:6;22573:8;:39::i;:::-;-1:-1:-1;22630:4:0;22481:161;;;;;:::o;30964:172::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;31040:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;:41;;-1:-1:-1;;31040:41:0::1;31077:4;31040:41;::::0;;31097:31;::::1;::::0;31040:34;31097:31:::1;30964:172:::0;:::o;23113:397::-;23245:4;23262:36;23272:6;23280:9;23291:6;23262:9;:36::i;:::-;23309:171;23332:6;756:10;23380:89;23418:6;23380:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23380:19:0;;;;;;:11;:19;;;;;;;;756:10;23380:33;;;;;;;;;;:37;:89::i;:::-;23309:8;:171::i;:::-;-1:-1:-1;23498:4:0;23113:397;;;;;:::o;35144:108::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35218:18:0::1;35239:5;35218:18:::0;;;:7:::1;:18;::::0;;;;:26;;-1:-1:-1;;35218:26:0::1;::::0;;35144:108::o;23918:210::-;756:10;23998:4;24047:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;24047:34:0;;;;;;;;;;23998:4;;24015:83;;24038:7;;24047:50;;24086:10;24047:38;:50::i;34769:113::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34840:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;34840:34:0::1;34870:4;34840:34;::::0;;34769:113::o;35492:604::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;33944:3:::1;35675:23;::::0;::::1;;;35667:53;;;::::0;-1:-1:-1;;;35667:53:0;;7943:2:1;35667:53:0::1;::::0;::::1;7925:21:1::0;7982:2;7962:18;;;7955:30;-1:-1:-1;;;8001:18:1;;;7994:47;8058:18;;35667:53:0::1;7741:341:1::0;35667:53:0::1;34006:3;35739:31;::::0;::::1;;;35731:65;;;::::0;-1:-1:-1;;;35731:65:0;;12529:2:1;35731:65:0::1;::::0;::::1;12511:21:1::0;12568:2;12548:18;;;12541:30;-1:-1:-1;;;12587:18:1;;;12580:51;12648:18;;35731:65:0::1;12327:345:1::0;35731:65:0::1;34067:3;35815:29;::::0;::::1;;;35807:62;;;::::0;-1:-1:-1;;;35807:62:0;;4571:2:1;35807:62:0::1;::::0;::::1;4553:21:1::0;4610:2;4590:18;;;4583:30;-1:-1:-1;;;4629:18:1;;;4622:50;4689:18;;35807:62:0::1;4369:344:1::0;35807:62:0::1;34130:3;35888:33;::::0;::::1;;;35880:68;;;::::0;-1:-1:-1;;;35880:68:0;;10543:2:1;35880:68:0::1;::::0;::::1;10525:21:1::0;10582:2;10562:18;;;10555:30;-1:-1:-1;;;10601:18:1;;;10594:52;10663:18;;35880:68:0::1;10341:346:1::0;35880:68:0::1;35959:8;:18:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;35988:26:0;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;36060:28:0;36025:24;;;::::1;::::0;;;::::1;-1:-1:-1::0;;36060:28:0;;;;;-1:-1:-1;;;36060:28:0;;;::::1;;::::0;;;::::1;::::0;;35492:604::o;1643:148::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;1750:1:::1;1734:6:::0;;1713:40:::1;::::0;-1:-1:-1;;;;;1734:6:0;;::::1;::::0;1713:40:::1;::::0;1750:1;;1713:40:::1;1781:1;1764:19:::0;;-1:-1:-1;;;;;;1764:19:0::1;::::0;;1643:148::o;36104:483::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36268:26:0;::::1;36260:60;;;::::0;-1:-1:-1;;;36260:60:0;;10193:2:1;36260:60:0::1;::::0;::::1;10175:21:1::0;10232:2;10212:18;;;10205:30;-1:-1:-1;;;10251:18:1;;;10244:51;10312:18;;36260:60:0::1;9991:345:1::0;36260:60:0::1;-1:-1:-1::0;;;;;36339:25:0;::::1;36331:58;;;::::0;-1:-1:-1;;;36331:58:0;;12879:2:1;36331:58:0::1;::::0;::::1;12861:21:1::0;12918:2;12898:18;;;12891:30;-1:-1:-1;;;12937:18:1;;;12930:50;12997:18;;36331:58:0::1;12677:344:1::0;36331:58:0::1;-1:-1:-1::0;;;;;36408:27:0;::::1;36400:62;;;::::0;-1:-1:-1;;;36400:62:0;;7190:2:1;36400:62:0::1;::::0;::::1;7172:21:1::0;7229:2;7209:18;;;7202:30;-1:-1:-1;;;7248:18:1;;;7241:52;7310:18;;36400:62:0::1;6988:346:1::0;36400:62:0::1;36473:13;:28:::0;;-1:-1:-1;;;;;36473:28:0;;::::1;-1:-1:-1::0;;;36473:28:0::1;-1:-1:-1::0;;;;;;36473:28:0;;::::1;;::::0;;36512:12:::1;:26:::0;;;;::::1;-1:-1:-1::0;;;;;;36512:26:0;;::::1;;::::0;;36549:14:::1;:30:::0;;;;;::::1;::::0;::::1;;::::0;;36104:483::o;30382:151::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30455:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;:26;;-1:-1:-1;;30455:26:0::1;30477:4;30455:26;::::0;;30497:28;::::1;::::0;30455:19;30497:28:::1;30382:151:::0;:::o;31306:169::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31380:34:0;::::1;31417:5;31380:34:::0;;;:25:::1;:34;::::0;;;;;:42;;-1:-1:-1;;31380:42:0::1;::::0;;31438:29;::::1;::::0;31417:5;31438:29:::1;31306:169:::0;:::o;32016:472::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;29144:7:::1;32175:11;:38;;32153:111;;;::::0;-1:-1:-1;;;32153:111:0;;9416:2:1;32153:111:0::1;::::0;::::1;9398:21:1::0;9455:2;9435:18;;;9428:30;9494:25;9474:18;;;9467:53;9537:18;;32153:111:0::1;9214:347:1::0;32153:111:0::1;29212:9;32297:15;:46;;32275:123;;;::::0;-1:-1:-1;;;32275:123:0;;8650:2:1;32275:123:0::1;::::0;::::1;8632:21:1::0;8689:2;8669:18;;;8662:30;8728:29;8708:18;;;8701:57;8775:18;;32275:123:0::1;8448:351:1::0;32275:123:0::1;32409:12;:26:::0;;;;32446:16:::1;:34:::0;32016:472::o;21294:96::-;21342:13;21375:7;21368:14;;;;;:::i;35260:105::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35332:18:0::1;;::::0;;;:7:::1;:18;::::0;;;;:25;;-1:-1:-1;;35332:25:0::1;35353:4;35332:25;::::0;;35260:105::o;24630:311::-;24715:4;24732:179;756:10;24782:7;24804:96;24843:15;24804:96;;;;;;;;;;;;;;;;;756:10;24804:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;24804:34:0;;;;;;;;;;;;:38;:96::i;21963:167::-;22041:4;22058:42;756:10;22082:9;22093:6;22058:9;:42::i;33408:290::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33581:29:0;::::1;33605:4;33581:29;;33573:55;;;::::0;-1:-1:-1;;;33573:55:0;;6488:2:1;33573:55:0::1;::::0;::::1;6470:21:1::0;6527:2;6507:18;;;6500:30;-1:-1:-1;;;6546:18:1;;;6539:43;6599:18;;33573:55:0::1;6286:337:1::0;33573:55:0::1;33646:12;-1:-1:-1::0;;;;;33639:29:0::1;;33669:7;1466::::0;1493:6;-1:-1:-1;;;;;1493:6:0;;1420:87;33669:7:::1;33639:51;::::0;-1:-1:-1;;;;;;33639:51:0::1;::::0;;;;;;-1:-1:-1;;;;;3084:32:1;;;33639:51:0::1;::::0;::::1;3066::1::0;3133:18;;;3126:34;;;3039:18;;33639:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33408:290:::0;;:::o;34890:112::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34959:27:0::1;34989:5;34959:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;34959:35:0::1;::::0;;34890:112::o;1799:244::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1888:22:0;::::1;1880:73;;;::::0;-1:-1:-1;;;1880:73:0;;4920:2:1;1880:73:0::1;::::0;::::1;4902:21:1::0;4959:2;4939:18;;;4932:30;4998:34;4978:18;;;4971:62;-1:-1:-1;;;5049:18:1;;;5042:36;5095:19;;1880:73:0::1;4718:402:1::0;1880:73:0::1;1990:6;::::0;;1969:38:::1;::::0;-1:-1:-1;;;;;1969:38:0;;::::1;::::0;1990:6;::::1;::::0;1969:38:::1;::::0;::::1;2018:6;:17:::0;;-1:-1:-1;;;;;;2018:17:0::1;-1:-1:-1::0;;;;;2018:17:0;;;::::1;::::0;;;::::1;::::0;;1799:244::o;30063:156::-;1466:7;1493:6;-1:-1:-1;;;;;1493:6:0;756:10;1555:23;1547:68;;;;-1:-1:-1;;;1547:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30138:19:0;::::1;30160:5;30138:19:::0;;;:10:::1;:19;::::0;;;;;:27;;-1:-1:-1;;30138:27:0::1;::::0;;30181:30;::::1;::::0;30160:5;30181:30:::1;30063:156:::0;:::o;6174:181::-;6232:7;;6264:5;6268:1;6264;:5;:::i;:::-;6252:17;;6293:1;6288;:6;;6280:46;;;;-1:-1:-1;;;6280:46:0;;5730:2:1;6280:46:0;;;5712:21:1;5769:2;5749:18;;;5742:30;5808:29;5788:18;;;5781:57;5855:18;;6280:46:0;5528:351:1;6280:46:0;6346:1;6174:181;-1:-1:-1;;;6174:181:0:o;27653:372::-;-1:-1:-1;;;;;27781:19:0;;27773:68;;;;-1:-1:-1;;;27773:68:0;;11300:2:1;27773:68:0;;;11282:21:1;11339:2;11319:18;;;11312:30;11378:34;11358:18;;;11351:62;-1:-1:-1;;;11429:18:1;;;11422:34;11473:19;;27773:68:0;11098:400:1;27773:68:0;-1:-1:-1;;;;;27860:21:0;;27852:68;;;;-1:-1:-1;;;27852:68:0;;5327:2:1;27852:68:0;;;5309:21:1;5366:2;5346:18;;;5339:30;5405:34;5385:18;;;5378:62;-1:-1:-1;;;5456:18:1;;;5449:32;5498:19;;27852:68:0;5125:398:1;27852:68:0;-1:-1:-1;;;;;27933:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;27985:32;;13365:25:1;;;27985:32:0;;13338:18:1;27985:32:0;;;;;;;;27653:372;;;:::o;36595:1790::-;-1:-1:-1;;;;;36727:18:0;;36719:64;;;;-1:-1:-1;;;36719:64:0;;6086:2:1;36719:64:0;;;6068:21:1;6125:2;6105:18;;;6098:30;6164:34;6144:18;;;6137:62;-1:-1:-1;;;6215:18:1;;;6208:31;6256:19;;36719:64:0;5884:397:1;36719:64:0;-1:-1:-1;;;;;36802:16:0;;36794:60;;;;-1:-1:-1;;;36794:60:0;;6830:2:1;36794:60:0;;;6812:21:1;6869:2;6849:18;;;6842:30;6908:33;6888:18;;;6881:61;6959:18;;36794:60:0;6628:355:1;36794:60:0;36882:1;36873:6;:10;36865:64;;;;-1:-1:-1;;;36865:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37105:24:0;;37089:12;37105:24;;;:18;:24;;;;;;;;37104:25;:65;;;;-1:-1:-1;;;;;;37147:22:0;;;;;;:18;:22;;;;;;;;37146:23;37104:65;:93;;;;-1:-1:-1;;;;;;37186:11:0;;;;;;:7;:11;;;;;;;;37104:93;37089:108;;37214:7;37210:1122;;;37273:8;;37238:21;;37262:31;;37287:5;;37262:20;;:6;;37273:8;;37262:10;:20::i;:::-;:24;;:31::i;:::-;37238:55;;37308:42;37324:4;28885:42;37336:13;37308:15;:42::i;:::-;37374:25;:6;37385:13;37374:10;:25::i;:::-;37455:12;;37365:34;;-1:-1:-1;37416:25:0;;37444:35;;37473:5;;37444:24;;37365:34;;37455:12;;;;;37444:10;:24::i;:35::-;37416:63;;37518:1;37498:17;:21;:52;;;;-1:-1:-1;37523:13:0;;-1:-1:-1;;;37523:13:0;;-1:-1:-1;;;;;37523:13:0;:27;;37498:52;37494:205;;;37593:13;;37571:55;;37587:4;;-1:-1:-1;;;37593:13:0;;-1:-1:-1;;;;;37593:13:0;37608:17;37571:15;:55::i;:::-;37654:29;:6;37665:17;37654:10;:29::i;:::-;37645:38;;37494:205;37765:11;;37727:24;;37754:34;;37782:5;;37754:23;;:6;;37765:11;;;;;37754:10;:23::i;:34::-;37727:61;;37826:1;37807:16;:20;:50;;;;-1:-1:-1;37831:12:0;;-1:-1:-1;;;;;37831:12:0;:26;;37807:50;37803:200;;;37900:12;;37878:53;;37894:4;;-1:-1:-1;;;;;37900:12:0;37914:16;37878:15;:53::i;:::-;37959:28;:6;37970:16;37959:10;:28::i;:::-;37950:37;;37803:200;38071:13;;38031:26;;38060:36;;38090:5;;38060:25;;:6;;-1:-1:-1;;;38071:13:0;;;;38060:10;:25::i;:36::-;38031:65;;38136:1;38115:18;:22;:54;;;;-1:-1:-1;38141:14:0;;-1:-1:-1;;;;;38141:14:0;:28;;38115:54;38111:210;;;38212:14;;38190:57;;38206:4;;-1:-1:-1;;;;;38212:14:0;38228:18;38190:15;:57::i;:::-;38275:30;:6;38286:18;38275:10;:30::i;:::-;38266:39;;38111:210;37223:1109;;;;37210:1122;38344:33;38360:4;38366:2;38370:6;38344:15;:33::i;:::-;36708:1677;36595:1790;;;:::o;7077:192::-;7163:7;7199:12;7191:6;;;;7183:29;;;;-1:-1:-1;;;7183:29:0;;;;;;;;:::i;:::-;-1:-1:-1;7223:9:0;7235:5;7239:1;7235;:5;:::i;:::-;7223:17;7077:192;-1:-1:-1;;;;;7077:192:0:o;7528:471::-;7586:7;7831:6;7827:47;;-1:-1:-1;7861:1:0;7854:8;;7827:47;7886:9;7898:5;7902:1;7898;:5;:::i;:::-;7886:17;-1:-1:-1;7931:1:0;7922:5;7926:1;7886:17;7922:5;:::i;:::-;:10;7914:56;;;;-1:-1:-1;;;7914:56:0;;7541:2:1;7914:56:0;;;7523:21:1;7580:2;7560:18;;;7553:30;7619:34;7599:18;;;7592:62;-1:-1:-1;;;7670:18:1;;;7663:31;7711:19;;7914:56:0;7339:397:1;8475:132:0;8533:7;8560:39;8564:1;8567;8560:39;;;;;;;;;;;;;;;;;:3;:39::i;32496:904::-;32645:1;32636:6;:10;32628:64;;;;-1:-1:-1;;;32628:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32714:16:0;;;;;;:10;:16;;;;;;;;32713:17;:36;;;;-1:-1:-1;;;;;;32735:14:0;;;;;;:10;:14;;;;;;;;32734:15;32713:36;32705:92;;;;-1:-1:-1;;;32705:92:0;;12117:2:1;32705:92:0;;;12099:21:1;12156:2;12136:18;;;12129:30;12195:34;12175:18;;;12168:62;-1:-1:-1;;;12246:18:1;;;12239:41;12297:19;;32705:92:0;11915:407:1;32705:92:0;-1:-1:-1;;;;;32846:31:0;;;;;;:25;:31;;;;;;;;32845:32;;:66;;-1:-1:-1;;;;;;32882:29:0;;;;;;:25;:29;;;;;;;;32881:30;32845:66;32841:226;;;32964:12;;32954:6;:22;;32928:127;;;;-1:-1:-1;;;32928:127:0;;11705:2:1;32928:127:0;;;11687:21:1;11744:2;11724:18;;;11717:30;11783:34;11763:18;;;11756:62;-1:-1:-1;;;11834:18:1;;;11827:41;11885:19;;32928:127:0;11503:407:1;32928:127:0;-1:-1:-1;;;;;33126:29:0;;;;;;:25;:29;;;;;;;;33121:226;;33227:16;;33198:25;33216:6;33198:13;33208:2;-1:-1:-1;;;;;21725:18:0;21698:7;21725:18;;;:9;:18;;;;;;;21624:127;33198:13;:17;;:25::i;:::-;:45;;33172:163;;;;-1:-1:-1;;;33172:163:0;;9768:2:1;33172:163:0;;;9750:21:1;9807:2;9787:18;;;9780:30;9846:34;9826:18;;;9819:62;9917:26;9897:18;;;9890:54;9961:19;;33172:163:0;9566:420:1;33172:163:0;33359:33;33375:4;33381:2;33385:6;33359:15;:33::i;6638:136::-;6696:7;6723:43;6727:1;6730;6723:43;;;;;;;;;;;;;;;;;:3;:43::i;9103:278::-;9189:7;9224:12;9217:5;9209:28;;;;-1:-1:-1;;;9209:28:0;;;;;;;;:::i;:::-;-1:-1:-1;9248:9:0;9260:5;9264:1;9260;:5;:::i;25431:513::-;-1:-1:-1;;;;;25571:20:0;;25563:70;;;;-1:-1:-1;;;25563:70:0;;10894:2:1;25563:70:0;;;10876:21:1;10933:2;10913:18;;;10906:30;10972:34;10952:18;;;10945:62;-1:-1:-1;;;11023:18:1;;;11016:35;11068:19;;25563:70:0;10692:401:1;25563:70:0;-1:-1:-1;;;;;25652:23:0;;25644:71;;;;-1:-1:-1;;;25644:71:0;;4167:2:1;25644:71:0;;;4149:21:1;4206:2;4186:18;;;4179:30;4245:34;4225:18;;;4218:62;-1:-1:-1;;;4296:18:1;;;4289:33;4339:19;;25644:71:0;3965:399:1;25644:71:0;25748;25770:6;25748:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25748:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;25728:17:0;;;;;;;:9;:17;;;;;;:91;;;;25853:20;;;;;;;:32;;25878:6;25853:24;:32::i;:::-;-1:-1:-1;;;;;25830:20:0;;;;;;;:9;:20;;;;;;;:55;;;;25901:35;;;;;;;;;;25929:6;13365:25:1;;13353:2;13338:18;;13219:177;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:159::-;259:20;;319:6;308:18;;298:29;;288:57;;341:1;338;331:12;356:186;415:6;468:2;456:9;447:7;443:23;439:32;436:52;;;484:1;481;474:12;436:52;507:29;526:9;507:29;:::i;547:260::-;615:6;623;676:2;664:9;655:7;651:23;647:32;644:52;;;692:1;689;682:12;644:52;715:29;734:9;715:29;:::i;:::-;705:39;;763:38;797:2;786:9;782:18;763:38;:::i;:::-;753:48;;547:260;;;;;:::o;812:334::-;889:6;897;905;958:2;946:9;937:7;933:23;929:32;926:52;;;974:1;971;964:12;926:52;997:29;1016:9;997:29;:::i;:::-;987:39;;1045:38;1079:2;1068:9;1064:18;1045:38;:::i;:::-;1035:48;;1102:38;1136:2;1125:9;1121:18;1102:38;:::i;:::-;1092:48;;812:334;;;;;:::o;1151:328::-;1228:6;1236;1244;1297:2;1285:9;1276:7;1272:23;1268:32;1265:52;;;1313:1;1310;1303:12;1265:52;1336:29;1355:9;1336:29;:::i;:::-;1326:39;;1384:38;1418:2;1407:9;1403:18;1384:38;:::i;:::-;1374:48;;1469:2;1458:9;1454:18;1441:32;1431:42;;1151:328;;;;;:::o;1484:254::-;1552:6;1560;1613:2;1601:9;1592:7;1588:23;1584:32;1581:52;;;1629:1;1626;1619:12;1581:52;1652:29;1671:9;1652:29;:::i;:::-;1642:39;1728:2;1713:18;;;;1700:32;;-1:-1:-1;;;1484:254:1:o;1743:277::-;1810:6;1863:2;1851:9;1842:7;1838:23;1834:32;1831:52;;;1879:1;1876;1869:12;1831:52;1911:9;1905:16;1964:5;1957:13;1950:21;1943:5;1940:32;1930:60;;1986:1;1983;1976:12;2025:401;2107:6;2115;2123;2131;2184:3;2172:9;2163:7;2159:23;2155:33;2152:53;;;2201:1;2198;2191:12;2152:53;2224:28;2242:9;2224:28;:::i;:::-;2214:38;;2271:37;2304:2;2293:9;2289:18;2271:37;:::i;:::-;2261:47;;2327:37;2360:2;2349:9;2345:18;2327:37;:::i;:::-;2317:47;;2383:37;2416:2;2405:9;2401:18;2383:37;:::i;:::-;2373:47;;2025:401;;;;;;;:::o;2431:248::-;2499:6;2507;2560:2;2548:9;2539:7;2535:23;2531:32;2528:52;;;2576:1;2573;2566:12;2528:52;-1:-1:-1;;2599:23:1;;;2669:2;2654:18;;;2641:32;;-1:-1:-1;2431:248:1:o;3363:597::-;3475:4;3504:2;3533;3522:9;3515:21;3565:6;3559:13;3608:6;3603:2;3592:9;3588:18;3581:34;3633:1;3643:140;3657:6;3654:1;3651:13;3643:140;;;3752:14;;;3748:23;;3742:30;3718:17;;;3737:2;3714:26;3707:66;3672:10;;3643:140;;;3801:6;3798:1;3795:13;3792:91;;;3871:1;3866:2;3857:6;3846:9;3842:22;3838:31;3831:42;3792:91;-1:-1:-1;3944:2:1;3923:15;-1:-1:-1;;3919:29:1;3904:45;;;;3951:2;3900:54;;3363:597;-1:-1:-1;;;3363:597:1:o;8087:356::-;8289:2;8271:21;;;8308:18;;;8301:30;8367:34;8362:2;8347:18;;8340:62;8434:2;8419:18;;8087:356::o;8804:405::-;9006:2;8988:21;;;9045:2;9025:18;;;9018:30;9084:34;9079:2;9064:18;;9057:62;-1:-1:-1;;;9150:2:1;9135:18;;9128:39;9199:3;9184:19;;8804:405::o;13590:128::-;13630:3;13661:1;13657:6;13654:1;13651:13;13648:39;;;13667:18;;:::i;:::-;-1:-1:-1;13703:9:1;;13590:128::o;13723:217::-;13763:1;13789;13779:132;;13833:10;13828:3;13824:20;13821:1;13814:31;13868:4;13865:1;13858:15;13896:4;13893:1;13886:15;13779:132;-1:-1:-1;13925:9:1;;13723:217::o;13945:168::-;13985:7;14051:1;14047;14043:6;14039:14;14036:1;14033:21;14028:1;14021:9;14014:17;14010:45;14007:71;;;14058:18;;:::i;:::-;-1:-1:-1;14098:9:1;;13945:168::o;14118:125::-;14158:4;14186:1;14183;14180:8;14177:34;;;14191:18;;:::i;:::-;-1:-1:-1;14228:9:1;;14118:125::o;14248:380::-;14327:1;14323:12;;;;14370;;;14391:61;;14445:4;14437:6;14433:17;14423:27;;14391:61;14498:2;14490:6;14487:14;14467:18;14464:38;14461:161;;;14544:10;14539:3;14535:20;14532:1;14525:31;14579:4;14576:1;14569:15;14607:4;14604:1;14597:15;14461:161;;14248:380;;;:::o;14633:127::-;14694:10;14689:3;14685:20;14682:1;14675:31;14725:4;14722:1;14715:15;14749:4;14746:1;14739:15

Swarm Source

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