Token

JEFE TOKEN (JEFE)

Overview

Max Total Supply

10,000,000 JEFE

Holders

19 (0.00%)

Total Transfers

-

Market

Price

-

Onchain Market Cap

-

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 9 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

JEFETOKEN is a software development project focused on smart contracts, blockchain technology, video games & mobile applications. Our goal is to create an ecosystem of web3 applications.

Market

Volume (24H):$17.50
Market Capitalization:$0.00
Circulating Supply:0.00 JEFE
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
JEFE

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2024-12-22
*/

// SPDX-License-Identifier: MIT
/**
   WWW.JEFETOKEN.COM
   JEFE TOKEN 
   JEFE 
   Helping heroes around the world
*/
pragma solidity 0.8.21;

interface IERC20Errors {
 
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
    error ERC20InvalidSender(address sender);
    error ERC20InvalidReceiver(address receiver);
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
    error ERC20InvalidApprover(address approver);
    error ERC20InvalidSpender(address spender);
}


interface IERC721Errors {
   
    error ERC721InvalidOwner(address owner);
    error ERC721NonexistentToken(uint256 tokenId);
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
    error ERC721InvalidSender(address sender);
    error ERC721InvalidReceiver(address receiver);   
    error ERC721InsufficientApproval(address operator, uint256 tokenId);  
    error ERC721InvalidApprover(address approver);    
    error ERC721InvalidOperator(address operator);
}

