Token GWS

 

Overview [ERC-20]

Max Total Supply:
76,815.577969084 GWS

Holders:
537

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GenerationalWealthSocietyERC20Token

Compiler Version
v0.7.5+commit.eb77ed08

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-18
*/

// SPDX-License-Identifier: MIT


pragma solidity 0.7.5;

library EnumerableSet {

    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.
    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
   *
   * Returns true if the value was added to the set, that is if it was not
   * already present.
   */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
   *
   * Returns true if the value was removed from the set, that is if it was
   * present.
   */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {// Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1;
            // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
   */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

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

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

    function _getValues(Set storage set_) private view returns (bytes32[] storage) {
        return set_._values;
    }

    // TODO needs insert function that maintains order.
    // TODO needs NatSpec documentation comment.
    /**
     * Inserts new value by moving existing value at provided index to end of array and setting provided value at provided index
     */
    function _insert(Set storage set_, uint256 index_, bytes32 valueToInsert_) private returns (bool) {
        require(set_._values.length > index_);
        require(!_contains(set_, valueToInsert_), "Remove value you wish to insert if you wish to reorder array.");
        bytes32 existingValue_ = _at(set_, index_);
        set_._values[index_] = valueToInsert_;
        return _add(set_, existingValue_);
    }

    struct Bytes4Set {
        Set _inner;
    }

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

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

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

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

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

    function getValues(Bytes4Set storage set_) internal view returns (bytes4[] memory) {
        bytes4[] memory bytes4Array_;
        for (uint256 iteration_ = 0; _length(set_._inner) > iteration_; iteration_++) {
            bytes4Array_[iteration_] = bytes4(_at(set_._inner, iteration_));
        }
        return bytes4Array_;
    }

    function insert(Bytes4Set storage set_, uint256 index_, bytes4 valueToInsert_) internal returns (bool) {
        return _insert(set_._inner, index_, valueToInsert_);
    }

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

    function getValues(Bytes32Set storage set_) internal view returns (bytes4[] memory) {
        bytes4[] memory bytes4Array_;

        for (uint256 iteration_ = 0; _length(set_._inner) >= iteration_; iteration_++) {
            bytes4Array_[iteration_] = bytes4(at(set_, iteration_));
        }

        return bytes4Array_;
    }

    function insert(Bytes32Set storage set_, uint256 index_, bytes32 valueToInsert_) internal returns (bool) {
        return _insert(set_._inner, index_, valueToInsert_);
    }

    // AddressSet
    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

    /**
     * TODO Might require explicit conversion of bytes32[] to address[].
     *  Might require iteration.
     */
    function getValues(AddressSet storage set_) internal view returns (address[] memory) {

        address[] memory addressArray;

        for (uint256 iteration_ = 0; _length(set_._inner) >= iteration_; iteration_++) {
            addressArray[iteration_] = at(set_, iteration_);
        }

        return addressArray;
    }

    function insert(AddressSet storage set_, uint256 index_, address valueToInsert_) internal returns (bool) {
        return _insert(set_._inner, index_, bytes32(uint256(valueToInsert_)));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

    struct UInt256Set {
        Set _inner;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {

        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by 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;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add(div(a, 2), 1);
            while (b < c) {
                c = b;
                b = div(add(div(a, b), b), 2);
            }
        } else if (a != 0) {
            c = 1;
        }
    }

    function percentageAmount(uint256 total_, uint8 percentage_) internal pure returns (uint256 percentAmount_) {
        return div(mul(total_, percentage_), 1000);
    }

    function substractPercentage(uint256 total_, uint8 percentageToSub_) internal pure returns (uint256 result_) {
        return sub(total_, div(mul(total_, percentageToSub_), 1000));
    }

    function percentageOfTotal(uint256 part_, uint256 total_) internal pure returns (uint256 percent_) {
        return div(mul(part_, 100), total_);
    }

    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }

    function quadraticPricing(uint256 payment_, uint256 multiplier_) internal pure returns (uint256) {
        return sqrrt(mul(multiplier_, payment_));
    }

    function bondingCurve(uint256 supply_, uint256 multiplier_) internal pure returns (uint256) {
        return mul(multiplier_, supply_);
    }
}

abstract contract ERC20 is IERC20 {

    using SafeMath for uint256;

    // TODO comment actual hash value.
    bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256("ERC20Token");

    // Present in ERC777
    mapping(address => uint256) internal _balances;

    // Present in ERC777
    mapping(address => mapping(address => uint256)) internal _allowances;

    // Present in ERC777
    uint256 internal _totalSupply;

    // Present in ERC777
    string internal _name;

    // Present in ERC777
    string internal _symbol;

    // Present in ERC777
    uint8 internal _decimals;

    constructor (string memory name_, string memory symbol_, uint8 decimals_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

    function _mint(address account_, uint256 amount_) internal virtual {
        require(account_ != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address(this), account_, amount_);
        _totalSupply = _totalSupply.add(amount_);
        _balances[account_] = _balances[account_].add(amount_);
        emit Transfer(address(this), account_, amount_);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _beforeTokenTransfer(address from_, address to_, uint256 amount_) internal virtual {}
}

library Counters {
    using SafeMath for uint256;

    struct Counter {
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

interface IERC2612Permit {

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
}

abstract contract ERC20Permit is ERC20, IERC2612Permit {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    bytes32 public DOMAIN_SEPARATOR;

    constructor() {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name())),
                keccak256(bytes("1")), // Version
                chainID,
                address(this)
            )
        );
    }

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "Permit: expired deadline");

        bytes32 hashStruct =
        keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline));

        bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct));

        address signer = ecrecover(_hash, v, r, s);
        require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature");

        _nonces[owner].increment();
        _approve(owner, spender, amount);
    }

    function nonces(address owner) public view override returns (uint256) {
        return _nonces[owner].current();
    }
}

interface IOwnable {
    function owner() external view returns (address);

    function renounceOwnership() external;

    function transferOwnership(address newOwner_) external;
}

