Overview ERC20
PRICE
n/a

ON-CHAIN MARKET CAP n/a

Total Supply:
784,315,640.68 PI

Holders:
1
Profile Summary
Blockchain:
Mode (919)


Decimals:
18
Contract Source Code Verified (Partial Match)
Contract Name:
TokenERC20

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 20 runs

Created At:
Thu, 23 Nov 2023 03:13:12 GMT
TokenERC20.sol
contracts
prebuilts
token
TokenERC20.sol
IERC20.sol
IMulticall.sol
IPlatformFee.sol
IPrimarySale.sol
Multicall.sol
ERC2771ContextUpgradeable.sol
SafeERC20.sol
IThirdwebContract.sol
IWETH.sol
Address.sol
CurrencyTransferLib.sol
FeeType.sol
ITokenERC20.sol
TokenERC20.sol
Address.sol
AccessControlEnumerableUpgradeable.sol
AccessControlUpgradeable.sol
IAccessControlEnumerableUpgradeable.sol
IAccessControlUpgradeable.sol
IVotesUpgradeable.sol
IERC5267Upgradeable.sol
IERC5805Upgradeable.sol
IERC6372Upgradeable.sol
Initializable.sol
ReentrancyGuardUpgradeable.sol
ERC20BurnableUpgradeable.sol
ERC20PermitUpgradeable.sol
ERC20VotesUpgradeable.sol
IERC20MetadataUpgradeable.sol
IERC20PermitUpgradeable.sol
ERC20Upgradeable.sol
IERC20Upgradeable.sol
draft-EIP712Upgradeable.sol
ECDSAUpgradeable.sol
EIP712Upgradeable.sol
ERC165Upgradeable.sol
IERC165Upgradeable.sol
MathUpgradeable.sol
SafeCastUpgradeable.sol
SignedMathUpgradeable.sol
EnumerableSetUpgradeable.sol
AddressUpgradeable.sol
ContextUpgradeable.sol
CountersUpgradeable.sol
StringsUpgradeable.sol