interface IERC1155Errors {
    
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
    error ERC1155InvalidSender(address sender);
    error ERC1155InvalidReceiver(address receiver);
    error ERC1155MissingApprovalForAll(address operator, address owner);
    error ERC1155InvalidApprover(address approver);
    error ERC1155InvalidOperator(address operator);
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

interface IERC20 {
    
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface IERC5267 {

    event EIP712DomainChanged();

    function eip712Domain()
        external
        view
        returns (
            bytes1 fields,
            string memory name,
            string memory version,
            uint256 chainId,
            address verifyingContract,
            bytes32 salt,
            uint256[] memory extensions
        );
}


interface IERC20Permit {
   
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

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

    
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}
abstract contract Nonces {
   
    error InvalidAccountNonce(address account, uint256 currentNonce);

    mapping(address account => uint256) private _nonces;

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

   
    function _useNonce(address owner) internal virtual returns (uint256) {
              unchecked {
            return _nonces[owner]++;
        }
    }

    function _useCheckedNonce(address owner, uint256 nonce) internal virtual {
        uint256 current = _useNonce(owner);
        if (nonce != current) {
            revert InvalidAccountNonce(owner, current);
        }
    }
}

library Panic {
    uint256 internal constant GENERIC = 0x00;
    uint256 internal constant ASSERT = 0x01;
    uint256 internal constant UNDER_OVERFLOW = 0x11;
    uint256 internal constant DIVISION_BY_ZERO = 0x12;
    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;
    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;
    uint256 internal constant EMPTY_ARRAY_POP = 0x31;
    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;
    uint256 internal constant RESOURCE_ERROR = 0x41;
    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;

    function panic(uint256 code) internal pure {
        assembly ("memory-safe") {
            mstore(0x00, 0x4e487b71)
            mstore(0x20, code)
            revert(0x1c, 0x24)
        }
    }
}

library StorageSlot {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    struct Int256Slot {
        int256 value;
    }

    struct StringSlot {
        string value;
    }

    struct BytesSlot {
        bytes value;
    }

    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        assembly ("memory-safe") {
            r.slot := slot
        }
    }

    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        assembly ("memory-safe") {
            r.slot := slot
        }
    }

    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        assembly ("memory-safe") {
            r.slot := slot
        }
    }

    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        assembly ("memory-safe") {
            r.slot := slot
        }
    }

    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {
        assembly ("memory-safe") {
            r.slot := slot
        }
    }

    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
        assembly ("memory-safe") {
            r.slot := slot
        }
    }

    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
        assembly ("memory-safe") {
            r.slot := store.slot
        }
    }

    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
        assembly ("memory-safe") {
            r.slot := slot
        }
    }

    
    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
        assembly ("memory-safe") {
            r.slot := store.slot
        }
    }
}
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS
    }

    error ECDSAInvalidSignature();

    error ECDSAInvalidSignatureLength(uint256 length);

    error ECDSAInvalidSignatureS(bytes32 s);

    function tryRecover(
        bytes32 hash,
        bytes memory signature
    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly ("memory-safe") {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));
        }
    }

    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);
        _throwError(error, errorArg);
        return recovered;
    }

    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {
        unchecked {
            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
            uint8 v = uint8((uint256(vs) >> 255) + 27);
            return tryRecover(hash, v, r, s);
        }
    }

    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);
        _throwError(error, errorArg);
        return recovered;
    }

    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {
       
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS, s);
        }

        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature, bytes32(0));
        }

        return (signer, RecoverError.NoError, bytes32(0));
    }

    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);
        _throwError(error, errorArg);
        return recovered;
    }
    function _throwError(RecoverError error, bytes32 errorArg) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert ECDSAInvalidSignature();
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert ECDSAInvalidSignatureLength(uint256(errorArg));
        } else if (error == RecoverError.InvalidSignatureS) {
            revert ECDSAInvalidSignatureS(errorArg);
        }
    }
}
library SafeCast {
    
    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);
    error SafeCastOverflowedIntToUint(int256 value);
    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);
    error SafeCastOverflowedUintToInt(uint256 value);
   
    function toUint248(uint256 value) internal pure returns (uint248) {
        if (value > type(uint248).max) {
            revert SafeCastOverflowedUintDowncast(248, value);
        }
        return uint248(value);
    }

    function toUint240(uint256 value) internal pure returns (uint240) {
        if (value > type(uint240).max) {
            revert SafeCastOverflowedUintDowncast(240, value);
        }
        return uint240(value);
    }

    function toUint232(uint256 value) internal pure returns (uint232) {
        if (value > type(uint232).max) {
            revert SafeCastOverflowedUintDowncast(232, value);
        }
        return uint232(value);
    }

    function toUint224(uint256 value) internal pure returns (uint224) {
        if (value > type(uint224).max) {
            revert SafeCastOverflowedUintDowncast(224, value);
        }
        return uint224(value);
    }

   
    function toUint216(uint256 value) internal pure returns (uint216) {
        if (value > type(uint216).max) {
            revert SafeCastOverflowedUintDowncast(216, value);
        }
        return uint216(value);
    }

    function toUint208(uint256 value) internal pure returns (uint208) {
        if (value > type(uint208).max) {
            revert SafeCastOverflowedUintDowncast(208, value);
        }
        return uint208(value);
    }

    function toUint200(uint256 value) internal pure returns (uint200) {
        if (value > type(uint200).max) {
            revert SafeCastOverflowedUintDowncast(200, value);
        }
        return uint200(value);
    }

    function toUint192(uint256 value) internal pure returns (uint192) {
        if (value > type(uint192).max) {
            revert SafeCastOverflowedUintDowncast(192, value);
        }
        return uint192(value);
    }

    function toUint184(uint256 value) internal pure returns (uint184) {
        if (value > type(uint184).max) {
            revert SafeCastOverflowedUintDowncast(184, value);
        }
        return uint184(value);
    }

    
    function toUint176(uint256 value) internal pure returns (uint176) {
        if (value > type(uint176).max) {
            revert SafeCastOverflowedUintDowncast(176, value);
        }
        return uint176(value);
    }

    function toUint168(uint256 value) internal pure returns (uint168) {
        if (value > type(uint168).max) {
            revert SafeCastOverflowedUintDowncast(168, value);
        }
        return uint168(value);
    }
    
    function toUint160(uint256 value) internal pure returns (uint160) {
        if (value > type(uint160).max) {
            revert SafeCastOverflowedUintDowncast(160, value);
        }
        return uint160(value);
    }

    
    function toUint152(uint256 value) internal pure returns (uint152) {
        if (value > type(uint152).max) {
            revert SafeCastOverflowedUintDowncast(152, value);
        }
        return uint152(value);
    }

   
    function toUint144(uint256 value) internal pure returns (uint144) {
        if (value > type(uint144).max) {
            revert SafeCastOverflowedUintDowncast(144, value);
        }
        return uint144(value);
    }
    
    function toUint136(uint256 value) internal pure returns (uint136) {
        if (value > type(uint136).max) {
            revert SafeCastOverflowedUintDowncast(136, value);
        }
        return uint136(value);
    }
   
    function toUint128(uint256 value) internal pure returns (uint128) {
        if (value > type(uint128).max) {
            revert SafeCastOverflowedUintDowncast(128, value);
        }
        return uint128(value);
    }

    
    function toUint120(uint256 value) internal pure returns (uint120) {
        if (value > type(uint120).max) {
            revert SafeCastOverflowedUintDowncast(120, value);
        }
        return uint120(value);
    }
    
    function toUint112(uint256 value) internal pure returns (uint112) {
        if (value > type(uint112).max) {
            revert SafeCastOverflowedUintDowncast(112, value);
        }
        return uint112(value);
    }

    function toUint104(uint256 value) internal pure returns (uint104) {
        if (value > type(uint104).max) {
            revert SafeCastOverflowedUintDowncast(104, value);
        }
        return uint104(value);
    }

   
    function toUint96(uint256 value) internal pure returns (uint96) {
        if (value > type(uint96).max) {
            revert SafeCastOverflowedUintDowncast(96, value);
        }
        return uint96(value);
    }

    function toUint88(uint256 value) internal pure returns (uint88) {
        if (value > type(uint88).max) {
            revert SafeCastOverflowedUintDowncast(88, value);
        }
        return uint88(value);
    }

   
    function toUint80(uint256 value) internal pure returns (uint80) {
        if (value > type(uint80).max) {
            revert SafeCastOverflowedUintDowncast(80, value);
        }
        return uint80(value);
    }

    function toUint72(uint256 value) internal pure returns (uint72) {
        if (value > type(uint72).max) {
            revert SafeCastOverflowedUintDowncast(72, value);
        }
        return uint72(value);
    }
    
    function toUint64(uint256 value) internal pure returns (uint64) {
        if (value > type(uint64).max) {
            revert SafeCastOverflowedUintDowncast(64, value);
        }
        return uint64(value);
    }

    function toUint56(uint256 value) internal pure returns (uint56) {
        if (value > type(uint56).max) {
            revert SafeCastOverflowedUintDowncast(56, value);
        }
        return uint56(value);
    }

 
    function toUint48(uint256 value) internal pure returns (uint48) {
        if (value > type(uint48).max) {
            revert SafeCastOverflowedUintDowncast(48, value);
        }
        return uint48(value);
    }

    function toUint40(uint256 value) internal pure returns (uint40) {
        if (value > type(uint40).max) {
            revert SafeCastOverflowedUintDowncast(40, value);
        }
        return uint40(value);
    }

 
    function toUint32(uint256 value) internal pure returns (uint32) {
        if (value > type(uint32).max) {
            revert SafeCastOverflowedUintDowncast(32, value);
        }
        return uint32(value);
    }

    function toUint24(uint256 value) internal pure returns (uint24) {
        if (value > type(uint24).max) {
            revert SafeCastOverflowedUintDowncast(24, value);
        }
        return uint24(value);
    }

    function toUint16(uint256 value) internal pure returns (uint16) {
        if (value > type(uint16).max) {
            revert SafeCastOverflowedUintDowncast(16, value);
        }
        return uint16(value);
    }

 
    function toUint8(uint256 value) internal pure returns (uint8) {
        if (value > type(uint8).max) {
            revert SafeCastOverflowedUintDowncast(8, value);
        }
        return uint8(value);
    }

    function toUint256(int256 value) internal pure returns (uint256) {
        if (value < 0) {
            revert SafeCastOverflowedIntToUint(value);
        }
        return uint256(value);
    }

 
    function toInt248(int256 value) internal pure returns (int248 downcasted) {
        downcasted = int248(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(248, value);
        }
    }

    function toInt240(int256 value) internal pure returns (int240 downcasted) {
        downcasted = int240(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(240, value);
        }
    }

    function toInt232(int256 value) internal pure returns (int232 downcasted) {
        downcasted = int232(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(232, value);
        }
    }

    function toInt224(int256 value) internal pure returns (int224 downcasted) {
        downcasted = int224(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(224, value);
        }
    }

    function toInt216(int256 value) internal pure returns (int216 downcasted) {
        downcasted = int216(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(216, value);
        }
    }


    function toInt208(int256 value) internal pure returns (int208 downcasted) {
        downcasted = int208(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(208, value);
        }
    }

    function toInt200(int256 value) internal pure returns (int200 downcasted) {
        downcasted = int200(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(200, value);
        }
    }


    function toInt192(int256 value) internal pure returns (int192 downcasted) {
        downcasted = int192(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(192, value);
        }
    }

    function toInt184(int256 value) internal pure returns (int184 downcasted) {
        downcasted = int184(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(184, value);
        }
    }

    function toInt176(int256 value) internal pure returns (int176 downcasted) {
        downcasted = int176(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(176, value);
        }
    }

    function toInt168(int256 value) internal pure returns (int168 downcasted) {
        downcasted = int168(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(168, value);
        }
    }


    function toInt160(int256 value) internal pure returns (int160 downcasted) {
        downcasted = int160(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(160, value);
        }
    }

    function toInt152(int256 value) internal pure returns (int152 downcasted) {
        downcasted = int152(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(152, value);
        }
    }

    function toInt144(int256 value) internal pure returns (int144 downcasted) {
        downcasted = int144(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(144, value);
        }
    }

 
    function toInt136(int256 value) internal pure returns (int136 downcasted) {
        downcasted = int136(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(136, value);
        }
    }

    function toInt128(int256 value) internal pure returns (int128 downcasted) {
        downcasted = int128(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(128, value);
        }
    }

 
    function toInt120(int256 value) internal pure returns (int120 downcasted) {
        downcasted = int120(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(120, value);
        }
    }

    function toInt112(int256 value) internal pure returns (int112 downcasted) {
        downcasted = int112(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(112, value);
        }
    }

    function toInt104(int256 value) internal pure returns (int104 downcasted) {
        downcasted = int104(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(104, value);
        }
    }

    function toInt96(int256 value) internal pure returns (int96 downcasted) {
        downcasted = int96(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(96, value);
        }
    }

    function toInt88(int256 value) internal pure returns (int88 downcasted) {
        downcasted = int88(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(88, value);
        }
    }

    function toInt80(int256 value) internal pure returns (int80 downcasted) {
        downcasted = int80(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(80, value);
        }
    }


    function toInt72(int256 value) internal pure returns (int72 downcasted) {
        downcasted = int72(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(72, value);
        }
    }


    function toInt64(int256 value) internal pure returns (int64 downcasted) {
        downcasted = int64(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(64, value);
        }
    }

    function toInt56(int256 value) internal pure returns (int56 downcasted) {
        downcasted = int56(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(56, value);
        }
    }
  
    function toInt48(int256 value) internal pure returns (int48 downcasted) {
        downcasted = int48(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(48, value);
        }
    }
  
    function toInt40(int256 value) internal pure returns (int40 downcasted) {
        downcasted = int40(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(40, value);
        }
    }
  
    function toInt32(int256 value) internal pure returns (int32 downcasted) {
        downcasted = int32(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(32, value);
        }
    }
  
    function toInt24(int256 value) internal pure returns (int24 downcasted) {
        downcasted = int24(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(24, value);
        }
    }
  
    function toInt16(int256 value) internal pure returns (int16 downcasted) {
        downcasted = int16(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(16, value);
        }
    }
    
    function toInt8(int256 value) internal pure returns (int8 downcasted) {
        downcasted = int8(value);
        if (downcasted != value) {
            revert SafeCastOverflowedIntDowncast(8, value);
        }
    }
 
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        if (value > uint256(type(int256).max)) {
            revert SafeCastOverflowedUintToInt(value);
        }
        return int256(value);
    }

  
    function toUint(bool b) internal pure returns (uint256 u) {
        assembly ("memory-safe") {
            u := iszero(iszero(b))
        }
    }
}