contract Ownable is IOwnable {

    address internal _owner;

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

    constructor () {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

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

    function transferOwnership(address newOwner_) public virtual override onlyOwner() {
        require(newOwner_ != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner_);
        _owner = newOwner_;
    }
}

contract VaultOwned is Ownable {

    address internal _vault;
    constructor() {
        _vault = msg.sender;
    }
    function setVault(address vault_) external onlyOwner() returns (bool) {
        _vault = vault_;

        return true;
    }

    function vault() public view returns (address) {
        return _vault;
    }

    modifier onlyVault() {
        require(_vault == msg.sender, "VaultOwned: caller is not the Vault");
        _;
    }

}

contract GenerationalWealthSocietyERC20Token is ERC20Permit, VaultOwned {
    using SafeMath for uint256;

    event UpdateTeamTaxFee(uint teamTaxFee_);
    event UpdateTeamTaxFeeAddress(address teamTaxFeeAddress_);
    event UpdateBurnTaxFee(uint burnTaxFee_);
    event UpdateBurnTaxFeeAddress(address burnTaxFeeAddress_);
    event UpdateMaxTxAmount(uint256 maxTxAmount_);
    event UpdateTaxesDisabled(bool disableTaxes_);
    event UpdateMaxTxAmountDisabled(bool maxTxAmountDisabled_);
    event UpdateExcludedFromMaxTransactionAmount(address addr_, bool isExcl_);
    event UpdateExcludedFromMultipleMaxTransactionAmount(address[] accounts, bool isExcluded);
    event UpdateAutomatedMarketMakerPair(address pair_, bool value_);
    
    mapping (address => bool) public isExcludedMaxTransactionAmount;
    mapping (address => bool) public automatedMarketMakerPairs;

    address public teamTaxFeeAddress;
    address public burnTaxFeeAddress;

    uint256 public constant MINIMUM_MAX_TX_AMOUNT = 10 * 10**9;
    uint256 public maxTxAmount = 0;

    uint public teamTaxFee = 2;
    uint public burnTaxFee = 8;

    bool public taxesDisabled = false;
    bool public maxTxAmountDisabled = false;

    constructor() ERC20("GWS", "GWS", 9) {
        isExcludedMaxTransactionAmount[owner()] = true;
        isExcludedMaxTransactionAmount[address(this)] = true;
    }

    function mint(address account_, uint256 amount_) external onlyVault() {
        _mint(account_, amount_);
    }

    function burn(uint256 amount) public virtual {
        _burn(msg.sender, amount);
    }

    function burnFrom(address account_, uint256 amount_) public virtual {
        _burnFrom(account_, amount_);
    }

    function _burnFrom(address account_, uint256 amount_) public virtual {
        uint256 decreasedAllowance_ =
        allowance(account_, msg.sender).sub(
            amount_,
            "ERC20: burn amount exceeds allowance"
        );

        _approve(account_, msg.sender, decreasedAllowance_);
        _burn(account_, amount_);
    }

    function calculateTeamTaxFee(uint256 _amount) private view returns (uint256) {
          return _amount.mul(teamTaxFee).div(
            10**2
        );
    }

    function calculateBurnTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(burnTaxFee).div(
            10**2
        );
    }

    function _transfer(address sender, address recipient, uint256 amount) override internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        // when amount = 0
        if(amount == 0) {
            super._transfer(sender, recipient, 0);
            return;
        }

        // when sell
        uint256 receiveAmount = amount;
        if(
            !taxesDisabled &&
            automatedMarketMakerPairs[recipient] &&
            burnTaxFeeAddress != address(0) && 
            teamTaxFeeAddress != address(0)
        ) {
            uint256 teamTax = calculateTeamTaxFee(amount);
            uint256 burnTax = calculateBurnTaxFee(amount);
            uint256 totalTax = teamTax.add(burnTax);

            super._transfer(sender, teamTaxFeeAddress, teamTax);
            super._transfer(sender, burnTaxFeeAddress, burnTax);

            receiveAmount = receiveAmount.sub(totalTax);
        }

        // when buy
        if(
            !maxTxAmountDisabled &&
            automatedMarketMakerPairs[sender] &&
            !isExcludedMaxTransactionAmount[sender] && 
            !isExcludedMaxTransactionAmount[recipient]
        ) {
            require(amount <= maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
        }

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

    function setMaxTxAmount(uint256 maxTxAmount_) external onlyOwner() {
        require(maxTxAmount_ >= MINIMUM_MAX_TX_AMOUNT, "Max tx amount cannot be lower than the minimum tx amount");
        maxTxAmount = maxTxAmount_;

        emit UpdateMaxTxAmount(maxTxAmount_);
    }

    function setTeamTaxFeeAddress(address teamTaxFeeAddress_) public onlyOwner() {
        require(teamTaxFeeAddress_ != address(0), 'Is the zero address');
        teamTaxFeeAddress = teamTaxFeeAddress_;

        emit UpdateTeamTaxFeeAddress(teamTaxFeeAddress_);
    }

    function setBurnTaxFeeAddress(address burnTaxFeeAddress_) public onlyOwner() {
        require(burnTaxFeeAddress_ != address(0), 'Is the zero address');
        burnTaxFeeAddress = burnTaxFeeAddress_;

        emit UpdateBurnTaxFeeAddress(burnTaxFeeAddress_);
    }

    function setTaxes(uint teamTaxFee_, uint burnTaxFee_) public onlyOwner() {
        teamTaxFee = teamTaxFee_;
        burnTaxFee = burnTaxFee_;
        require(teamTaxFee_.add(burnTaxFee_) <= 20, 'Must keep sell taxes below or equal to 20%');

        emit UpdateTeamTaxFee(teamTaxFee_);
        emit UpdateBurnTaxFee(burnTaxFee_);
    }

    function setAutomatedMarketMakerPair(address pair_, bool value_) public onlyOwner {
        automatedMarketMakerPairs[pair_] = value_;

        emit UpdateAutomatedMarketMakerPair(pair_, value_);
    }

    function excludeFromMaxTransactionAmount(address addr_, bool isExcl_) public onlyOwner {
        isExcludedMaxTransactionAmount[addr_] = isExcl_;

        emit UpdateExcludedFromMaxTransactionAmount(addr_, isExcl_);
    }

     function excludeFromMultipleMaxTransactionAmount(address[] calldata adresses_, bool isExcl_) public onlyOwner {
        for(uint256 i = 0; i < adresses_.length; i++) {
            isExcludedMaxTransactionAmount[adresses_[i]] = isExcl_;
        }

        emit UpdateExcludedFromMultipleMaxTransactionAmount(adresses_, isExcl_);
    }

    function disableTaxes(bool disableTaxes_) public onlyOwner() {
        taxesDisabled = disableTaxes_;
        
        emit UpdateTaxesDisabled(disableTaxes_);
    }

    function disableMaxTxAmount(bool maxTxAmountDisabled_) public onlyOwner() {
        maxTxAmountDisabled = maxTxAmountDisabled_;
        
        emit UpdateMaxTxAmountDisabled(maxTxAmountDisabled_);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair_","type":"address"},{"indexed":false,"internalType":"bool","name":"value_","type":"bool"}],"name":"UpdateAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burnTaxFee_","type":"uint256"}],"name":"UpdateBurnTaxFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"burnTaxFeeAddress_","type":"address"}],"name":"UpdateBurnTaxFeeAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr_","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcl_","type":"bool"}],"name":"UpdateExcludedFromMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"UpdateExcludedFromMultipleMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTxAmount_","type":"uint256"}],"name":"UpdateMaxTxAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"maxTxAmountDisabled_","type":"bool"}],"name":"UpdateMaxTxAmountDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"disableTaxes_","type":"bool"}],"name":"UpdateTaxesDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"teamTaxFee_","type":"uint256"}],"name":"UpdateTeamTaxFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"teamTaxFeeAddress_","type":"address"}],"name":"UpdateTeamTaxFeeAddress","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_MAX_TX_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"_burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTaxFeeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"bool","name":"maxTxAmountDisabled_","type":"bool"}],"name":"disableMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disableTaxes_","type":"bool"}],"name":"disableTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr_","type":"address"},{"internalType":"bool","name":"isExcl_","type":"bool"}],"name":"excludeFromMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"adresses_","type":"address[]"},{"internalType":"bool","name":"isExcl_","type":"bool"}],"name":"excludeFromMultipleMaxTransactionAmount","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":"","type":"address"}],"name":"isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair_","type":"address"},{"internalType":"bool","name":"value_","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"burnTaxFeeAddress_","type":"address"}],"name":"setBurnTaxFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount_","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"teamTaxFee_","type":"uint256"},{"internalType":"uint256","name":"burnTaxFee_","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"teamTaxFeeAddress_","type":"address"}],"name":"setTeamTaxFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_","type":"address"}],"name":"setVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxesDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamTaxFeeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040526000600e556002600f5560086010556011805461ffff191690553480156200002b57600080fd5b506040518060400160405280600381526020016247575360e81b8152506040518060400160405280600381526020016247575360e81b815250600982600390805190602001906200007e929190620002b0565b50815162000094906004906020850190620002b0565b506005805460ff191660ff92909216919091179055504690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000d862000207565b805160209182012060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606084015260808301939093523060a0808401919091528351808403909101815260c0909201928390528151910120600755600880546001600160a01b0319163317908190556001600160a01b0316906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600980546001600160a01b031916331790556001600a6000620001c1620002a1565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152600a9092529020805490911660011790556200035c565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620002975780601f106200026b5761010080835404028352916020019162000297565b820191906000526020600020905b8154815290600101906020018083116200027957829003601f168201915b5050505050905090565b6008546001600160a01b031690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620002e8576000855562000333565b82601f106200030357805160ff191683800117855562000333565b8280016001018555821562000333579182015b828111156200033357825182559160200191906001019062000316565b506200034192915062000345565b5090565b5b8082111562000341576000815560010162000346565b612416806200036c6000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80638c0b5e2211610151578063bddf5078116100c3578063ea31e41611610087578063ea31e416146107c6578063ec28438a146107ce578063f13d57f6146107eb578063f2fde38b14610811578063fbfa77cf14610837578063fd6d0eb31461083f57610269565b8063bddf507814610714578063c647b20e1461071c578063d0a8bd171461073f578063d505accf14610747578063dd62ed3e1461079857610269565b8063a22b35ce11610115578063a22b35ce14610625578063a457c2d714610651578063a9059cbb1461067d578063b62496f5146106a9578063b6b057bd146106cf578063bced78c8146106ee57610269565b80638c0b5e221461056d5780638da5cb5b14610575578063918379731461057d57806395d89b41146105ef5780639a7a23d6146105f757610269565b806340c10f19116101ea57806370a08231116101ae57806370a08231146104dd578063715018a61461050357806379cc67901461050b5780637b541f37146105375780637ecebe001461053f5780638baf958e1461056557610269565b806340c10f191461042457806342966c68146104505780634bb2c7851461046d57806355c20085146104935780636817031b146104b757610269565b80632ae2f121116102315780632ae2f1211461039c57806330adf81f146103ca578063313ce567146103d25780633644e515146103f057806339509351146103f857610269565b806306fdde031461026e578063095ea7b3146102eb57806318160ddd1461032b5780631ad97ec91461034557806323b872dd14610366575b600080fd5b610276610847565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b0578181015183820152602001610298565b50505050905090810190601f1680156102dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103176004803603604081101561030157600080fd5b506001600160a01b0381351690602001356108dd565b604080519115158252519081900360200190f35b6103336108f4565b60408051918252519081900360200190f35b6103646004803603602081101561035b57600080fd5b503515156108fa565b005b6103176004803603606081101561037c57600080fd5b506001600160a01b0381358116916020810135909116906040013561098e565b610364600480360360408110156103b257600080fd5b506001600160a01b03813516906020013515156109f7565b610333610aa8565b6103da610acc565b6040805160ff9092168252519081900360200190f35b610333610ad5565b6103176004803603604081101561040e57600080fd5b506001600160a01b038135169060200135610adb565b6103646004803603604081101561043a57600080fd5b506001600160a01b038135169060200135610b11565b6103646004803603602081101561046657600080fd5b5035610b68565b6103176004803603602081101561048357600080fd5b50356001600160a01b0316610b75565b61049b610b8a565b604080516001600160a01b039092168252519081900360200190f35b610317600480360360208110156104cd57600080fd5b50356001600160a01b0316610b99565b610333600480360360208110156104f357600080fd5b50356001600160a01b0316610c0e565b610364610c29565b6103646004803603604081101561052157600080fd5b506001600160a01b038135169060200135610cc0565b610317610cca565b6103336004803603602081101561055557600080fd5b50356001600160a01b0316610cd8565b610333610cf9565b610333610d02565b61049b610d08565b6103646004803603604081101561059357600080fd5b8101906020810181356401000000008111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460208302840111640100000000831117156105e257600080fd5b9193509150351515610d17565b610276610e2c565b6103646004803603604081101561060d57600080fd5b506001600160a01b0381351690602001351515610e8d565b6103646004803603604081101561063b57600080fd5b506001600160a01b038135169060200135610f3e565b6103176004803603604081101561066757600080fd5b506001600160a01b038135169060200135610f8a565b6103176004803603604081101561069357600080fd5b506001600160a01b038135169060200135610fd9565b610317600480360360208110156106bf57600080fd5b50356001600160a01b0316610fe6565b610364600480360360208110156106e557600080fd5b50351515610ffb565b6103646004803603602081101561070457600080fd5b50356001600160a01b0316611097565b610333611189565b6103646004803603604081101561073257600080fd5b508035906020013561118f565b61049b611299565b610364600480360360e081101561075d57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356112a8565b610333600480360360408110156107ae57600080fd5b506001600160a01b03813581169160200135166114d5565b610333611500565b610364600480360360208110156107e457600080fd5b5035611506565b6103646004803603602081101561080157600080fd5b50356001600160a01b03166115d2565b6103646004803603602081101561082757600080fd5b50356001600160a01b03166116c4565b61049b6117b2565b6103176117c1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108ea3384846117ca565b5060015b92915050565b60025490565b6008546001600160a01b03163314610947576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b6011805482151560ff19909116811790915560408051918252517f6a953e6a5f55230eeb2804f37104e5efcd00657e0fc2e5b95a21d7845bbcfda29181900360200190a150565b600061099b8484846118b6565b6109ed84336109e88560405180606001604052806028815260200161226b602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b92565b6117ca565b5060019392505050565b6008546001600160a01b03163314610a44576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b6001600160a01b0382166000818152600a6020908152604091829020805460ff191685151590811790915582519384529083015280517f85d825a13807a0b216b9667ff085cde6da2d9e10a417cfb9b55722f12cc8d4709281900390910190a15050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055460ff1690565b60075481565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108ea9185906109e89086611c29565b6009546001600160a01b03163314610b5a5760405162461bcd60e51b81526004018080602001828103825260238152602001806122936023913960400191505060405180910390fd5b610b648282611c8a565b5050565b610b723382611d68565b50565b600a6020526000908152604090205460ff1681565b600c546001600160a01b031681565b6008546000906001600160a01b03163314610be9576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b50600980546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b031660009081526020819052604090205490565b6008546001600160a01b03163314610c76576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b6008546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600880546001600160a01b0319169055565b610b648282610f3e565b601154610100900460ff1681565b6001600160a01b03811660009081526006602052604081206108ee90611e52565b6402540be40081565b600e5481565b6008546001600160a01b031690565b6008546001600160a01b03163314610d64576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b60005b82811015610db95781600a6000868685818110610d8057fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff1916911515919091179055600101610d67565b507fe5895c75d2fd1b46262115a946b29e68ff3e2c1bf56e31547d15a8b8ddca3095838383604051808060200183151581526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108d35780601f106108a8576101008083540402835291602001916108d3565b6008546001600160a01b03163314610eda576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b6001600160a01b0382166000818152600b6020908152604091829020805460ff191685151590811790915582519384529083015280517fb6f1aed3b1ced30ce666a8b7f2e12b02aed514cdab677738640be9937f1332059281900390910190a15050565b6000610f6e826040518060600160405280602481526020016122d660249139610f6786336114d5565b9190611b92565b9050610f7b8333836117ca565b610f858383611d68565b505050565b60006108ea33846109e8856040518060600160405280602581526020016123bc602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b92565b60006108ea3384846118b6565b600b6020526000908152604090205460ff1681565b6008546001600160a01b03163314611048576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b60118054821515610100810261ff00199092169190911790915560408051918252517f8ada525dadf897d355bd6236e2c0e6096196fb3b541074e7919398da7172c4429181900360200190a150565b6008546001600160a01b031633146110e4576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b6001600160a01b038116611135576040805162461bcd60e51b8152602060048201526013602482015272497320746865207a65726f206164647265737360681b604482015290519081900360640190fd5b600d80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f11de62ec2bb6f325a03bfb0344efc0664fb8b32f7b186f75d95c56c676d8e8869181900360200190a150565b600f5481565b6008546001600160a01b031633146111dc576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b600f829055601081905560146111f28383611c29565b111561122f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806121f8602a913960400191505060405180910390fd5b6040805183815290517f632ad9a56dd9722afd31a80825fcd7965a8701fe8444c3148a59d8ab4a5129889181900360200190a16040805182815290517f96067f173edf9471df7bd0079dc5b56b8179aaf52c9e803565d0d32f7284ca1f9181900360200190a15050565b600d546001600160a01b031681565b834211156112fd576040805162461bcd60e51b815260206004820152601860248201527f5065726d69743a206578706972656420646561646c696e650000000000000000604482015290519081900360640190fd5b6001600160a01b03871660009081526006602052604081207f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c99089908990899061134690611e52565b604080516020808201979097526001600160a01b0395861681830152939094166060840152608083019190915260a082015260c08082018990528251808303909101815260e08201835280519084012060075461190160f01b610100840152610102830152610122808301829052835180840390910181526101428301808552815191860191909120600091829052610162840180865281905260ff8a166101828501526101a284018990526101c28401889052935191955092936001926101e280820193601f1981019281900390910190855afa15801561142c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906114625750896001600160a01b0316816001600160a01b0316145b61149d5760405162461bcd60e51b81526004018080602001828103825260218152602001806121d76021913960400191505060405180910390fd5b6001600160a01b038a1660009081526006602052604090206114be90611e56565b6114c98a8a8a6117ca565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60105481565b6008546001600160a01b03163314611553576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b6402540be4008110156115975760405162461bcd60e51b81526004018080602001828103825260388152602001806123846038913960400191505060405180910390fd5b600e8190556040805182815290517faa3699eefc959af0349072633ce13d21ce9c6fe475e5818b99da990ee39645a19181900360200190a150565b6008546001600160a01b0316331461161f576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b6001600160a01b038116611670576040805162461bcd60e51b8152602060048201526013602482015272497320746865207a65726f206164647265737360681b604482015290519081900360640190fd5b600c80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f3f0076e31984815c89c66a2217f81c734e660dafac9433f2b0d3eb099934ab4b9181900360200190a150565b6008546001600160a01b03163314611711576040805162461bcd60e51b815260206004820181905260248201526000805160206122b6833981519152604482015290519081900360640190fd5b6001600160a01b0381166117565760405162461bcd60e51b81526004018080602001828103825260268152602001806121696026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031690565b60115460ff1681565b6001600160a01b03831661180f5760405162461bcd60e51b81526004018080602001828103825260248152602001806123606024913960400191505060405180910390fd5b6001600160a01b0382166118545760405162461bcd60e51b815260040180806020018281038252602281526020018061218f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166118fb5760405162461bcd60e51b815260040180806020018281038252602581526020018061233b6025913960400191505060405180910390fd5b6001600160a01b0382166119405760405162461bcd60e51b81526004018080602001828103825260238152602001806121246023913960400191505060405180910390fd5b806119565761195183836000611e5f565b610f85565b601154819060ff1615801561198357506001600160a01b0383166000908152600b602052604090205460ff165b80156119995750600d546001600160a01b031615155b80156119af5750600c546001600160a01b031615155b15611a1d5760006119bf83611fa8565b905060006119cc84611fca565b905060006119da8383611c29565b600c549091506119f59088906001600160a01b031685611e5f565b600d54611a0d9088906001600160a01b031684611e5f565b611a178482611fe6565b93505050505b601154610100900460ff16158015611a4d57506001600160a01b0384166000908152600b602052604090205460ff165b8015611a7257506001600160a01b0384166000908152600a602052604090205460ff16155b8015611a9757506001600160a01b0383166000908152600a602052604090205460ff16155b15611add57600e54821115611add5760405162461bcd60e51b81526004018080602001828103825260288152602001806122226028913960400191505060405180910390fd5b611b1a826040518060600160405280602681526020016121b1602691396001600160a01b0387166000908152602081905260409020549190611b92565b6001600160a01b038086166000908152602081905260408082209390935590851681522054611b499082611c29565b6001600160a01b038085166000818152602081815260409182902094909455805185815290519193928816926000805160206122fa83398151915292918290030190a350505050565b60008184841115611c215760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611be6578181015183820152602001611bce565b50505050905090810190601f168015611c135780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015611c83576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611ce5576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611cf0308383610f85565b600254611cfd9082611c29565b6002556001600160a01b038216600090815260208190526040902054611d239082611c29565b6001600160a01b038316600081815260208181526040918290209390935580518481529051919230926000805160206122fa8339815191529281900390910190a35050565b6001600160a01b038216611dad5760405162461bcd60e51b815260040180806020018281038252602181526020018061231a6021913960400191505060405180910390fd5b611db982600083610f85565b611df681604051806060016040528060228152602001612147602291396001600160a01b0385166000908152602081905260409020549190611b92565b6001600160a01b038316600090815260208190526040902055600254611e1c9082611fe6565b6002556040805182815290516000916001600160a01b038516916000805160206122fa8339815191529181900360200190a35050565b5490565b80546001019055565b6001600160a01b038316611ea45760405162461bcd60e51b815260040180806020018281038252602581526020018061233b6025913960400191505060405180910390fd5b6001600160a01b038216611ee95760405162461bcd60e51b81526004018080602001828103825260238152602001806121246023913960400191505060405180910390fd5b611ef4838383610f85565b611f31816040518060600160405280602681526020016121b1602691396001600160a01b0386166000908152602081905260409020549190611b92565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611f609082611c29565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716926000805160206122fa83398151915292918290030190a3505050565b60006108ee6064611fc4600f548561202890919063ffffffff16565b90612081565b60006108ee6064611fc46010548561202890919063ffffffff16565b6000611c8383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b92565b600082612037575060006108ee565b8282028284828161204457fe5b0414611c835760405162461bcd60e51b815260040180806020018281038252602181526020018061224a6021913960400191505060405180910390fd5b6000611c8383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506000818361210d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611be6578181015183820152602001611bce565b50600083858161211957fe5b049594505050505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655a65726f537761705065726d69743a20496e76616c6964207369676e61747572654d757374206b6565702073656c6c2074617865732062656c6f77206f7220657175616c20746f203230255472616e7366657220616d6f756e74206578636565647320746865206d61785478416d6f756e742e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655661756c744f776e65643a2063616c6c6572206973206e6f7420746865205661756c744f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734d617820747820616d6f756e742063616e6e6f74206265206c6f776572207468616e20746865206d696e696d756d20747820616d6f756e7445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d074d8162704ef9f6bc3e175d00e9b8efd15c28463fcd562936375e380d7f9e064736f6c63430007050033

Deployed ByteCode Sourcemap

28744:6467:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20878:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21738:167;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21738:167:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21155:100;;;:::i;:::-;;;;;;;;;;;;;;;;34823:169;;;;;;;;;;;;;;;;-1:-1:-1;34823:169:0;;;;:::i;:::-;;21913:317;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21913:317:0;;;;;;;;;;;;;;;;;:::i;34242:225::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34242:225:0;;;;;;;;;;:::i;25603:108::-;;;:::i;21064:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25720:31;;;:::i;22238:214::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22238:214:0;;;;;;;;:::i;30152:113::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30152:113:0;;;;;;;;:::i;30273:89::-;;;;;;;;;;;;;;;;-1:-1:-1;30273:89:0;;:::i;29502:63::-;;;;;;;;;;;;;;;;-1:-1:-1;29502:63:0;-1:-1:-1;;;;;29502:63:0;;:::i;29639:32::-;;;:::i;:::-;;;;-1:-1:-1;;;;;29639:32:0;;;;;;;;;;;;;;28392:128;;;;;;;;;;;;;;;;-1:-1:-1;28392:128:0;-1:-1:-1;;;;;28392:128:0;;:::i;21263:127::-;;;;;;;;;;;;;;;;-1:-1:-1;21263:127:0;-1:-1:-1;;;;;21263:127:0;;:::i;27831:159::-;;;:::i;30370:115::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30370:115:0;;;;;;;;:::i;29931:39::-;;;:::i;27013:120::-;;;;;;;;;;;;;;;;-1:-1:-1;27013:120:0;-1:-1:-1;;;;;27013:120:0;;:::i;29719:58::-;;;:::i;29784:30::-;;;:::i;27610:88::-;;;:::i;34476:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34476:339:0;-1:-1:-1;34476:339:0;;;;:::i;20969:87::-;;;:::i;34029:205::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34029:205:0;;;;;;;;;;:::i;30493:347::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30493:347:0;;;;;;;;:::i;22460:265::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22460:265:0;;;;;;;;:::i;21398:173::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21398:173:0;;;;;;;;:::i;29572:58::-;;;;;;;;;;;;;;;;-1:-1:-1;29572:58:0;-1:-1:-1;;;;;29572:58:0;;:::i;35000:208::-;;;;;;;;;;;;;;;;-1:-1:-1;35000:208:0;;;;:::i;33400:270::-;;;;;;;;;;;;;;;;-1:-1:-1;33400:270:0;-1:-1:-1;;;;;33400:270:0;;:::i;29823:26::-;;;:::i;33678:343::-;;;;;;;;;;;;;;;;-1:-1:-1;33678:343:0;;;;;;;:::i;29678:32::-;;;:::i;26239:766::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26239:766:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21579:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21579:151:0;;;;;;;;;;:::i;29856:26::-;;;:::i;32836:278::-;;;;;;;;;;;;;;;;-1:-1:-1;32836:278:0;;:::i;33122:270::-;;;;;;;;;;;;;;;;-1:-1:-1;33122:270:0;-1:-1:-1;;;;;33122:270:0;;:::i;27998:259::-;;;;;;;;;;;;;;;;-1:-1:-1;27998:259:0;-1:-1:-1;;;;;27998:259:0;;:::i;28528:79::-;;;:::i;29891:33::-;;;:::i;20878:83::-;20948:5;20941:12;;;;;;;;-1:-1:-1;;20941:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20915:13;;20941:12;;20948:5;;20941:12;;20948:5;20941:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20878:83;:::o;21738:167::-;21821:4;21838:37;21847:10;21859:7;21868:6;21838:8;:37::i;:::-;-1:-1:-1;21893:4:0;21738:167;;;;;:::o;21155:100::-;21235:12;;21155:100;:::o;34823:169::-;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;34895:13:::1;:29:::0;;;::::1;;-1:-1:-1::0;;34895:29:0;;::::1;::::0;::::1;::::0;;;34950:34:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;34823:169:::0;:::o;21913:317::-;22019:4;22036:36;22046:6;22054:9;22065:6;22036:9;:36::i;:::-;22083:117;22092:6;22100:10;22112:87;22148:6;22112:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22112:19:0;;;;;;:11;:19;;;;;;;;22132:10;22112:31;;;;;;;;;:87;:35;:87::i;:::-;22083:8;:117::i;:::-;-1:-1:-1;22218:4:0;21913:317;;;;;:::o;34242:225::-;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34340:37:0;::::1;;::::0;;;:30:::1;:37;::::0;;;;;;;;:47;;-1:-1:-1;;34340:47:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34405:54;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;34242:225:::0;;:::o;25603:108::-;25645:66;25603:108;:::o;21064:83::-;21130:9;;;;21064:83;:::o;25720:31::-;;;;:::o;22238:214::-;22352:10;22326:4;22373:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;22373:32:0;;;;;;;;;;22326:4;;22343:79;;22364:7;;22373:48;;22410:10;22373:36;:48::i;30152:113::-;28655:6;;-1:-1:-1;;;;;28655:6:0;28665:10;28655:20;28647:68;;;;-1:-1:-1;;;28647:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30233:24:::1;30239:8;30249:7;30233:5;:24::i;:::-;30152:113:::0;;:::o;30273:89::-;30329:25;30335:10;30347:6;30329:5;:25::i;:::-;30273:89;:::o;29502:63::-;;;;;;;;;;;;;;;:::o;29639:32::-;;;-1:-1:-1;;;;;29639:32:0;;:::o;28392:128::-;27746:6;;28456:4;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;-1:-1:-1;28473:6:0::1;:15:::0;;-1:-1:-1;;;;;28473:15:0;::::1;-1:-1:-1::0;;;;;;28473:15:0;;::::1;;::::0;;;28392:128;;;:::o;21263:127::-;-1:-1:-1;;;;;21364:18:0;21337:7;21364:18;;;;;;;;;;;;21263:127::o;27831:159::-;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;27933:6:::1;::::0;27912:40:::1;::::0;27949:1:::1;::::0;-1:-1:-1;;;;;27933:6:0::1;::::0;27912:40:::1;::::0;27949:1;;27912:40:::1;27963:6;:19:::0;;-1:-1:-1;;;;;;27963:19:0::1;::::0;;27831:159::o;30370:115::-;30449:28;30459:8;30469:7;30449:9;:28::i;29931:39::-;;;;;;;;;:::o;27013:120::-;-1:-1:-1;;;;;27101:14:0;;27074:7;27101:14;;;:7;:14;;;;;:24;;:22;:24::i;29719:58::-;29767:10;29719:58;:::o;29784:30::-;;;;:::o;27610:88::-;27684:6;;-1:-1:-1;;;;;27684:6:0;27610:88;:::o;34476:339::-;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;34601:9:::1;34597:127;34616:20:::0;;::::1;34597:127;;;34705:7;34658:30;:44;34689:9;;34699:1;34689:12;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;34689:12:0::1;34658:44:::0;;-1:-1:-1;34658:44:0;::::1;::::0;;;;;;-1:-1:-1;34658:44:0;:54;;-1:-1:-1;;34658:54:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;34638:3:0::1;34597:127;;;;34741:66;34788:9;;34799:7;34741:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;34741:66:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;34741:66:0;;-1:-1:-1;;;;;34741:66:0::1;34476:339:::0;;;:::o;20969:87::-;21041:7;21034:14;;;;;;;;-1:-1:-1;;21034:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21008:13;;21034:14;;21041:7;;21034:14;;21041:7;21034:14;;;;;;;;;;;;;;;;;;;;;;;;34029:205;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34122:32:0;::::1;;::::0;;;:25:::1;:32;::::0;;;;;;;;:41;;-1:-1:-1;;34122:41:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34181:45;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;34029:205:::0;;:::o;30493:347::-;30573:27;30612:121;30662:7;30612:121;;;;;;;;;;;;;;;;;:31;30622:8;30632:10;30612:9;:31::i;:::-;:35;:121;:35;:121::i;:::-;30573:160;;30746:51;30755:8;30765:10;30777:19;30746:8;:51::i;:::-;30808:24;30814:8;30824:7;30808:5;:24::i;:::-;30493:347;;;:::o;22460:265::-;22553:4;22570:125;22579:10;22591:7;22600:94;22637:15;22600:94;;;;;;;;;;;;;;;;;22612:10;22600:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;22600:32:0;;;;;;;;;;;:94;:36;:94::i;21398:173::-;21484:4;21501:40;21511:10;21523:9;21534:6;21501:9;:40::i;29572:58::-;;;;;;;;;;;;;;;:::o;35000:208::-;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;35085:19:::1;:42:::0;;;::::1;;;::::0;::::1;-1:-1:-1::0;;35085:42:0;;::::1;::::0;;;::::1;::::0;;;35153:47:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;35000:208:::0;:::o;33400:270::-;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33496:32:0;::::1;33488:64;;;::::0;;-1:-1:-1;;;33488:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33488:64:0;;;;;;;;;;;;;::::1;;33563:17;:38:::0;;-1:-1:-1;;;;;33563:38:0;::::1;-1:-1:-1::0;;;;;;33563:38:0;;::::1;::::0;::::1;::::0;;;33619:43:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;33400:270:::0;:::o;29823:26::-;;;;:::o;33678:343::-;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;33762:10:::1;:24:::0;;;33797:10:::1;:24:::0;;;33872:2:::1;33840:28;33775:11:::0;33810;33840:15:::1;:28::i;:::-;:34;;33832:89;;;;-1:-1:-1::0;;;33832:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33939:29;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;33984;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;33678:343:::0;;:::o;29678:32::-;;;-1:-1:-1;;;;;29678:32:0;;:::o;26239:766::-;26484:8;26465:15;:27;;26457:64;;;;;-1:-1:-1;;;26457:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26626:14:0;;26534:18;26626:14;;;:7;:14;;;;;25645:66;;26602:5;;26609:7;;26618:6;;26626:24;;:22;:24::i;:::-;26574:87;;;;;;;;;;;-1:-1:-1;;;;;26574:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26564:98;;;;;;26734:16;;-1:-1:-1;;;26701:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26691:73;;;;;;;;;-1:-1:-1;26794:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26564:98;;-1:-1:-1;26691:73:0;;26794:25;;;;;;;-1:-1:-1;;26794:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26794:25:0;;-1:-1:-1;;26794:25:0;;;-1:-1:-1;;;;;;;26838:20:0;;;;;;:39;;;26872:5;-1:-1:-1;;;;;26862:15:0;:6;-1:-1:-1;;;;;26862:15:0;;26838:39;26830:85;;;;-1:-1:-1;;;26830:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26928:14:0;;;;;;:7;:14;;;;;:26;;:24;:26::i;:::-;26965:32;26974:5;26981:7;26990:6;26965:8;:32::i;:::-;26239:766;;;;;;;;;;:::o;21579:151::-;-1:-1:-1;;;;;21695:18:0;;;21668:7;21695:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21579:151::o;29856:26::-;;;;:::o;32836:278::-;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;29767:10:::1;32922:12;:37;;32914:106;;;;-1:-1:-1::0;;;32914:106:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33031:11;:26:::0;;;33075:31:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;32836:278:::0;:::o;33122:270::-;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33218:32:0;::::1;33210:64;;;::::0;;-1:-1:-1;;;33210:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33210:64:0;;;;;;;;;;;;;::::1;;33285:17;:38:::0;;-1:-1:-1;;;;;33285:38:0;::::1;-1:-1:-1::0;;;;;;33285:38:0;;::::1;::::0;::::1;::::0;;;33341:43:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;33122:270:::0;:::o;27998:259::-;27746:6;;-1:-1:-1;;;;;27746:6:0;27756:10;27746:20;27738:65;;;;;-1:-1:-1;;;27738:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27738:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28099:23:0;::::1;28091:74;;;;-1:-1:-1::0;;;28091:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28202:6;::::0;28181:39:::1;::::0;-1:-1:-1;;;;;28181:39:0;;::::1;::::0;28202:6:::1;::::0;28181:39:::1;::::0;28202:6:::1;::::0;28181:39:::1;28231:6;:18:::0;;-1:-1:-1;;;;;;28231:18:0::1;-1:-1:-1::0;;;;;28231:18:0;;;::::1;::::0;;;::::1;::::0;;27998:259::o;28528:79::-;28593:6;;-1:-1:-1;;;;;28593:6:0;28528:79;:::o;29891:33::-;;;;;;:::o;24105:346::-;-1:-1:-1;;;;;24207:19:0;;24199:68;;;;-1:-1:-1;;;24199:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24286:21:0;;24278:68;;;;-1:-1:-1;;;24278:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24359:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24411:32;;;;;;;;;;;;;;;;;24105:346;;;:::o;31188:1640::-;-1:-1:-1;;;;;31303:20:0;;31295:70;;;;-1:-1:-1;;;31295:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31384:23:0;;31376:71;;;;-1:-1:-1;;;31376:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31491:11;31488:101;;31519:37;31535:6;31543:9;31554:1;31519:15;:37::i;:::-;31571:7;;31488:101;31682:13;;31647:6;;31682:13;;31681:14;:67;;;;-1:-1:-1;;;;;;31712:36:0;;;;;;:25;:36;;;;;;;;31681:67;:115;;;;-1:-1:-1;31765:17:0;;-1:-1:-1;;;;;31765:17:0;:31;;31681:115;:164;;;;-1:-1:-1;31814:17:0;;-1:-1:-1;;;;;31814:17:0;:31;;31681:164;31664:573;;;31872:15;31890:27;31910:6;31890:19;:27::i;:::-;31872:45;;31932:15;31950:27;31970:6;31950:19;:27::i;:::-;31932:45;-1:-1:-1;31992:16:0;32011:20;:7;31932:45;32011:11;:20::i;:::-;32072:17;;31992:39;;-1:-1:-1;32048:51:0;;32064:6;;-1:-1:-1;;;;;32072:17:0;32091:7;32048:15;:51::i;:::-;32138:17;;32114:51;;32130:6;;-1:-1:-1;;;;;32138:17:0;32157:7;32114:15;:51::i;:::-;32198:27;:13;32216:8;32198:17;:27::i;:::-;32182:43;;31664:573;;;;32288:19;;;;;;;32287:20;:70;;;;-1:-1:-1;;;;;;32324:33:0;;;;;;:25;:33;;;;;;;;32287:70;:126;;;;-1:-1:-1;;;;;;32375:38:0;;;;;;:30;:38;;;;;;;;32374:39;32287:126;:186;;;;-1:-1:-1;;;;;;32432:41:0;;;;;;:30;:41;;;;;;;;32431:42;32287:186;32270:316;;;32518:11;;32508:6;:21;;32500:74;;;;-1:-1:-1;;;32500:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32618:71;32640:6;32618:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32618:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;32598:17:0;;;:9;:17;;;;;;;;;;;:91;;;;32723:20;;;;;;;:39;;32748:13;32723:24;:39::i;:::-;-1:-1:-1;;;;;32700:20:0;;;:9;:20;;;;;;;;;;;;:62;;;;32778:42;;;;;;;32700:20;;32778:42;;;;-1:-1:-1;;;;;;;;;;;32778:42:0;;;;;;;;31188:1640;;;;:::o;17494:192::-;17580:7;17616:12;17608:6;;;;17600:29;;;;-1:-1:-1;;;17600:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17652:5:0;;;17494:192::o;17161:181::-;17219:7;17251:5;;;17275:6;;;;17267:46;;;;;-1:-1:-1;;;17267:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17333:1;17161:181;-1:-1:-1;;;17161:181:0:o;23280:391::-;-1:-1:-1;;;;;23366:22:0;;23358:66;;;;;-1:-1:-1;;;23358:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23435:54;23464:4;23471:8;23481:7;23435:20;:54::i;:::-;23515:12;;:25;;23532:7;23515:16;:25::i;:::-;23500:12;:40;-1:-1:-1;;;;;23573:19:0;;:9;:19;;;;;;;;;;;:32;;23597:7;23573:23;:32::i;:::-;-1:-1:-1;;;;;23551:19:0;;:9;:19;;;;;;;;;;;;:54;;;;23621:42;;;;;;;23551:19;;23638:4;;-1:-1:-1;;;;;;;;;;;23621:42:0;;;;;;;;;23280:391;;:::o;23679:418::-;-1:-1:-1;;;;;23763:21:0;;23755:67;;;;-1:-1:-1;;;23755:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23835:49;23856:7;23873:1;23877:6;23835:20;:49::i;:::-;23918:68;23941:6;23918:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23918:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;23897:18:0;;:9;:18;;;;;;;;;;:89;24012:12;;:24;;24029:6;24012:16;:24::i;:::-;23997:12;:39;24052:37;;;;;;;;24078:1;;-1:-1:-1;;;;;24052:37:0;;;-1:-1:-1;;;;;;;;;;;24052:37:0;;;;;;;;23679:418;;:::o;24689:114::-;24781:14;;24689:114::o;24811:91::-;24875:19;;24893:1;24875:19;;;24811:91::o;22733:539::-;-1:-1:-1;;;;;22839:20:0;;22831:70;;;;-1:-1:-1;;;22831:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22920:23:0;;22912:71;;;;-1:-1:-1;;;22912:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22996:47;23017:6;23025:9;23036:6;22996:20;:47::i;:::-;23076:71;23098:6;23076:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23076:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;23056:17:0;;;:9;:17;;;;;;;;;;;:91;;;;23181:20;;;;;;;:32;;23206:6;23181:24;:32::i;:::-;-1:-1:-1;;;;;23158:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;23229:35;;;;;;;23158:20;;23229:35;;;;-1:-1:-1;;;;;;;;;;;23229:35:0;;;;;;;;22733:539;;;:::o;30848:163::-;30916:7;30945:58;30987:5;30945:23;30957:10;;30945:7;:11;;:23;;;;:::i;:::-;:27;;:58::i;31019:161::-;31087:7;31114:58;31156:5;31114:23;31126:10;;31114:7;:11;;:23;;;;:::i;17350:136::-;17408:7;17435:43;17439:1;17442;17435:43;;;;;;;;;;;;;;;;;:3;:43::i;17694:252::-;17752:7;17778:6;17774:47;;-1:-1:-1;17808:1:0;17801:8;;17774:47;17845:5;;;17849:1;17845;:5;:1;17869:5;;;;;:10;17861:56;;;;-1:-1:-1;;;17861:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17954:132;18012:7;18039:39;18043:1;18046;18039:39;;;;;;;;;;;;;;;;;18180:7;18215:12;18208:5;18200:28;;;;-1:-1:-1;;;18200:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18239:9;18255:1;18251;:5;;;;;;;18094:278;-1:-1:-1;;;;;18094:278:0:o

Swarm Source

ipfs://d074d8162704ef9f6bc3e175d00e9b8efd15c28463fcd562936375e380d7f9e0

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.