Contract ABI
[
  {
    "inputs": [],
    "stateMutability": "nonpayable",
    "type": "constructor"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Approval",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "delegator",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "fromDelegate",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "toDelegate",
        "type": "address"
      }
    ],
    "name": "DelegateChanged",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "delegate",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "previousBalance",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "newBalance",
        "type": "uint256"
      }
    ],
    "name": "DelegateVotesChanged",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [],
    "name": "EIP712DomainChanged",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "platformFeeRecipient",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "flatFee",
        "type": "uint256"
      }
    ],
    "name": "FlatPlatformFeeUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint8",
        "name": "version",
        "type": "uint8"
      }
    ],
    "name": "Initialized",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "platformFeeRecipient",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "platformFeeBps",
        "type": "uint256"
      }
    ],
    "name": "PlatformFeeInfoUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "enum IPlatformFee.PlatformFeeType",
        "name": "feeType",
        "type": "uint8"
      }
    ],
    "name": "PlatformFeeTypeUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "recipient",
        "type": "address"
      }
    ],
    "name": "PrimarySaleRecipientUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "bytes32",
        "name": "role",
        "type": "bytes32"
      },
      {
        "indexed": true,
        "internalType": "bytes32",
        "name": "previousAdminRole",
        "type": "bytes32"
      },
      {
        "indexed": true,
        "internalType": "bytes32",
        "name": "newAdminRole",
        "type": "bytes32"
      }
    ],
    "name": "RoleAdminChanged",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "bytes32",
        "name": "role",
        "type": "bytes32"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "sender",
        "type": "address"
      }
    ],
    "name": "RoleGranted",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "bytes32",
        "name": "role",
        "type": "bytes32"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "sender",
        "type": "address"
      }
    ],
    "name": "RoleRevoked",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "mintedTo",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "quantityMinted",
        "type": "uint256"
      }
    ],
    "name": "TokensMinted",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "signer",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "mintedTo",
        "type": "address"
      },
      {
        "components": [
          {
            "internalType": "address",
            "name": "to",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "primarySaleRecipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "quantity",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "price",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "currency",
            "type": "address"
          },
          {
            "internalType": "uint128",
            "name": "validityStartTimestamp",
            "type": "uint128"
          },
          {
            "internalType": "uint128",
            "name": "validityEndTimestamp",
            "type": "uint128"
          },
          {
            "internalType": "bytes32",
            "name": "uid",
            "type": "bytes32"
          }
        ],
        "indexed": false,
        "internalType": "struct ITokenERC20.MintRequest",
        "name": "mintRequest",
        "type": "tuple"
      }
    ],
    "name": "TokensMintedWithSignature",
    "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": "CLOCK_MODE",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "DEFAULT_ADMIN_ROLE",
    "outputs": [
      {
        "internalType": "bytes32",
        "name": "",
        "type": "bytes32"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "DOMAIN_SEPARATOR",
    "outputs": [
      {
        "internalType": "bytes32",
        "name": "",
        "type": "bytes32"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "allowance",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "approve",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "burn",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "burnFrom",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "internalType": "uint32",
        "name": "pos",
        "type": "uint32"
      }
    ],
    "name": "checkpoints",
    "outputs": [
      {
        "components": [
          {
            "internalType": "uint32",
            "name": "fromBlock",
            "type": "uint32"
          },
          {
            "internalType": "uint224",
            "name": "votes",
            "type": "uint224"
          }
        ],
        "internalType": "struct ERC20VotesUpgradeable.Checkpoint",
        "name": "",
        "type": "tuple"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "clock",
    "outputs": [
      {
        "internalType": "uint48",
        "name": "",
        "type": "uint48"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "contractType",
    "outputs": [
      {
        "internalType": "bytes32",
        "name": "",
        "type": "bytes32"
      }
    ],
    "stateMutability": "pure",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "contractURI",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "contractVersion",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "pure",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "decimals",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "subtractedValue",
        "type": "uint256"
      }
    ],
    "name": "decreaseAllowance",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "delegatee",
        "type": "address"
      }
    ],
    "name": "delegate",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "delegatee",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "nonce",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "expiry",
        "type": "uint256"
      },
      {
        "internalType": "uint8",
        "name": "v",
        "type": "uint8"
      },
      {
        "internalType": "bytes32",
        "name": "r",
        "type": "bytes32"
      },
      {
        "internalType": "bytes32",
        "name": "s",
        "type": "bytes32"
      }
    ],
    "name": "delegateBySig",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "delegates",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "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": [
      {
        "internalType": "uint256",
        "name": "timepoint",
        "type": "uint256"
      }
    ],
    "name": "getPastTotalSupply",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "timepoint",
        "type": "uint256"
      }
    ],
    "name": "getPastVotes",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getPlatformFeeInfo",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      },
      {
        "internalType": "uint16",
        "name": "",
        "type": "uint16"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes32",
        "name": "role",
        "type": "bytes32"
      }
    ],
    "name": "getRoleAdmin",
    "outputs": [
      {
        "internalType": "bytes32",
        "name": "",
        "type": "bytes32"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes32",
        "name": "role",
        "type": "bytes32"
      },
      {
        "internalType": "uint256",
        "name": "index",
        "type": "uint256"
      }
    ],
    "name": "getRoleMember",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes32",
        "name": "role",
        "type": "bytes32"
      }
    ],
    "name": "getRoleMemberCount",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "getVotes",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes32",
        "name": "role",
        "type": "bytes32"
      },
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "grantRole",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes32",
        "name": "role",
        "type": "bytes32"
      },
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "hasRole",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "addedValue",
        "type": "uint256"
      }
    ],
    "name": "increaseAllowance",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "_defaultAdmin",
        "type": "address"
      },
      {
        "internalType": "string",
        "name": "_name",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "_symbol",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "_contractURI",
        "type": "string"
      },
      {
        "internalType": "address[]",
        "name": "_trustedForwarders",
        "type": "address[]"
      },
      {
        "internalType": "address",
        "name": "_primarySaleRecipient",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "_platformFeeRecipient",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "_platformFeeBps",
        "type": "uint256"
      }
    ],
    "name": "initialize",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "forwarder",
        "type": "address"
      }
    ],
    "name": "isTrustedForwarder",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "mintTo",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "components": [
          {
            "internalType": "address",
            "name": "to",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "primarySaleRecipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "quantity",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "price",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "currency",
            "type": "address"
          },
          {
            "internalType": "uint128",
            "name": "validityStartTimestamp",
            "type": "uint128"
          },
          {
            "internalType": "uint128",
            "name": "validityEndTimestamp",
            "type": "uint128"
          },
          {
            "internalType": "bytes32",
            "name": "uid",
            "type": "bytes32"
          }
        ],
        "internalType": "struct ITokenERC20.MintRequest",
        "name": "_req",
        "type": "tuple"
      },
      {
        "internalType": "bytes",
        "name": "_signature",
        "type": "bytes"
      }
    ],
    "name": "mintWithSignature",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes[]",
        "name": "data",
        "type": "bytes[]"
      }
    ],
    "name": "multicall",
    "outputs": [
      {
        "internalType": "bytes[]",
        "name": "results",
        "type": "bytes[]"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "nonces",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "numCheckpoints",
    "outputs": [
      {
        "internalType": "uint32",
        "name": "",
        "type": "uint32"
      }
    ],
    "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": "primarySaleRecipient",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes32",
        "name": "role",
        "type": "bytes32"
      },
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "renounceRole",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes32",
        "name": "role",
        "type": "bytes32"
      },
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "revokeRole",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "string",
        "name": "_uri",
        "type": "string"
      }
    ],
    "name": "setContractURI",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "_platformFeeRecipient",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "_platformFeeBps",
        "type": "uint256"
      }
    ],
    "name": "setPlatformFeeInfo",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "_saleRecipient",
        "type": "address"
      }
    ],
    "name": "setPrimarySaleRecipient",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes4",
        "name": "interfaceId",
        "type": "bytes4"
      }
    ],
    "name": "supportsInterface",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "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": "amount",
        "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": "amount",
        "type": "uint256"
      }
    ],
    "name": "transferFrom",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "components": [
          {
            "internalType": "address",
            "name": "to",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "primarySaleRecipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "quantity",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "price",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "currency",
            "type": "address"
          },
          {
            "internalType": "uint128",
            "name": "validityStartTimestamp",
            "type": "uint128"
          },
          {
            "internalType": "uint128",
            "name": "validityEndTimestamp",
            "type": "uint128"
          },
          {
            "internalType": "bytes32",
            "name": "uid",
            "type": "bytes32"
          }
        ],
        "internalType": "struct ITokenERC20.MintRequest",
        "name": "_req",
        "type": "tuple"
      },
      {
        "internalType": "bytes",
        "name": "_signature",
        "type": "bytes"
      }
    ],
    "name": "verify",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      },
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  }
]