abstract contract Ownable is Context {
    address private _owner;
    error OwnableUnauthorizedAccount(address account);
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }


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

    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }


    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol

// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

interface IERC20Metadata is IERC20 {
//full data of JEFE TOKEN
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

// lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ShortStrings.sol)

// | string  | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA   |
// | length  | 0x                                                              BB |
type ShortString is bytes32;

library ShortStrings {
    // Used as an identifier for strings longer than 31 bytes.
    bytes32 private constant FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;

    error StringTooLong(string str);
    error InvalidShortString();

    function toShortString(string memory str) internal pure returns (ShortString) {
        bytes memory bstr = bytes(str);
        if (bstr.length > 31) {
            revert StringTooLong(str);
        }
        return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));
    }

    function toString(ShortString sstr) internal pure returns (string memory) {
        uint256 len = byteLength(sstr);
        string memory str = new string(32);
        assembly ("memory-safe") {
            mstore(str, len)
            mstore(add(str, 0x20), sstr)
        }
        return str;
    }


    function byteLength(ShortString sstr) internal pure returns (uint256) {
        uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;
        if (result > 31) {
            revert InvalidShortString();
        }
        return result;
    }
 
    function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {
        if (bytes(value).length < 32) {
            return toShortString(value);
        } else {
            StorageSlot.getStringSlot(store).value = value;
            return ShortString.wrap(FALLBACK_SENTINEL);
        }
    }
  
    function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {
        if (ShortString.unwrap(value) != FALLBACK_SENTINEL) {
            return toString(value);
        } else {
            return store;
        }
    }

    function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {
        if (ShortString.unwrap(value) != FALLBACK_SENTINEL) {
            return byteLength(value);
        } else {
            return bytes(store).length;
        }
    }
}


library SignedMath {
   
    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {
        unchecked {
            return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));
        }
    }

  
    function max(int256 a, int256 b) internal pure returns (int256) {
        return ternary(a > b, a, b);
    }


    function min(int256 a, int256 b) internal pure returns (int256) {
        return ternary(a < b, a, b);
    }

    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            int256 mask = n >> 255;

            // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.
            return uint256((n + mask) ^ mask);
        }
    }
}

library Math {
    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

 
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }
 
    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }


    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {
        unchecked {
            // branchless ternary works because:
            // b ^ (a ^ b) == a
            // b ^ 0 == b
            return b ^ ((a ^ b) * SafeCast.toUint(condition));
        }
    }

  
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return ternary(a > b, a, b);
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return ternary(a < b, a, b);
    }

    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            Panic.panic(Panic.DIVISION_BY_ZERO);
        }

        unchecked {
            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);
        }
    }

    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
 
            uint256 prod0 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            if (prod1 == 0) {
                               return prod0 / denominator;
            }

            // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.
            if (denominator <= prod1) {
                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));
            }

            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }


            uint256 twos = denominator & (0 - denominator);
            assembly {
                denominator := div(denominator, twos)

                prod0 := div(prod0, twos)

                twos := add(div(sub(0, twos), twos), 1)
            }

            prod0 |= prod1 * twos;

            uint256 inverse = (3 * denominator) ^ 2;
            inverse *= 2 - denominator * inverse; // inverse mod 2⁸
            inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶
            inverse *= 2 - denominator * inverse; // inverse mod 2³²
            inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴
            inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸
            inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶

            result = prod0 * inverse;
            return result;
        }
    }

    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);
    }


    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {
        unchecked {
            if (n == 0) return 0;


            uint256 remainder = a % n;
            uint256 gcd = n;


            int256 x = 0;
            int256 y = 1;

            while (remainder != 0) {
                uint256 quotient = gcd / remainder;

                (gcd, remainder) = (
                    remainder,
                    gcd - remainder * quotient
                );

                (x, y) = (
                    y,
                    x - y * int256(quotient)
                );
            }

            if (gcd != 1) return 0; // No inverse exists.
            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.
        }
    }

 
    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {
        unchecked {
            return Math.modExp(a, p - 2, p);
        }
    }

    
    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {
        (bool success, uint256 result) = tryModExp(b, e, m);
        if (!success) {
            Panic.panic(Panic.DIVISION_BY_ZERO);
        }
        return result;
    }


    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {
        if (m == 0) return (false, 0);
        assembly ("memory-safe") {
            let ptr := mload(0x40)
            mstore(ptr, 0x20)
            mstore(add(ptr, 0x20), 0x20)
            mstore(add(ptr, 0x40), 0x20)
            mstore(add(ptr, 0x60), b)
            mstore(add(ptr, 0x80), e)
            mstore(add(ptr, 0xa0), m)

            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)
            result := mload(0x00)
        }
    }

 
    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {
        (bool success, bytes memory result) = tryModExp(b, e, m);
        if (!success) {
            Panic.panic(Panic.DIVISION_BY_ZERO);
        }
        return result;
    }


    function tryModExp(
        bytes memory b,
        bytes memory e,
        bytes memory m
    ) internal view returns (bool success, bytes memory result) {
        if (_zeroBytes(m)) return (false, new bytes(0));

        uint256 mLen = m.length;

        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);

        assembly ("memory-safe") {
            let dataPtr := add(result, 0x20)
            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)
            mstore(result, mLen)
            mstore(0x40, add(dataPtr, mLen))
        }
    }

  
    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {
        for (uint256 i = 0; i < byteArray.length; ++i) {
            if (byteArray[i] != 0) {
                return false;
            }
        }
        return true;
    }

    function sqrt(uint256 a) internal pure returns (uint256) {
        unchecked {
            if (a <= 1) {
                return a;
            }


            uint256 aa = a;
            uint256 xn = 1;

            if (aa >= (1 << 128)) {
                aa >>= 128;
                xn <<= 64;
            }
            if (aa >= (1 << 64)) {
                aa >>= 64;
                xn <<= 32;
            }
            if (aa >= (1 << 32)) {
                aa >>= 32;
                xn <<= 16;
            }
            if (aa >= (1 << 16)) {
                aa >>= 16;
                xn <<= 8;
            }
            if (aa >= (1 << 8)) {
                aa >>= 8;
                xn <<= 4;
            }
            if (aa >= (1 << 4)) {
                aa >>= 4;
                xn <<= 2;
            }
            if (aa >= (1 << 2)) {
                xn <<= 1;
            }

            xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5)  -- special case, see above
            xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9)    -- general case with k = 4.5
            xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18)   -- general case with k = 9
            xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36)   -- general case with k = 18
            xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72)   -- general case with k = 36
            xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144)  -- general case with k = 72

 
            return xn - SafeCast.toUint(xn > a / xn);
        }
    }

    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);
        }
    }

    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        uint256 exp;
        unchecked {
            exp = 128 * SafeCast.toUint(value > (1 << 128) - 1);
            value >>= exp;
            result += exp;

            exp = 64 * SafeCast.toUint(value > (1 << 64) - 1);
            value >>= exp;
            result += exp;

            exp = 32 * SafeCast.toUint(value > (1 << 32) - 1);
            value >>= exp;
            result += exp;

            exp = 16 * SafeCast.toUint(value > (1 << 16) - 1);
            value >>= exp;
            result += exp;

            exp = 8 * SafeCast.toUint(value > (1 << 8) - 1);
            value >>= exp;
            result += exp;

            exp = 4 * SafeCast.toUint(value > (1 << 4) - 1);
            value >>= exp;
            result += exp;

            exp = 2 * SafeCast.toUint(value > (1 << 2) - 1);
            value >>= exp;
            result += exp;

            result += SafeCast.toUint(value > 1);
        }
        return result;
    }

    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);
        }
    }

    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);
        }
    }

    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        uint256 isGt;
        unchecked {
            isGt = SafeCast.toUint(value > (1 << 128) - 1);
            value >>= isGt * 128;
            result += isGt * 16;

            isGt = SafeCast.toUint(value > (1 << 64) - 1);
            value >>= isGt * 64;
            result += isGt * 8;

            isGt = SafeCast.toUint(value > (1 << 32) - 1);
            value >>= isGt * 32;
            result += isGt * 4;

            isGt = SafeCast.toUint(value > (1 << 16) - 1);
            value >>= isGt * 16;
            result += isGt * 2;

            result += SafeCast.toUint(value > (1 << 8) - 1);
        }
        return result;
    }


    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);
        }
    }


    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;
    mapping(address account => mapping(address spender => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

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

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

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

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

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

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

    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                _totalSupply -= value;
            }
        } else {
            unchecked {
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;
    error StringsInsufficientHexLength(uint256 value, uint256 length);
  
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            assembly ("memory-safe") {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                assembly ("memory-safe") {
                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
    }
   
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        return string(buffer);
    }

 
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
    }

    function toChecksumHexString(address addr) internal pure returns (string memory) {
        bytes memory buffer = bytes(toHexString(addr));

        uint256 hashValue;
        assembly ("memory-safe") {
            hashValue := shr(96, keccak256(add(buffer, 0x22), 40))
        }

        for (uint256 i = 41; i > 1; --i) {
            if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {
                buffer[i] ^= 0x20;
            }
            hashValue >>= 4;
        }
        return string(buffer);
    }

    function equal(string memory a, string memory b) internal pure returns (bool) {
        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}
    //No burning allowed

library MessageHashUtils {
  
    function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {
        assembly ("memory-safe") {
            mstore(0x00, "\x19Signed Message:\n32") // 32 is the bytes-length of messageHash
            mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix
            digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)
        }
    }

    function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {
        return
            keccak256(bytes.concat("\x19Signed Message:\n", bytes(Strings.toString(message.length)), message));
    }

    function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(hex"19_00", validator, data));
    }

    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {
        assembly ("memory-safe") {
            let ptr := mload(0x40)
            mstore(ptr, hex"19_01")
            mstore(add(ptr, 0x02), domainSeparator)
            mstore(add(ptr, 0x22), structHash)
            digest := keccak256(ptr, 0x42)
        }
    }
}

abstract contract EIP712 is IERC5267 {
    using ShortStrings for *;
    bytes32 private constant TYPE_HASH =
    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");

    bytes32 private immutable _cachedDomainSeparator;
    uint256 private immutable _cachedChainId;
    address private immutable _cachedThis;

    bytes32 private immutable _hashedName;
    bytes32 private immutable _hashedVersion;

    ShortString private immutable _name;
    ShortString private immutable _version;
    string private _nameFallback;
    string private _versionFallback;

    constructor(string memory name, string memory version) {
        _name = name.toShortStringWithFallback(_nameFallback);
        _version = version.toShortStringWithFallback(_versionFallback);
        _hashedName = keccak256(bytes(name));
        _hashedVersion = keccak256(bytes(version));

        _cachedChainId = block.chainid;
        _cachedDomainSeparator = _buildDomainSeparator();
        _cachedThis = address(this);
    }

    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _cachedThis && block.chainid == _cachedChainId) {
            return _cachedDomainSeparator;
        } else {
            return _buildDomainSeparator();
        }
    }

    function _buildDomainSeparator() private view returns (bytes32) {
        return keccak256(abi.encode(TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));
    }

 
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);
    }

    function eip712Domain()
        public
        view
        virtual
        returns (
            bytes1 fields,
            string memory name,
            string memory version,
            uint256 chainId,
            address verifyingContract,
            bytes32 salt,
            uint256[] memory extensions
        )
    {
        return (
            hex"0f", // 01111
            _EIP712Name(),
            _EIP712Version(),
            block.chainid,
            address(this),
            bytes32(0),
            new uint256[](0)
        );
    }


    function _EIP712Name() internal view returns (string memory) {
        return _name.toStringWithFallback(_nameFallback);
    }

    function _EIP712Version() internal view returns (string memory) {
        return _version.toStringWithFallback(_versionFallback);
    }
}


abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712, Nonces {
    bytes32 private constant PERMIT_TYPEHASH =
    keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    error ERC2612ExpiredSignature(uint256 deadline);
    error ERC2612InvalidSigner(address signer, address owner);
    constructor(string memory name) EIP712(name, "1") {}

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        if (block.timestamp > deadline) {
            revert ERC2612ExpiredSignature(deadline);
        }

        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));
        bytes32 hash = _hashTypedDataV4(structHash);
        address signer = ECDSA.recover(hash, v, r, s);
        if (signer != owner) {
            revert ERC2612InvalidSigner(signer, owner);
        }

        _approve(owner, spender, value);
    }

    function nonces(address owner) public view virtual override(IERC20Permit, Nonces) returns (uint256) {
        return super.nonces(owner);
    }

    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {
        return _domainSeparatorV4();
    }
}

// Compatible with OpenZeppelin Contracts ^5.0.0

contract JEFE is ERC20, ERC20Permit, Ownable {

    uint256 public constant MAX_SUPPLY = 10_000_000 * 10 ** 9;  
    //  max supply

    constructor(
        address initialOwner
    ) ERC20("JEFE TOKEN", "JEFE") ERC20Permit("JEFE TOKEN") Ownable(initialOwner) {
        _mint(initialOwner, MAX_SUPPLY);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC2612ExpiredSignature","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC2612InvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidAccountNonce","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"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":[],"name":"EIP712DomainChanged","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":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"value","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":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","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":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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"}]