Contract Creation Code
60806040523480156200001157600080fd5b50600054610100900460ff1615808015620000335750600054600160ff909116105b806200004f5750303b1580156200004f575060005460ff166001145b620000b75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff191660011790558015620000db576000805461ff0019166101001790555b801562000122576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b506149b480620001336000396000f3fe6080604052600436106102495760003560e01c806384b0196e1161013557806384b0196e146105a05780638e539e8c146105c85780638f0fefbb146105e85780639010d07c146105fb57806391d148541461061b57806391ddadf41461063b578063938e3d7b1461066757806395d89b41146106875780639ab24eb01461069c578063a0a8e460146106bc578063a217fddf146106d0578063a457c2d7146106e5578063a9059cbb14610705578063ac9650d814610725578063c1b606e214610752578063c3cda52014610791578063ca15c873146107b1578063cb2ef6f7146107d1578063d45573f6146107f1578063d505accf14610828578063d547741f14610848578063dd62ed3e14610868578063dfad80a614610888578063e8a3d485146108a8578063f1127ed8146108bd57600080fd5b806301ffc9a71461024e57806306fdde0314610283578063079fe40e146102a5578063095ea7b3146102de57806318160ddd146102fe5780631e7ac4881461031d57806323b872dd1461033f578063248a9ca31461035f5780632f2ff15d1461037f578063313ce5671461039f5780633644e515146103c157806336568abe146103d657806339509351146103f65780633a46b1a81461041657806342966c6814610436578063449a52f8146104565780634bf5d7e914610476578063572b6c051461048b578063587cde1e146104ab5780635c19a95c146104cb5780636f4f2837146104eb5780636fcfff451461050b57806370a082311461054057806379cc6790146105605780637ecebe0014610580575b600080fd5b34801561025a57600080fd5b5061026e610269366004613c70565b610907565b60405190151581526020015b60405180910390f35b34801561028f57600080fd5b50610298610932565b60405161027a9190613cea565b3480156102b157600080fd5b5061022d546102c6906001600160a01b031681565b6040516001600160a01b03909116815260200161027a565b3480156102ea57600080fd5b5061026e6102f9366004613d19565b6109c4565b34801561030a57600080fd5b506099545b60405190815260200161027a565b34801561032957600080fd5b5061033d610338366004613d19565b6109e6565b005b34801561034b57600080fd5b5061026e61035a366004613d43565b610a90565b34801561036b57600080fd5b5061030f61037a366004613d7f565b610ac0565b34801561038b57600080fd5b5061033d61039a366004613d98565b610ad6565b3480156103ab57600080fd5b5060125b60405160ff909116815260200161027a565b3480156103cd57600080fd5b5061030f610af7565b3480156103e257600080fd5b5061033d6103f1366004613d98565b610b06565b34801561040257600080fd5b5061026e610411366004613d19565b610b94565b34801561042257600080fd5b5061030f610431366004613d19565b610bc0565b34801561044257600080fd5b5061033d610451366004613d7f565b610c13565b34801561046257600080fd5b5061033d610471366004613d19565b610c27565b34801561048257600080fd5b50610298610c85565b34801561049757600080fd5b5061026e6104a6366004613dc4565b610d1d565b3480156104b757600080fd5b506102c66104c6366004613dc4565b610d3b565b3480156104d757600080fd5b5061033d6104e6366004613dc4565b610d5a565b3480156104f757600080fd5b5061033d610506366004613dc4565b610d6b565b34801561051757600080fd5b5061052b610526366004613dc4565b610dc2565b60405163ffffffff909116815260200161027a565b34801561054c57600080fd5b5061030f61055b366004613dc4565b610de5565b34801561056c57600080fd5b5061033d61057b366004613d19565b610e00565b34801561058c57600080fd5b5061030f61059b366004613dc4565b610e1c565b3480156105ac57600080fd5b506105b5610e3b565b60405161027a9796959493929190613ddf565b3480156105d457600080fd5b5061030f6105e3366004613d7f565b610ed9565b61033d6105f6366004613eb9565b610f15565b34801561060757600080fd5b506102c6610616366004613f15565b610faa565b34801561062757600080fd5b5061026e610636366004613d98565b610fc3565b34801561064757600080fd5b50610650610fef565b60405165ffffffffffff909116815260200161027a565b34801561067357600080fd5b5061033d610682366004613f37565b610ffa565b34801561069357600080fd5b50610298611019565b3480156106a857600080fd5b5061030f6106b7366004613dc4565b611028565b3480156106c857600080fd5b5060016103af565b3480156106dc57600080fd5b5061030f600081565b3480156106f157600080fd5b5061026e610700366004613d19565b6110ab565b34801561071157600080fd5b5061026e610720366004613d19565b61113c565b34801561073157600080fd5b50610745610740366004613f78565b611154565b60405161027a9190613fec565b34801561075e57600080fd5b5061077261076d366004613eb9565b61123d565b6040805192151583526001600160a01b0390911660208301520161027a565b34801561079d57600080fd5b5061033d6107ac366004614061565b611293565b3480156107bd57600080fd5b5061030f6107cc366004613d7f565b6113c5565b3480156107dd57600080fd5b50690546f6b656e45524332360b41b61030f565b3480156107fd57600080fd5b5061022c5461022b54604080516001600160a01b03909316835261ffff90911660208301520161027a565b34801561083457600080fd5b5061033d6108433660046140b9565b6113dd565b34801561085457600080fd5b5061033d610863366004613d98565b611541565b34801561087457600080fd5b5061030f610883366004614123565b61155d565b34801561089457600080fd5b5061033d6108a336600461427d565b611588565b3480156108b457600080fd5b50610298611796565b3480156108c957600080fd5b506108dd6108d8366004614365565b611825565b60408051825163ffffffff1681526020928301516001600160e01b0316928101929092520161027a565b60006001600160e01b03198216635a05180f60e01b148061092c575061092c826118a9565b92915050565b6060609a8054610941906143a5565b80601f016020809104026020016040519081016040528092919081815260200182805461096d906143a5565b80156109ba5780601f1061098f576101008083540402835291602001916109ba565b820191906000526020600020905b81548152906001019060200180831161099d57829003601f168201915b5050505050905090565b6000806109cf6118de565b90506109dc8185856118e8565b5060019392505050565b60006109f181611a0c565b612710821115610a1c5760405162461bcd60e51b8152600401610a13906143d9565b60405180910390fd5b61022b80546001600160801b0319166001600160401b03841617905561022c80546001600160a01b0385166001600160a01b031990911681179091556040518381527fe2497bd806ec41a6e0dd992c29a72efc0ef8fec9092d1978fd4a1e00b2f183049060200160405180910390a2505050565b600080610a9b6118de565b9050610aa8858285611a1d565b610ab3858585611a91565b60019150505b9392505050565b60009081526101c6602052604090206001015490565b610adf82610ac0565b610ae881611a0c565b610af28383611c3b565b505050565b6000610b01611c5e565b905090565b610b0e6118de565b6001600160a01b0316816001600160a01b031614610b865760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a13565b610b908282611c68565b5050565b600080610b9f6118de565b90506109dc818585610bb1858961155d565b610bbb9190614418565b6118e8565b6000610bca610fef565b65ffffffffffff168210610bf05760405162461bcd60e51b8152600401610a139061442b565b6001600160a01b038316600090815261016360205260409020610ab99083611c8b565b610c24610c1e6118de565b82611d73565b50565b610c4160008051602061493f8339815191526106366118de565b610c7b5760405162461bcd60e51b815260206004820152600b60248201526a3737ba1036b4b73a32b91760a91b6044820152606401610a13565b610b908282611d7d565b606043610c90610fef565b65ffffffffffff1614610ce55760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610a13565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6001600160a01b031660009081526065602052604090205460ff1690565b6001600160a01b03908116600090815261016260205260409020541690565b610c24610d656118de565b82611dce565b6000610d7681611a0c565b61022d80546001600160a01b0319166001600160a01b0384169081179091556040517f299d17e95023f496e0ffc4909cff1a61f74bb5eb18de6f900f4155bfa1b3b33390600090a25050565b6001600160a01b0381166000908152610163602052604081205461092c90611e4f565b6001600160a01b031660009081526097602052604090205490565b610e1282610e0c6118de565b83611a1d565b610b908282611d73565b6001600160a01b038116600090815261012f602052604081205461092c565b60006060806000806000606060fb546000801b148015610e5b575060fc54155b610e9f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610a13565b610ea7611eb8565b610eaf611ec7565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000610ee3610fef565b65ffffffffffff168210610f095760405162461bcd60e51b8152600401610a139061442b565b61092c61016483611c8b565b610f1d611ed6565b6000610f2a848484611f2f565b90506000610f3b6020860186613dc4565b9050610f46856120ca565b610f54818660400135611d7d565b806001600160a01b0316826001600160a01b03167fc4d88b1adde72eb5acf63f3e219ef5b223262233acf507c3b171277c91973c6787604051610f979190614475565b60405180910390a35050610af260018055565b60008281526101f860205260408120610ab990836122ab565b60009182526101c6602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000610b01436122b7565b600061100581611a0c565b61022a611013838583614570565b50505050565b6060609b8054610941906143a5565b6001600160a01b038116600090815261016360205260408120548015611098576001600160a01b038316600090815261016360205260409020805460001983019081106110775761107761462a565b600091825260209091200154600160201b90046001600160e01b031661109b565b60005b6001600160e01b03169392505050565b6000806110b66118de565b905060006110c4828661155d565b9050838110156111245760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a13565b61113182868684036118e8565b506001949350505050565b6000806111476118de565b90506109dc818585611a91565b6060816001600160401b0381111561116e5761116e61414d565b6040519080825280602002602001820160405280156111a157816020015b606081526020019060019003908161118c5790505b50905060005b8281101561123657611211308585848181106111c5576111c561462a565b90506020028101906111d79190614640565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061231e92505050565b8282815181106112235761122361462a565b60209081029190910101526001016111a7565b5092915050565b600080600061124d868686612343565b60e0870135600090815261022e602052604090205490915060ff16158015611288575061128860008051602061493f83398151915282610fc3565b969095509350505050565b834211156112e35760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610a13565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b03881691810191909152606081018690526080810185905260009061135d906113559060a001604051602081830303815290604052805190602001206123a7565b8585856123d4565b9050611368816123fc565b86146113b25760405162461bcd60e51b81526020600482015260196024820152784552433230566f7465733a20696e76616c6964206e6f6e636560381b6044820152606401610a13565b6113bc8188611dce565b50505050505050565b60008181526101f86020526040812061092c90612425565b8342111561142d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610a13565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861145c8c6123fc565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006114b7826123a7565b905060006114c7828787876123d4565b9050896001600160a01b0316816001600160a01b03161461152a5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610a13565b6115358a8a8a6118e8565b50505050505050505050565b61154a82610ac0565b61155381611a0c565b610af28383611c68565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b600054610100900460ff16158080156115a85750600054600160ff909116105b806115c957506115b73061242f565b1580156115c9575060005460ff166001145b61162c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a13565b6000805460ff19166001179055801561164f576000805461ff0019166101001790555b61165761243e565b6116608561246f565b611669886124f4565b611673888861253e565b61022a6116808782614686565b5061022d80546001600160a01b038087166001600160a01b03199283161790925561022c8054928616929091169190911790556127108211156116d55760405162461bcd60e51b8152600401610a13906143d9565b61022b80546001600160801b0319166001600160801b0384161790556116fc60008a61257e565b6117146000805160206148f88339815191528a61257e565b61172c60008051602061493f8339815191528a61257e565b6117456000805160206148f8833981519152600061257e565b801561178b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b61022a80546117a4906143a5565b80601f01602080910402602001604051908101604052809291908181526020018280546117d0906143a5565b801561181d5780601f106117f25761010080835404028352916020019161181d565b820191906000526020600020905b81548152906001019060200180831161180057829003601f168201915b505050505081565b60408051808201909152600080825260208201526001600160a01b038316600090815261016360205260409020805463ffffffff841690811061186a5761186a61462a565b60009182526020918290206040805180820190915291015463ffffffff81168252600160201b90046001600160e01b0316918101919091529392505050565b60006001600160e01b03198216637965db0b60e01b148061092c57506301ffc9a760e01b6001600160e01b031983161461092c565b6000610b01612588565b6001600160a01b03831661194a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a13565b6001600160a01b0382166119ab5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a13565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b610c2481611a186118de565b6125aa565b6000611a29848461155d565b905060001981146110135781811015611a845760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a13565b61101384848484036118e8565b6001600160a01b038316611af55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a13565b6001600160a01b038216611b575760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a13565b611b62838383612603565b6001600160a01b03831660009081526097602052604090205481811015611bda5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a13565b6001600160a01b03808516600081815260976020526040808220868603905592861680825290839020805486019055915160008051602061495f83398151915290611c289086815260200190565b60405180910390a36110138484846126c4565b611c4582826126cf565b60008281526101f860205260409020610af29082612757565b6000610b0161276c565b611c7282826127e0565b60008281526101f860205260409020610af29082612866565b815460009081816005811115611ce5576000611ca68461287b565b611cb0908561473f565b600088815260209020909150869082015463ffffffff161115611cd557809150611ce3565b611ce0816001614418565b92505b505b80821015611d32576000611cf98383612963565b600088815260209020909150869082015463ffffffff161115611d1e57809150611d2c565b611d29816001614418565b92505b50611ce5565b8015611d5d5760008681526020902081016000190154600160201b90046001600160e01b0316611d60565b60005b6001600160e01b03169695505050505050565b610b90828261297e565b611d878282612997565b816001600160a01b03167f3f2c9d57c068687834f0de942a9babb9e5acab57d516d3480a3c16ee165a427382604051611dc291815260200190565b60405180910390a25050565b6000611dd983610d3b565b90506000611de684610de5565b6001600160a01b038581166000818152610162602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46110138284836129a1565b600063ffffffff821115611eb45760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610a13565b5090565b606060fd8054610941906143a5565b606060fe8054610941906143a5565b600260015403611f285760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a13565b6002600155565b6000806000611f3f86868661123d565b9150915081611f845760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b6044820152606401610a13565b42611f9560c0880160a08901614752565b6001600160801b031611158015611fc4575042611fb860e0880160c08901614752565b6001600160801b031610155b6120025760405162461bcd60e51b815260206004820152600f60248201526e1c995c5d595cdd08195e1c1a5c9959608a1b6044820152606401610a13565b60006120116020880188613dc4565b6001600160a01b03160361205d5760405162461bcd60e51b81526020600482015260136024820152721c9958da5c1a595b9d081d5b9919599a5b9959606a1b6044820152606401610a13565b60008660400135116120a15760405162461bcd60e51b815260206004820152600d60248201526c7a65726f207175616e7469747960981b6044820152606401610a13565b60e0860135600090815261022e60205260409020805460ff191660011790559150509392505050565b806060013560000361210d573415610c245760405162461bcd60e51b81526020600482015260066024820152652156616c756560d01b6044820152606401610a13565b61022b546000906127109061212f906001600160801b0316606085013561476d565b612139919061479a565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61216060a0840160808501613dc4565b6001600160a01b0316036121bf57816060013534146121ba5760405162461bcd60e51b815260206004820152601660248201527536bab9ba1039b2b732103a37ba30b610383934b1b29760511b6044820152606401610a13565b612202565b34156122025760405162461bcd60e51b81526020600482015260126024820152716d73672076616c7565206e6f74207a65726f60701b6044820152606401610a13565b6000806122156040850160208601613dc4565b6001600160a01b031614612238576122336040840160208501613dc4565b612246565b61022d546001600160a01b03165b905061227661225b60a0850160808601613dc4565b6122636118de565b61022c546001600160a01b031685612ae0565b610af261228960a0850160808601613dc4565b6122916118de565b836122a086606089013561473f565b612ae0565b60018055565b6000610ab98383612b26565b600065ffffffffffff821115611eb45760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610a13565b6060610ab9838360405180606001604052806027815260200161491860279139612b50565b600061239f83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612399925061238d9150889050612c2e565b805190602001206123a7565b90612d22565b949350505050565b600061092c6123b4611c5e565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060006123e587878787612d46565b915091506123f281612e00565b5095945050505050565b6001600160a01b038116600090815261012f602052604090208054600181018255905b50919050565b600061092c825490565b6001600160a01b03163b151590565b600054610100900460ff166124655760405162461bcd60e51b8152600401610a13906147bc565b61246d612f45565b565b600054610100900460ff166124965760405162461bcd60e51b8152600401610a13906147bc565b60005b8151811015610b90576001606560008484815181106124ba576124ba61462a565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101612499565b600054610100900460ff1661251b5760405162461bcd60e51b8152600401610a13906147bc565b610c2481604051806040016040528060018152602001603160f81b815250612f6c565b600054610100900460ff166125655760405162461bcd60e51b8152600401610a13906147bc565b609a6125718382614686565b50609b610af28282614686565b610b908282611c3b565b600061259333610d1d565b156125a5575060131936013560601c90565b503390565b6125b48282610fc3565b610b90576125c181612fbb565b6125cc836020612fcd565b6040516020016125dd929190614807565b60408051601f198184030181529082905262461bcd60e51b8252610a1391600401613cea565b61261c6000805160206148f88339815191526000610fc3565b15801561263157506001600160a01b03831615155b801561264557506001600160a01b03821615155b15610af2576126626000805160206148f883398151915284610fc3565b8061268057506126806000805160206148f883398151915283610fc3565b610af25760405162461bcd60e51b81526020600482015260156024820152743a3930b739b332b939903932b9ba3934b1ba32b21760591b6044820152606401610a13565b610af2838383613168565b6126d98282610fc3565b610b905760008281526101c6602090815260408083206001600160a01b03851684529091529020805460ff191660011790556127136118de565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610ab9836001600160a01b038416613183565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6127976131d2565b61279f61322b565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6127ea8282610fc3565b15610b905760008281526101c6602090815260408083206001600160a01b03851684529091529020805460ff191690556128226118de565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6000610ab9836001600160a01b03841661325c565b60008160000361288d57506000919050565b6000600161289a8461334f565b901c6001901b905060018184816128b3576128b3614784565b048201901c905060018184816128cb576128cb614784565b048201901c905060018184816128e3576128e3614784565b048201901c905060018184816128fb576128fb614784565b048201901c9050600181848161291357612913614784565b048201901c9050600181848161292b5761292b614784565b048201901c9050600181848161294357612943614784565b048201901c9050610ab98182858161295d5761295d614784565b046133e3565b6000612972600284841861479a565b610ab990848416614418565b61298882826133f9565b61101361016461352e8361353a565b610b9082826136ac565b816001600160a01b0316836001600160a01b0316141580156129c35750600081115b15610af2576001600160a01b03831615612a52576001600160a01b03831660009081526101636020526040812081906129ff9061352e8561353a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612a47929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610af2576001600160a01b0382166000908152610163602052604081208190612a89906137378561353a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612ad1929190918252602082015260400190565b60405180910390a25050505050565b80156110135773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03851601612b1a57612b158282613743565b611013565b611013848484846137e5565b6000826000018281548110612b3d57612b3d61462a565b9060005260206000200154905092915050565b6060612b5b8461242f565b8015612b6d5750612b6b3361242f565b155b612bb95760405162461bcd60e51b815260206004820152601e60248201527f416464726573733a20696e76616c69642064656c65676174652063616c6c00006044820152606401610a13565b600080856001600160a01b031685604051612bd49190614876565b600060405180830381855af49150503d8060008114612c0f576040519150601f19603f3d011682016040523d82523d6000602084013e612c14565b606091505b5091509150612c24828286613838565b9695505050505050565b60607fbac245dbd9b8b2bb334c0675db20a7a7a8506de563990c4ce3207f4c3c5b75e1612c5e6020840184613dc4565b612c6e6040850160208601613dc4565b60408501356060860135612c8860a0880160808901613dc4565b612c9860c0890160a08a01614752565b612ca860e08a0160c08b01614752565b6040805160208101999099526001600160a01b03978816908901529486166060880152608087019390935260a086019190915290921660c08401526001600160801b0391821660e0808501919091529116610100830152830135610120820152610140016040516020818303038152906040529050919050565b6000806000612d318585613871565b91509150612d3e81612e00565b509392505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612d735750600090506003612df7565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612dc7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612df057600060019250925050612df7565b9150600090505b94509492505050565b6000816004811115612e1457612e14614892565b03612e1c5750565b6001816004811115612e3057612e30614892565b03612e785760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b6044820152606401610a13565b6002816004811115612e8c57612e8c614892565b03612ed95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a13565b6003816004811115612eed57612eed614892565b03610c245760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a13565b600054610100900460ff166122a55760405162461bcd60e51b8152600401610a13906147bc565b600054610100900460ff16612f935760405162461bcd60e51b8152600401610a13906147bc565b60fd612f9f8382614686565b5060fe612fac8282614686565b5050600060fb81905560fc5550565b606061092c6001600160a01b03831660145b60606000612fdc83600261476d565b612fe7906002614418565b6001600160401b03811115612ffe57612ffe61414d565b6040519080825280601f01601f191660200182016040528015613028576020820181803683370190505b509050600360fc1b816000815181106130435761304361462a565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106130725761307261462a565b60200101906001600160f81b031916908160001a905350600061309684600261476d565b6130a1906001614418565b90505b6001811115613119576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106130d5576130d561462a565b1a60f81b8282815181106130eb576130eb61462a565b60200101906001600160f81b031916908160001a90535060049490941c93613112816148a8565b90506130a4565b508315610ab95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a13565b610af261317484610d3b565b61317d84610d3b565b836129a1565b60008181526001830160205260408120546131ca5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561092c565b50600061092c565b6000806131dd611eb8565b8051909150156131f4578051602090910120919050565b60fb5480156132035792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080613236611ec7565b80519091501561324d578051602090910120919050565b60fc5480156132035792915050565b6000818152600183016020526040812054801561334557600061328060018361473f565b85549091506000906132949060019061473f565b90508181146132f95760008660000182815481106132b4576132b461462a565b90600052602060002001549050808760000184815481106132d7576132d761462a565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061330a5761330a6148bf565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061092c565b600091505061092c565b600080608083901c1561336457608092831c92015b604083901c1561337657604092831c92015b602083901c1561338857602092831c92015b601083901c1561339a57601092831c92015b600883901c156133ac57600892831c92015b600483901c156133be57600492831c92015b600283901c156133d057600292831c92015b600183901c1561092c5760010192915050565b60008183106133f25781610ab9565b5090919050565b6001600160a01b0382166134595760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a13565b61346582600083612603565b6001600160a01b038216600090815260976020526040902054818110156134d95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a13565b6001600160a01b038316600081815260976020908152604080832086860390556099805487900390555185815291929160008051602061495f833981519152910160405180910390a3610af2836000846126c4565b6000610ab9828461473f565b825460009081908181156135865760008781526020902082016000190160408051808201909152905463ffffffff81168252600160201b90046001600160e01b0316602082015261359b565b60408051808201909152600080825260208201525b905080602001516001600160e01b031693506135bb84868863ffffffff16565b92506000821180156135e557506135d0610fef565b65ffffffffffff16816000015163ffffffff16145b15613629576135f3836138b6565b60008881526020902083016000190180546001600160e01b0392909216600160201b0263ffffffff9092169190911790556136a2565b86604051806040016040528061364d613640610fef565b65ffffffffffff16611e4f565b63ffffffff168152602001613661866138b6565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b5050935093915050565b6136b6828261391f565b6099546001600160e01b0310156137285760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610a13565b6110136101646137378361353a565b6000610ab98284614418565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613790576040519150601f19603f3d011682016040523d82523d6000602084013e613795565b606091505b5050905080610af25760405162461bcd60e51b815260206004820152601c60248201527b1b985d1a5d99481d1bdad95b881d1c985b9cd9995c8819985a5b195960221b6044820152606401610a13565b816001600160a01b0316836001600160a01b0316031561101357306001600160a01b0384160361382357612b156001600160a01b03851683836139e2565b6110136001600160a01b038516848484613a45565b60608315613847575081610ab9565b8251156138575782518084602001fd5b8160405162461bcd60e51b8152600401610a139190613cea565b60008082516041036138a75760208301516040840151606085015160001a61389b87828585612d46565b945094505050506138af565b506000905060025b9250929050565b60006001600160e01b03821115611eb45760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610a13565b6001600160a01b0382166139755760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a13565b61398160008383612603565b80609960008282546139939190614418565b90915550506001600160a01b03821660008181526097602090815260408083208054860190555184815260008051602061495f833981519152910160405180910390a3610b90600083836126c4565b6040516001600160a01b038316602482015260448101829052610af290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a7d565b6040516001600160a01b03808516602483015283166044820152606481018290526110139085906323b872dd60e01b90608401613a0e565b6000613ad2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613b4f9092919063ffffffff16565b805190915015610af25780806020019051810190613af091906148d5565b610af25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a13565b606061239f848460008585600080866001600160a01b03168587604051613b769190614876565b60006040518083038185875af1925050503d8060008114613bb3576040519150601f19603f3d011682016040523d82523d6000602084013e613bb8565b606091505b5091509150613bc987838387613bd4565b979650505050505050565b60608315613c41578251600003613c3a57613bee8561242f565b613c3a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a13565b508161239f565b61239f8383815115613c565781518083602001fd5b8060405162461bcd60e51b8152600401610a139190613cea565b600060208284031215613c8257600080fd5b81356001600160e01b031981168114610ab957600080fd5b60005b83811015613cb5578181015183820152602001613c9d565b50506000910152565b60008151808452613cd6816020860160208601613c9a565b601f01601f19169290920160200192915050565b602081526000610ab96020830184613cbe565b80356001600160a01b0381168114613d1457600080fd5b919050565b60008060408385031215613d2c57600080fd5b613d3583613cfd565b946020939093013593505050565b600080600060608486031215613d5857600080fd5b613d6184613cfd565b9250613d6f60208501613cfd565b9150604084013590509250925092565b600060208284031215613d9157600080fd5b5035919050565b60008060408385031215613dab57600080fd5b82359150613dbb60208401613cfd565b90509250929050565b600060208284031215613dd657600080fd5b610ab982613cfd565b60ff60f81b881681526000602060e06020840152613e0060e084018a613cbe565b8381036040850152613e12818a613cbe565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b81811015613e6657835183529284019291840191600101613e4a565b50909c9b505050505050505050505050565b60008083601f840112613e8a57600080fd5b5081356001600160401b03811115613ea157600080fd5b6020830191508360208285010111156138af57600080fd5b6000806000838503610120811215613ed057600080fd5b61010080821215613ee057600080fd5b85945084013590506001600160401b03811115613efc57600080fd5b613f0886828701613e78565b9497909650939450505050565b60008060408385031215613f2857600080fd5b50508035926020909101359150565b60008060208385031215613f4a57600080fd5b82356001600160401b03811115613f6057600080fd5b613f6c85828601613e78565b90969095509350505050565b60008060208385031215613f8b57600080fd5b82356001600160401b0380821115613fa257600080fd5b818501915085601f830112613fb657600080fd5b813581811115613fc557600080fd5b8660208260051b8501011115613fda57600080fd5b60209290920196919550909350505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561404357603f19888603018452614031858351613cbe565b94509285019290850190600101614015565b5092979650505050505050565b803560ff81168114613d1457600080fd5b60008060008060008060c0878903121561407a57600080fd5b61408387613cfd565b9550602087013594506040870135935061409f60608801614050565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a0312156140d457600080fd5b6140dd88613cfd565b96506140eb60208901613cfd565b9550604088013594506060880135935061410760808901614050565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561413657600080fd5b61413f83613cfd565b9150613dbb60208401613cfd565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561418b5761418b61414d565b604052919050565b600082601f8301126141a457600080fd5b81356001600160401b038111156141bd576141bd61414d565b6141d0601f8201601f1916602001614163565b8181528460208386010111156141e557600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261421357600080fd5b813560206001600160401b0382111561422e5761422e61414d565b8160051b61423d828201614163565b928352848101820192828101908785111561425757600080fd5b83870192505b84831015613bc95761426e83613cfd565b8252918301919083019061425d565b600080600080600080600080610100898b03121561429a57600080fd5b6142a389613cfd565b975060208901356001600160401b03808211156142bf57600080fd5b6142cb8c838d01614193565b985060408b01359150808211156142e157600080fd5b6142ed8c838d01614193565b975060608b013591508082111561430357600080fd5b61430f8c838d01614193565b965060808b013591508082111561432557600080fd5b506143328b828c01614202565b94505061434160a08a01613cfd565b925061434f60c08a01613cfd565b915060e089013590509295985092959890939650565b6000806040838503121561437857600080fd5b61438183613cfd565b9150602083013563ffffffff8116811461439a57600080fd5b809150509250929050565b600181811c908216806143b957607f821691505b60208210810361241f57634e487b7160e01b600052602260045260246000fd5b6020808252600f908201526e65786365656473204d41585f42505360881b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561092c5761092c614402565b60208082526019908201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b604082015260600190565b80356001600160801b0381168114613d1457600080fd5b61010081016001600160a01b038061448c85613cfd565b1683528061449c60208601613cfd565b1660208401526040840135604084015260608401356060840152806144c360808601613cfd565b166080840152506144d660a0840161445e565b6001600160801b0381811660a0850152806144f360c0870161445e565b1660c0850152505060e083013560e083015292915050565b601f821115610af2576000816000526020600020601f850160051c810160208610156145345750805b601f850160051c820191505b8181101561455357828155600101614540565b505050505050565b600019600383901b1c191660019190911b1790565b6001600160401b038311156145875761458761414d565b61459b8361459583546143a5565b8361450b565b6000601f8411600181146145c957600085156145b75750838201355b6145c1868261455b565b845550614623565b600083815260209020601f19861690835b828110156145fa57868501358255602094850194600190920191016145da565b50868210156146175760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261465757600080fd5b8301803591506001600160401b0382111561467157600080fd5b6020019150368190038213156138af57600080fd5b81516001600160401b0381111561469f5761469f61414d565b6146b3816146ad84546143a5565b8461450b565b602080601f8311600181146146e257600084156146d05750858301515b6146da858261455b565b865550614553565b600085815260208120601f198616915b82811015614711578886015182559484019460019091019084016146f2565b508582101561472f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8181038181111561092c5761092c614402565b60006020828403121561476457600080fd5b610ab98261445e565b808202811582820484141761092c5761092c614402565b634e487b7160e01b600052601260045260246000fd5b6000826147b757634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351614839816017850160208801613c9a565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161486a816028840160208801613c9a565b01602801949350505050565b60008251614888818460208701613c9a565b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b6000816148b7576148b7614402565b506000190190565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156148e757600080fd5b81518015158114610ab957600080fdfe8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65649f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c105094320336277b57a15185bbcf9cf6b63c0682a43c14f4e784c794154994a64736f6c63430008170033