61016060405234801562000011575f80fd5b506040516200168b3803806200168b833981016040819052620000349162000418565b806040518060400160405280600a8152602001692522a322902a27a5a2a760b11b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600a8152602001692522a322902a27a5a2a760b11b815250604051806040016040528060048152602001634a45464560e01b8152508160039081620000c49190620004e7565b506004620000d38282620004e7565b50620000e591508390506005620001e2565b61012052620000f6816006620001e2565b61014052815160208084019190912060e052815190820120610100524660a0526200018360e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c052506001600160a01b038116620001bc57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b620001c7816200021a565b50620001db81662386f26fc100006200026b565b5062000640565b5f6020835110156200020157620001f983620002a7565b905062000214565b816200020e8482620004e7565b5060ff90505b92915050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216620002965760405163ec442f0560e01b81525f6004820152602401620001b3565b620002a35f8383620002e9565b5050565b5f80829050601f81511115620002d4578260405163305a27a960e01b8152600401620001b39190620005af565b8051620002e182620005fc565b179392505050565b6001600160a01b03831662000317578060025f8282546200030b919062000620565b90915550620003899050565b6001600160a01b0383165f90815260208190526040902054818110156200036b5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620001b3565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216620003a757600280548290039055620003c5565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200040b91815260200190565b60405180910390a3505050565b5f6020828403121562000429575f80fd5b81516001600160a01b038116811462000440575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200047057607f821691505b6020821081036200048f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620004e2575f81815260208120601f850160051c81016020861015620004bd5750805b601f850160051c820191505b81811015620004de57828155600101620004c9565b5050505b505050565b81516001600160401b0381111562000503576200050362000447565b6200051b816200051484546200045b565b8462000495565b602080601f83116001811462000551575f8415620005395750858301515b5f19600386901b1c1916600185901b178555620004de565b5f85815260208120601f198616915b82811015620005815788860151825594840194600190910190840162000560565b50858210156200059f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020808352835180828501525f5b81811015620005dc57858101830151858201604001528201620005be565b505f604082860101526040601f19601f8301168501019250505092915050565b805160208083015191908110156200048f575f1960209190910360031b1b16919050565b808201808211156200021457634e487b7160e01b5f52601160045260245ffd5b60805160a05160c05160e051610100516101205161014051610ff9620006925f395f61082e01525f61080101525f61072c01525f61070401525f61065f01525f61068901525f6106b30152610ff95ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c8063715018a61161009e57806395d89b411161006e57806395d89b4114610210578063a9059cbb14610218578063d505accf1461022b578063dd62ed3e1461023e578063f2fde38b14610276575f80fd5b8063715018a6146101bd5780637ecebe00146101c757806384b0196e146101da5780638da5cb5b146101f5575f80fd5b8063313ce567116100d9578063313ce5671461017057806332cb6b0c1461017f5780633644e5151461018d57806370a0823114610195575f80fd5b806306fdde031461010a578063095ea7b31461012857806318160ddd1461014b57806323b872dd1461015d575b5f80fd5b610112610289565b60405161011f9190610d78565b60405180910390f35b61013b610136366004610dac565b610319565b604051901515815260200161011f565b6002545b60405190815260200161011f565b61013b61016b366004610dd4565b610332565b6040516009815260200161011f565b61014f662386f26fc1000081565b61014f610355565b61014f6101a3366004610e0d565b6001600160a01b03165f9081526020819052604090205490565b6101c5610363565b005b61014f6101d5366004610e0d565b610376565b6101e2610393565b60405161011f9796959493929190610e26565b6008546040516001600160a01b03909116815260200161011f565b6101126103d5565b61013b610226366004610dac565b6103e4565b6101c5610239366004610eba565b6103f1565b61014f61024c366004610f27565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6101c5610284366004610e0d565b61052c565b60606003805461029890610f58565b80601f01602080910402602001604051908101604052809291908181526020018280546102c490610f58565b801561030f5780601f106102e65761010080835404028352916020019161030f565b820191905f5260205f20905b8154815290600101906020018083116102f257829003601f168201915b5050505050905090565b5f33610326818585610569565b60019150505b92915050565b5f3361033f85828561057b565b61034a8585856105f6565b506001949350505050565b5f61035e610653565b905090565b61036b61077c565b6103745f6107a9565b565b6001600160a01b0381165f9081526007602052604081205461032c565b5f6060805f805f60606103a46107fa565b6103ac610827565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60606004805461029890610f58565b5f336103268185856105f6565b8342111561041a5760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886104658c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6104bf82610854565b90505f6104ce82878787610880565b9050896001600160a01b0316816001600160a01b031614610515576040516325c0072360e11b81526001600160a01b0380831660048301528b166024820152604401610411565b6105208a8a8a610569565b50505050505050505050565b61053461077c565b6001600160a01b03811661055d57604051631e4fbdf760e01b81525f6004820152602401610411565b610566816107a9565b50565b61057683838360016108ac565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146105f057818110156105e257604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610411565b6105f084848484035f6108ac565b50505050565b6001600160a01b03831661061f57604051634b637e8f60e11b81525f6004820152602401610411565b6001600160a01b0382166106485760405163ec442f0560e01b81525f6004820152602401610411565b61057683838361097e565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156106ab57507f000000000000000000000000000000000000000000000000000000000000000046145b156106d557507f000000000000000000000000000000000000000000000000000000000000000090565b61035e604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b6008546001600160a01b031633146103745760405163118cdaa760e01b8152336004820152602401610411565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606061035e7f00000000000000000000000000000000000000000000000000000000000000006005610aa4565b606061035e7f00000000000000000000000000000000000000000000000000000000000000006006610aa4565b5f61032c610860610653565b8360405161190160f01b8152600281019290925260228201526042902090565b5f805f8061089088888888610b4d565b9250925092506108a08282610c15565b50909695505050505050565b6001600160a01b0384166108d55760405163e602df0560e01b81525f6004820152602401610411565b6001600160a01b0383166108fe57604051634a1406b160e11b81525f6004820152602401610411565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156105f057826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161097091815260200190565b60405180910390a350505050565b6001600160a01b0383166109a8578060025f82825461099d9190610f90565b90915550610a189050565b6001600160a01b0383165f90815260208190526040902054818110156109fa5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610411565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610a3457600280548290039055610a52565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610a9791815260200190565b60405180910390a3505050565b606060ff8314610abe57610ab783610cd1565b905061032c565b818054610aca90610f58565b80601f0160208091040260200160405190810160405280929190818152602001828054610af690610f58565b8015610b415780601f10610b1857610100808354040283529160200191610b41565b820191905f5260205f20905b815481529060010190602001808311610b2457829003601f168201915b5050505050905061032c565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610b8657505f91506003905082610c0b565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610bd7573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116610c0257505f925060019150829050610c0b565b92505f91508190505b9450945094915050565b5f826003811115610c2857610c28610faf565b03610c31575050565b6001826003811115610c4557610c45610faf565b03610c635760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c7757610c77610faf565b03610c985760405163fce698f760e01b815260048101829052602401610411565b6003826003811115610cac57610cac610faf565b03610ccd576040516335e2f38360e21b815260048101829052602401610411565b5050565b60605f610cdd83610d0e565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f81111561032c57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084525f5b81811015610d5957602081850181015186830182015201610d3d565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610d8a6020830184610d35565b9392505050565b80356001600160a01b0381168114610da7575f80fd5b919050565b5f8060408385031215610dbd575f80fd5b610dc683610d91565b946020939093013593505050565b5f805f60608486031215610de6575f80fd5b610def84610d91565b9250610dfd60208501610d91565b9150604084013590509250925092565b5f60208284031215610e1d575f80fd5b610d8a82610d91565b60ff60f81b881681525f602060e081840152610e4560e084018a610d35565b8381036040850152610e57818a610d35565b606085018990526001600160a01b038816608086015260a0850187905284810360c086015285518082528387019250908301905f5b81811015610ea857835183529284019291840191600101610e8c565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215610ed0575f80fd5b610ed988610d91565b9650610ee760208901610d91565b95506040880135945060608801359350608088013560ff81168114610f0a575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610f38575f80fd5b610f4183610d91565b9150610f4f60208401610d91565b90509250929050565b600181811c90821680610f6c57607f821691505b602082108103610f8a57634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561032c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220f0de2ee72934fd6590a802c9eb175bf6af3d871eec4169bb77cbe92fab056ec164736f6c63430008150033000000000000000000000000f7836552f9fefce49f819649ebbd26b354c6fc10

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610106575f3560e01c8063715018a61161009e57806395d89b411161006e57806395d89b4114610210578063a9059cbb14610218578063d505accf1461022b578063dd62ed3e1461023e578063f2fde38b14610276575f80fd5b8063715018a6146101bd5780637ecebe00146101c757806384b0196e146101da5780638da5cb5b146101f5575f80fd5b8063313ce567116100d9578063313ce5671461017057806332cb6b0c1461017f5780633644e5151461018d57806370a0823114610195575f80fd5b806306fdde031461010a578063095ea7b31461012857806318160ddd1461014b57806323b872dd1461015d575b5f80fd5b610112610289565b60405161011f9190610d78565b60405180910390f35b61013b610136366004610dac565b610319565b604051901515815260200161011f565b6002545b60405190815260200161011f565b61013b61016b366004610dd4565b610332565b6040516009815260200161011f565b61014f662386f26fc1000081565b61014f610355565b61014f6101a3366004610e0d565b6001600160a01b03165f9081526020819052604090205490565b6101c5610363565b005b61014f6101d5366004610e0d565b610376565b6101e2610393565b60405161011f9796959493929190610e26565b6008546040516001600160a01b03909116815260200161011f565b6101126103d5565b61013b610226366004610dac565b6103e4565b6101c5610239366004610eba565b6103f1565b61014f61024c366004610f27565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6101c5610284366004610e0d565b61052c565b60606003805461029890610f58565b80601f01602080910402602001604051908101604052809291908181526020018280546102c490610f58565b801561030f5780601f106102e65761010080835404028352916020019161030f565b820191905f5260205f20905b8154815290600101906020018083116102f257829003601f168201915b5050505050905090565b5f33610326818585610569565b60019150505b92915050565b5f3361033f85828561057b565b61034a8585856105f6565b506001949350505050565b5f61035e610653565b905090565b61036b61077c565b6103745f6107a9565b565b6001600160a01b0381165f9081526007602052604081205461032c565b5f6060805f805f60606103a46107fa565b6103ac610827565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60606004805461029890610f58565b5f336103268185856105f6565b8342111561041a5760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886104658c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6104bf82610854565b90505f6104ce82878787610880565b9050896001600160a01b0316816001600160a01b031614610515576040516325c0072360e11b81526001600160a01b0380831660048301528b166024820152604401610411565b6105208a8a8a610569565b50505050505050505050565b61053461077c565b6001600160a01b03811661055d57604051631e4fbdf760e01b81525f6004820152602401610411565b610566816107a9565b50565b61057683838360016108ac565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146105f057818110156105e257604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610411565b6105f084848484035f6108ac565b50505050565b6001600160a01b03831661061f57604051634b637e8f60e11b81525f6004820152602401610411565b6001600160a01b0382166106485760405163ec442f0560e01b81525f6004820152602401610411565b61057683838361097e565b5f306001600160a01b037f00000000000000000000000070e7f1d907e30efb18fe1dd8a1d75c09a98177d3161480156106ab57507f000000000000000000000000000000000000000000000000000000000000009246145b156106d557507fa974071c67a6964d31db3e60079dc554fd8adbeb93d3ff655bff56a608030d9290565b61035e604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f6b6d8a434d02ec021f79d6d3ff49f0797c6a0523fc1eef20ab3790adf1f0e9ff918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b6008546001600160a01b031633146103745760405163118cdaa760e01b8152336004820152602401610411565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606061035e7f4a45464520544f4b454e0000000000000000000000000000000000000000000a6005610aa4565b606061035e7f31000000000000000000000000000000000000000000000000000000000000016006610aa4565b5f61032c610860610653565b8360405161190160f01b8152600281019290925260228201526042902090565b5f805f8061089088888888610b4d565b9250925092506108a08282610c15565b50909695505050505050565b6001600160a01b0384166108d55760405163e602df0560e01b81525f6004820152602401610411565b6001600160a01b0383166108fe57604051634a1406b160e11b81525f6004820152602401610411565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156105f057826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161097091815260200190565b60405180910390a350505050565b6001600160a01b0383166109a8578060025f82825461099d9190610f90565b90915550610a189050565b6001600160a01b0383165f90815260208190526040902054818110156109fa5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610411565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610a3457600280548290039055610a52565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610a9791815260200190565b60405180910390a3505050565b606060ff8314610abe57610ab783610cd1565b905061032c565b818054610aca90610f58565b80601f0160208091040260200160405190810160405280929190818152602001828054610af690610f58565b8015610b415780601f10610b1857610100808354040283529160200191610b41565b820191905f5260205f20905b815481529060010190602001808311610b2457829003601f168201915b5050505050905061032c565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610b8657505f91506003905082610c0b565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610bd7573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116610c0257505f925060019150829050610c0b565b92505f91508190505b9450945094915050565b5f826003811115610c2857610c28610faf565b03610c31575050565b6001826003811115610c4557610c45610faf565b03610c635760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c7757610c77610faf565b03610c985760405163fce698f760e01b815260048101829052602401610411565b6003826003811115610cac57610cac610faf565b03610ccd576040516335e2f38360e21b815260048101829052602401610411565b5050565b60605f610cdd83610d0e565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f81111561032c57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084525f5b81811015610d5957602081850181015186830182015201610d3d565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610d8a6020830184610d35565b9392505050565b80356001600160a01b0381168114610da7575f80fd5b919050565b5f8060408385031215610dbd575f80fd5b610dc683610d91565b946020939093013593505050565b5f805f60608486031215610de6575f80fd5b610def84610d91565b9250610dfd60208501610d91565b9150604084013590509250925092565b5f60208284031215610e1d575f80fd5b610d8a82610d91565b60ff60f81b881681525f602060e081840152610e4560e084018a610d35565b8381036040850152610e57818a610d35565b606085018990526001600160a01b038816608086015260a0850187905284810360c086015285518082528387019250908301905f5b81811015610ea857835183529284019291840191600101610e8c565b50909c9b505050505050505050505050565b5f805f805f805f60e0888a031215610ed0575f80fd5b610ed988610d91565b9650610ee760208901610d91565b95506040880135945060608801359350608088013560ff81168114610f0a575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610f38575f80fd5b610f4183610d91565b9150610f4f60208401610d91565b90509250929050565b600181811c90821680610f6c57607f821691505b602082108103610f8a57634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561032c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220f0de2ee72934fd6590a802c9eb175bf6af3d871eec4169bb77cbe92fab056ec164736f6c63430008150033

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

000000000000000000000000f7836552f9fefce49f819649ebbd26b354c6fc10

-----Decoded View---------------
Arg [0] : initialOwner (address): 0xf7836552f9Fefce49f819649ebBd26B354C6fc10

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


Deployed Bytecode Sourcemap

56852:321:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45152:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46023:190;;;;;;:::i;:::-;;:::i;:::-;;;1269:14:1;;1262:22;1244:41;;1232:2;1217:18;46023:190:0;1104:187:1;45450:99:0;45529:12;;45450:99;;;1442:25:1;;;1430:2;1415:18;45450:99:0;1296:177:1;46221:249:0;;;;;;:::i;:::-;;:::i;45359:83::-;;;45433:1;1953:36:1;;1941:2;1926:18;45359:83:0;1811:184:1;56906:57:0;;56943:20;56906:57;;56679:114;;;:::i;45557:118::-;;;;;;:::i;:::-;-1:-1:-1;;;;;45649:18:0;45622:7;45649:18;;;;;;;;;;;;45557:118;26658:103;;;:::i;:::-;;56526:145;;;;;;:::i;:::-;;:::i;54551:580::-;;;:::i;:::-;;;;;;;;;;;;;:::i;26387:87::-;26460:6;;26387:87;;-1:-1:-1;;;;;26460:6:0;;;3783:51:1;;3771:2;3756:18;26387:87:0;3637:203:1;45251:95:0;;;:::i;45683:182::-;;;;;;:::i;:::-;;:::i;55827:691::-;;;;;;:::i;:::-;;:::i;45873:142::-;;;;;;:::i;:::-;-1:-1:-1;;;;;45980:18:0;;;45953:7;45980:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;45873:142;26769:220;;;;;;:::i;:::-;;:::i;45152:91::-;45197:13;45230:5;45223:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45152:91;:::o;46023:190::-;46096:4;3135:10;46152:31;3135:10;46168:7;46177:5;46152:8;:31::i;:::-;46201:4;46194:11;;;46023:190;;;;;:::o;46221:249::-;46308:4;3135:10;46366:37;46382:4;3135:10;46397:5;46366:15;:37::i;:::-;46414:26;46424:4;46430:2;46434:5;46414:9;:26::i;:::-;-1:-1:-1;46458:4:0;;46221:249;-1:-1:-1;;;;46221:249:0:o;56679:114::-;56738:7;56765:20;:18;:20::i;:::-;56758:27;;56679:114;:::o;26658:103::-;26344:13;:11;:13::i;:::-;26723:30:::1;26750:1;26723:18;:30::i;:::-;26658:103::o:0;56526:145::-;-1:-1:-1;;;;;3631:14:0;;56617:7;3631:14;;;:7;:14;;;;;;56644:19;3544:109;54551:580;54654:13;54682:18;54715:21;54751:15;54781:25;54821:12;54848:27;54956:13;:11;:13::i;:::-;54984:16;:14;:16::i;:::-;55096;;;55079:1;55096:16;;;;;;;;;-1:-1:-1;;;54903:220:0;;;-1:-1:-1;54903:220:0;;-1:-1:-1;55015:13:0;;-1:-1:-1;55051:4:0;;-1:-1:-1;55079:1:0;-1:-1:-1;55096:16:0;-1:-1:-1;54903:220:0;-1:-1:-1;54551:580:0:o;45251:95::-;45298:13;45331:7;45324:14;;;;;:::i;45683:182::-;45752:4;3135:10;45808:27;3135:10;45825:2;45829:5;45808:9;:27::i;55827:691::-;56057:8;56039:15;:26;56035:99;;;56089:33;;-1:-1:-1;;;56089:33:0;;;;;1442:25:1;;;1415:18;;56089:33:0;;;;;;;;56035:99;56146:18;55547:95;56205:5;56212:7;56221:5;56228:16;56238:5;-1:-1:-1;;;;;3784:14:0;3726:7;3784:14;;;:7;:14;;;;;:16;;;;;;;;;3666:153;56228:16;56177:78;;;;;;5612:25:1;;;;-1:-1:-1;;;;;5711:15:1;;;5691:18;;;5684:43;5763:15;;;;5743:18;;;5736:43;5795:18;;;5788:34;5838:19;;;5831:35;5882:19;;;5875:35;;;5584:19;;56177:78:0;;;;;;;;;;;;56167:89;;;;;;56146:110;;56267:12;56282:28;56299:10;56282:16;:28::i;:::-;56267:43;;56321:14;56338:28;56352:4;56358:1;56361;56364;56338:13;:28::i;:::-;56321:45;;56391:5;-1:-1:-1;;;;;56381:15:0;:6;-1:-1:-1;;;;;56381:15:0;;56377:90;;56420:35;;-1:-1:-1;;;56420:35:0;;-1:-1:-1;;;;;6151:15:1;;;56420:35:0;;;6133:34:1;6203:15;;6183:18;;;6176:43;6068:18;;56420:35:0;5921:304:1;56377:90:0;56479:31;56488:5;56495:7;56504:5;56479:8;:31::i;:::-;56024:494;;;55827:691;;;;;;;:::o;26769:220::-;26344:13;:11;:13::i;:::-;-1:-1:-1;;;;;26854:22:0;::::1;26850:93;;26900:31;::::0;-1:-1:-1;;;26900:31:0;;26928:1:::1;26900:31;::::0;::::1;3783:51:1::0;3756:18;;26900:31:0::1;3637:203:1::0;26850:93:0::1;26953:28;26972:8;26953:18;:28::i;:::-;26769:220:::0;:::o;47753:130::-;47838:37;47847:5;47854:7;47863:5;47870:4;47838:8;:37::i;:::-;47753:130;;;:::o;48342:487::-;-1:-1:-1;;;;;45980:18:0;;;48442:24;45980:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;48509:37:0;;48505:317;;48586:5;48567:16;:24;48563:132;;;48619:60;;-1:-1:-1;;;48619:60:0;;-1:-1:-1;;;;;6450:32:1;;48619:60:0;;;6432:51:1;6499:18;;;6492:34;;;6542:18;;;6535:34;;;6405:18;;48619:60:0;6230:345:1;48563:132:0;48738:57;48747:5;48754:7;48782:5;48763:16;:24;48789:5;48738:8;:57::i;:::-;48431:398;48342:487;;;:::o;46478:308::-;-1:-1:-1;;;;;46562:18:0;;46558:88;;46604:30;;-1:-1:-1;;;46604:30:0;;46631:1;46604:30;;;3783:51:1;3756:18;;46604:30:0;3637:203:1;46558:88:0;-1:-1:-1;;;;;46660:16:0;;46656:88;;46700:32;;-1:-1:-1;;;46700:32:0;;46729:1;46700:32;;;3783:51:1;3756:18;;46700:32:0;3637:203:1;46656:88:0;46754:24;46762:4;46768:2;46772:5;46754:7;:24::i;53897:268::-;53950:7;53982:4;-1:-1:-1;;;;;53991:11:0;53974:28;;:63;;;;;54023:14;54006:13;:31;53974:63;53970:188;;;-1:-1:-1;54061:22:0;;53897:268::o;53970:188::-;54123:23;54265:80;;;52942:95;54265:80;;;7066:25:1;54287:11:0;7107:18:1;;;7100:34;;;;54300:14:0;7150:18:1;;;7143:34;54316:13:0;7193:18:1;;;7186:34;54339:4:0;7236:19:1;;;7229:61;54228:7:0;;7038:19:1;;54265:80:0;;;;;;;;;;;;54255:91;;;;;;54248:98;;54173:181;;26482:166;26460:6;;-1:-1:-1;;;;;26460:6:0;3135:10;26542:23;26538:103;;26589:40;;-1:-1:-1;;;26589:40:0;;3135:10;26589:40;;;3783:51:1;3756:18;;26589:40:0;3637:203:1;26997:191:0;27090:6;;;-1:-1:-1;;;;;27107:17:0;;;-1:-1:-1;;;;;;27107:17:0;;;;;;;27140:40;;27090:6;;;27107:17;27090:6;;27140:40;;27071:16;;27140:40;27060:128;26997:191;:::o;55141:128::-;55187:13;55220:41;:5;55247:13;55220:26;:41::i;55277:137::-;55326:13;55359:47;:8;55389:16;55359:29;:47::i;54365:178::-;54442:7;54469:66;54502:20;:18;:20::i;:::-;54524:10;52613:4;52607:11;-1:-1:-1;;;52632:23:0;;52685:4;52676:14;;52669:39;;;;52738:4;52729:14;;52722:34;52795:4;52780:20;;;52436:382;9560:264;9645:7;9666:17;9685:18;9705:16;9725:25;9736:4;9742:1;9745;9748;9725:10;:25::i;:::-;9665:85;;;;;;9761:28;9773:5;9780:8;9761:11;:28::i;:::-;-1:-1:-1;9807:9:0;;9560:264;-1:-1:-1;;;;;;9560:264:0:o;47891:443::-;-1:-1:-1;;;;;48004:19:0;;48000:91;;48047:32;;-1:-1:-1;;;48047:32:0;;48076:1;48047:32;;;3783:51:1;3756:18;;48047:32:0;3637:203:1;48000:91:0;-1:-1:-1;;;;;48105:21:0;;48101:92;;48150:31;;-1:-1:-1;;;48150:31:0;;48178:1;48150:31;;;3783:51:1;3756:18;;48150:31:0;3637:203:1;48101:92:0;-1:-1:-1;;;;;48203:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;48249:78;;;;48300:7;-1:-1:-1;;;;;48284:31:0;48293:5;-1:-1:-1;;;;;48284:31:0;;48309:5;48284:31;;;;1442:25:1;;1430:2;1415:18;;1296:177;48284:31:0;;;;;;;;47891:443;;;;:::o;46794:730::-;-1:-1:-1;;;;;46884:18:0;;46880:369;;46935:5;46919:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;46880:369:0;;-1:-1:-1;46880:369:0;;-1:-1:-1;;;;;46995:15:0;;46973:19;46995:15;;;;;;;;;;;47029:19;;;47025:117;;;47076:50;;-1:-1:-1;;;47076:50:0;;-1:-1:-1;;;;;6450:32:1;;47076:50:0;;;6432:51:1;6499:18;;;6492:34;;;6542:18;;;6535:34;;;6405:18;;47076:50:0;6230:345:1;47025:117:0;-1:-1:-1;;;;;47185:15:0;;:9;:15;;;;;;;;;;47203:19;;;;47185:37;;46880:369;-1:-1:-1;;;;;47265:16:0;;47261:213;;47327:12;:21;;;;;;;47261:213;;;-1:-1:-1;;;;;47425:13:0;;:9;:13;;;;;;;;;;:22;;;;;;47261:213;47506:2;-1:-1:-1;;;;;47491:25:0;47500:4;-1:-1:-1;;;;;47491:25:0;;47510:5;47491:25;;;;1442::1;;1430:2;1415:18;;1296:177;47491:25:0;;;;;;;;46794:730;;;:::o;29485:273::-;29579:13;28102:66;29609:46;;29605:146;;29679:15;29688:5;29679:8;:15::i;:::-;29672:22;;;;29605:146;29734:5;29727:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8934:618;9065:17;;;9155:66;9142:79;;9138:166;;;-1:-1:-1;9254:1:0;;-1:-1:-1;9258:30:0;;-1:-1:-1;9290:1:0;9238:54;;9138:166;9333:24;;;9316:14;9333:24;;;;;;;;;7528:25:1;;;7601:4;7589:17;;7569:18;;;7562:45;;;;7623:18;;;7616:34;;;7666:18;;;7659:34;;;9333:24:0;;7500:19:1;;9333:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9333:24:0;;-1:-1:-1;;9333:24:0;;;-1:-1:-1;;;;;;;9372:20:0;;9368:115;;-1:-1:-1;9425:1:0;;-1:-1:-1;9429:29:0;;-1:-1:-1;9425:1:0;;-1:-1:-1;9409:62:0;;9368:115;9503:6;-1:-1:-1;9511:20:0;;-1:-1:-1;9511:20:0;;-1:-1:-1;8934:618:0;;;;;;;;;:::o;9830:542::-;9926:20;9917:5;:29;;;;;;;;:::i;:::-;;9913:452;;9830:542;;:::o;9913:452::-;10024:29;10015:5;:38;;;;;;;;:::i;:::-;;10011:354;;10077:23;;-1:-1:-1;;;10077:23:0;;;;;;;;;;;10011:354;10131:35;10122:5;:44;;;;;;;;:::i;:::-;;10118:247;;10190:46;;-1:-1:-1;;;10190:46:0;;;;;1442:25:1;;;1415:18;;10190:46:0;1296:177:1;10118:247:0;10267:30;10258:5;:39;;;;;;;;:::i;:::-;;10254:111;;10321:32;;-1:-1:-1;;;10321:32:0;;;;;1442:25:1;;;1415:18;;10321:32:0;1296:177:1;10254:111:0;9830:542;;:::o;28550:308::-;28609:13;28635:11;28649:16;28660:4;28649:10;:16::i;:::-;28696:14;;;28707:2;28696:14;;;;;;;;;28635:30;;-1:-1:-1;28676:17:0;;28696:14;;;;;;;;;-1:-1:-1;;;28761:16:0;;;-1:-1:-1;28807:4:0;28798:14;;28791:28;;;;-1:-1:-1;28761:16:0;28550:308::o;28868:251::-;28929:7;29002:4;28966:40;;29030:2;29021:11;;29017:71;;;29056:20;;-1:-1:-1;;;29056:20:0;;;;;;;;;;;14:423:1;56:3;94:5;88:12;121:6;116:3;109:19;146:1;156:162;170:6;167:1;164:13;156:162;;;232:4;288:13;;;284:22;;278:29;260:11;;;256:20;;249:59;185:12;156:162;;;160:3;363:1;356:4;347:6;342:3;338:16;334:27;327:38;426:4;419:2;415:7;410:2;402:6;398:15;394:29;389:3;385:39;381:50;374:57;;;14:423;;;;:::o;442:220::-;591:2;580:9;573:21;554:4;611:45;652:2;641:9;637:18;629:6;611:45;:::i;:::-;603:53;442:220;-1:-1:-1;;;442:220:1:o;667:173::-;735:20;;-1:-1:-1;;;;;784:31:1;;774:42;;764:70;;830:1;827;820:12;764:70;667:173;;;:::o;845:254::-;913:6;921;974:2;962:9;953:7;949:23;945:32;942:52;;;990:1;987;980:12;942:52;1013:29;1032:9;1013:29;:::i;:::-;1003:39;1089:2;1074:18;;;;1061:32;;-1:-1:-1;;;845:254:1:o;1478:328::-;1555:6;1563;1571;1624:2;1612:9;1603:7;1599:23;1595:32;1592:52;;;1640:1;1637;1630:12;1592:52;1663:29;1682:9;1663:29;:::i;:::-;1653:39;;1711:38;1745:2;1734:9;1730:18;1711:38;:::i;:::-;1701:48;;1796:2;1785:9;1781:18;1768:32;1758:42;;1478:328;;;;;:::o;2182:186::-;2241:6;2294:2;2282:9;2273:7;2269:23;2265:32;2262:52;;;2310:1;2307;2300:12;2262:52;2333:29;2352:9;2333:29;:::i;2373:1259::-;2779:3;2774;2770:13;2762:6;2758:26;2747:9;2740:45;2721:4;2804:2;2842:3;2837:2;2826:9;2822:18;2815:31;2869:46;2910:3;2899:9;2895:19;2887:6;2869:46;:::i;:::-;2963:9;2955:6;2951:22;2946:2;2935:9;2931:18;2924:50;2997:33;3023:6;3015;2997:33;:::i;:::-;3061:2;3046:18;;3039:34;;;-1:-1:-1;;;;;3110:32:1;;3104:3;3089:19;;3082:61;3130:3;3159:19;;3152:35;;;3224:22;;;3218:3;3203:19;;3196:51;3296:13;;3318:22;;;3394:15;;;;-1:-1:-1;3356:15:1;;;;-1:-1:-1;3437:169:1;3451:6;3448:1;3445:13;3437:169;;;3512:13;;3500:26;;3581:15;;;;3546:12;;;;3473:1;3466:9;3437:169;;;-1:-1:-1;3623:3:1;;2373:1259;-1:-1:-1;;;;;;;;;;;;2373:1259:1:o;3845:693::-;3956:6;3964;3972;3980;3988;3996;4004;4057:3;4045:9;4036:7;4032:23;4028:33;4025:53;;;4074:1;4071;4064:12;4025:53;4097:29;4116:9;4097:29;:::i;:::-;4087:39;;4145:38;4179:2;4168:9;4164:18;4145:38;:::i;:::-;4135:48;;4230:2;4219:9;4215:18;4202:32;4192:42;;4281:2;4270:9;4266:18;4253:32;4243:42;;4335:3;4324:9;4320:19;4307:33;4380:4;4373:5;4369:16;4362:5;4359:27;4349:55;;4400:1;4397;4390:12;4349:55;3845:693;;;;-1:-1:-1;3845:693:1;;;;4423:5;4475:3;4460:19;;4447:33;;-1:-1:-1;4527:3:1;4512:19;;;4499:33;;3845:693;-1:-1:-1;;3845:693:1:o;4543:260::-;4611:6;4619;4672:2;4660:9;4651:7;4647:23;4643:32;4640:52;;;4688:1;4685;4678:12;4640:52;4711:29;4730:9;4711:29;:::i;:::-;4701:39;;4759:38;4793:2;4782:9;4778:18;4759:38;:::i;:::-;4749:48;;4543:260;;;;;:::o;4808:380::-;4887:1;4883:12;;;;4930;;;4951:61;;5005:4;4997:6;4993:17;4983:27;;4951:61;5058:2;5050:6;5047:14;5027:18;5024:38;5021:161;;5104:10;5099:3;5095:20;5092:1;5085:31;5139:4;5136:1;5129:15;5167:4;5164:1;5157:15;5021:161;;4808:380;;;:::o;6580:222::-;6645:9;;;6666:10;;;6663:133;;;6718:10;6713:3;6709:20;6706:1;6699:31;6753:4;6750:1;6743:15;6781:4;6778:1;6771:15;7704:127;7765:10;7760:3;7756:20;7753:1;7746:31;7796:4;7793:1;7786:15;7820:4;7817:1;7810:15

Swarm Source

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