{
  "contractName": "ERC20Permit",
  "abi": [
    {
      "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": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "subtractedValue",
          "type": "uint256"
        }
      ],
      "name": "decreaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "addedValue",
          "type": "uint256"
        }
      ],
      "name": "increaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "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": [
        {
          "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": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "nonces",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DOMAIN_SEPARATOR",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"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\":\"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\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"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\":\"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\"}],\"devdoc\":{\"details\":\"Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all. _Available since v3.4._\",\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"constructor\":{\"details\":\"Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`. It's a good idea to use the same `name` that is defined as the ERC20 token name.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":\"ERC20Permit\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xdadd41acb749920eccf40aeaa8d291adf9751399a7343561bad13e7a8d99be0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://12af4ac016f9fdf3be5d15824f4292272aa11f6b2e0192a0f7320f5ad49bbbf0\",\"dweb:/ipfs/QmRXMpdqCgA3TYuYxBodqs5p9jGbnMW6xa2gvjppvq4TWk\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xbbc8ac883ac3c0078ce5ad3e288fbb3ffcc8a30c3a98c0fda0114d64fc44fca2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87a7a5d2f6f63f84598af02b8c50ca2df2631cb8ba2453e8d95fcb17e4be9824\",\"dweb:/ipfs/QmR76hqtAcRqoFj33tmNjcWTLrgNsAaakYwnKZ8zoJtKei\"]},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"keccak256\":\"0x8a763ef5625e97f5287c7ddd5ede434129069e15d83bf0a68ad10a5e56ccb439\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a3f75a7be83ce0fb636d3835e43348243d4ced9df08fb9ab6cf879ccf4d81b7\",\"dweb:/ipfs/QmauKgQQthadf1DLEbfkDWwNGcJ1doRH21EXSuacSDWGWt\"]},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95\",\"dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x32c202bd28995dd20c4347b7c6467a6d3241c74c8ad3edcbb610cd9205916c45\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8179c356adb19e70d6b31a1eedc8c5c7f0c00e669e2540f4099e3844c6074d30\",\"dweb:/ipfs/QmWFbivarEobbqhS1go64ootVuHfVohBseerYy9FTEd1W2\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x3c07f43e60e099b3b157243b3152722e73b80eeb7985c2cd73712828d7f7da29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://466ffb5a6e3bd65fffd996f9287ffd240ea21588a338c6efe143d94eaed014a7\",\"dweb:/ipfs/Qmans3vvPJZcvxe9KLAPc9Xwe4TFVTJdzaQGpi62Vrhoe2\"]},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc00ab7f133cdaafd212a5cc6a16c8d37319721105d130c8e5af0c4e8f170ba\",\"dweb:/ipfs/QmVmf6LVMfFiEkvKYLzSv3bGHzymEW93AcUuFrNUdY3NtT\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n    using Counters for Counters.Counter;\n\n    mapping(address => Counters.Counter) private _nonces;\n\n    // solhint-disable-next-line var-name-mixedcase\n    bytes32 private immutable _PERMIT_TYPEHASH =\n        keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n    /**\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n     *\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n     */\n    constructor(string memory name) EIP712(name, \"1\") {}\n\n    /**\n     * @dev See {IERC20Permit-permit}.\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) public virtual override {\n        require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n        bytes32 hash = _hashTypedDataV4(structHash);\n\n        address signer = ECDSA.recover(hash, v, r, s);\n        require(signer == owner, \"ERC20Permit: invalid signature\");\n\n        _approve(owner, spender, value);\n    }\n\n    /**\n     * @dev See {IERC20Permit-nonces}.\n     */\n    function nonces(address owner) public view virtual override returns (uint256) {\n        return _nonces[owner].current();\n    }\n\n    /**\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n        return _domainSeparatorV4();\n    }\n\n    /**\n     * @dev \"Consume a nonce\": return the current value and increment.\n     *\n     * _Available since v4.1._\n     */\n    function _useNonce(address owner) internal virtual returns (uint256 current) {\n        Counters.Counter storage nonce = _nonces[owner];\n        current = nonce.current();\n        nonce.increment();\n    }\n}\n",
  "sourcePath": "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol",
  "ast": {
    "absolutePath": "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol",
    "exportedSymbols": {
      "Context": [
        5297
      ],
      "Counters": [
        5371
      ],
      "ECDSA": [
        5981
      ],
      "EIP712": [
        6228
      ],
      "ERC20": [
        2806
      ],
      "ERC20Permit": [
        3759
      ],
      "IERC20": [
        2884
      ],
      "IERC20Metadata": [
        3590
      ],
      "IERC20Permit": [
        3795
      ],
      "Strings": [
        5574
      ]
    },
    "id": 3760,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3592,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "113:23:18"
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol",
        "file": "./draft-IERC20Permit.sol",
        "id": 3593,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 3760,
        "sourceUnit": 3796,
        "src": "138:34:18",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/ERC20.sol",
        "file": "../ERC20.sol",
        "id": 3594,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 3760,
        "sourceUnit": 2807,
        "src": "173:22:18",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol",
        "file": "../../../utils/cryptography/draft-EIP712.sol",
        "id": 3595,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 3760,
        "sourceUnit": 6229,
        "src": "196:54:18",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
        "file": "../../../utils/cryptography/ECDSA.sol",
        "id": 3596,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 3760,
        "sourceUnit": 5982,
        "src": "251:47:18",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/Counters.sol",
        "file": "../../../utils/Counters.sol",
        "id": 3597,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 3760,
        "sourceUnit": 5372,
        "src": "299:37:18",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 3599,
              "name": "ERC20",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 2806,
              "src": "889:5:18"
            },
            "id": 3600,
            "nodeType": "InheritanceSpecifier",
            "src": "889:5:18"
          },
          {
            "baseName": {
              "id": 3601,
              "name": "IERC20Permit",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 3795,
              "src": "896:12:18"
            },
            "id": 3602,
            "nodeType": "InheritanceSpecifier",
            "src": "896:12:18"
          },
          {
            "baseName": {
              "id": 3603,
              "name": "EIP712",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 6228,
              "src": "910:6:18"
            },
            "id": 3604,
            "nodeType": "InheritanceSpecifier",
            "src": "910:6:18"
          }
        ],
        "canonicalName": "ERC20Permit",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 3598,
          "nodeType": "StructuredDocumentation",
          "src": "338:517:18",
          "text": " @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n need to send a transaction, and thus is not required to hold Ether at all.\n _Available since v3.4._"
        },
        "fullyImplemented": false,
        "id": 3759,
        "linearizedBaseContracts": [
          3759,
          6228,
          3795,
          2806,
          3590,
          2884,
          5297
        ],
        "name": "ERC20Permit",
        "nameLocation": "874:11:18",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 3608,
            "libraryName": {
              "id": 3605,
              "name": "Counters",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 5371,
              "src": "929:8:18"
            },
            "nodeType": "UsingForDirective",
            "src": "923:36:18",
            "typeName": {
              "id": 3607,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 3606,
                "name": "Counters.Counter",
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 5303,
                "src": "942:16:18"
              },
              "referencedDeclaration": 5303,
              "src": "942:16:18",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                "typeString": "struct Counters.Counter"
              }
            }
          },
          {
            "constant": false,
            "id": 3613,
            "mutability": "mutable",
            "name": "_nonces",
            "nameLocation": "1010:7:18",
            "nodeType": "VariableDeclaration",
            "scope": 3759,
            "src": "965:52:18",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$5303_storage_$",
              "typeString": "mapping(address => struct Counters.Counter)"
            },
            "typeName": {
              "id": 3612,
              "keyType": {
                "id": 3609,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "973:7:18",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "965:36:18",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$5303_storage_$",
                "typeString": "mapping(address => struct Counters.Counter)"
              },
              "valueType": {
                "id": 3611,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 3610,
                  "name": "Counters.Counter",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 5303,
                  "src": "984:16:18"
                },
                "referencedDeclaration": 5303,
                "src": "984:16:18",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                  "typeString": "struct Counters.Counter"
                }
              }
            },
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 3618,
            "mutability": "immutable",
            "name": "_PERMIT_TYPEHASH",
            "nameLocation": "1102:16:18",
            "nodeType": "VariableDeclaration",
            "scope": 3759,
            "src": "1076:148:18",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes32",
              "typeString": "bytes32"
            },
            "typeName": {
              "id": 3614,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "1076:7:18",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "value": {
              "arguments": [
                {
                  "hexValue": "5065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529",
                  "id": 3616,
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "kind": "string",
                  "lValueRequested": false,
                  "nodeType": "Literal",
                  "src": "1139:84:18",
                  "typeDescriptions": {
                    "typeIdentifier": "t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9",
                    "typeString": "literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""
                  },
                  "value": "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                }
              ],
              "expression": {
                "argumentTypes": [
                  {
                    "typeIdentifier": "t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9",
                    "typeString": "literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""
                  }
                ],
                "id": 3615,
                "name": "keccak256",
                "nodeType": "Identifier",
                "overloadedDeclarations": [],
                "referencedDeclaration": 4294967288,
                "src": "1129:9:18",
                "typeDescriptions": {
                  "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                  "typeString": "function (bytes memory) pure returns (bytes32)"
                }
              },
              "id": 3617,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "functionCall",
              "lValueRequested": false,
              "names": [],
              "nodeType": "FunctionCall",
              "src": "1129:95:18",
              "tryCall": false,
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "visibility": "private"
          },
          {
            "body": {
              "id": 3628,
              "nodeType": "Block",
              "src": "1506:2:18",
              "statements": []
            },
            "documentation": {
              "id": 3619,
              "nodeType": "StructuredDocumentation",
              "src": "1231:220:18",
              "text": " @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n It's a good idea to use the same `name` that is defined as the ERC20 token name."
            },
            "id": 3629,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [
              {
                "arguments": [
                  {
                    "id": 3624,
                    "name": "name",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 3621,
                    "src": "1495:4:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  {
                    "hexValue": "31",
                    "id": 3625,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1501:3:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6",
                      "typeString": "literal_string \"1\""
                    },
                    "value": "1"
                  }
                ],
                "id": 3626,
                "kind": "baseConstructorSpecifier",
                "modifierName": {
                  "id": 3623,
                  "name": "EIP712",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 6228,
                  "src": "1488:6:18"
                },
                "nodeType": "ModifierInvocation",
                "src": "1488:17:18"
              }
            ],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3622,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3621,
                  "mutability": "mutable",
                  "name": "name",
                  "nameLocation": "1482:4:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3629,
                  "src": "1468:18:18",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3620,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1468:6:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1467:20:18"
            },
            "returnParameters": {
              "id": 3627,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1506:0:18"
            },
            "scope": 3759,
            "src": "1456:52:18",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              3780
            ],
            "body": {
              "id": 3701,
              "nodeType": "Block",
              "src": "1767:428:18",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 3652,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 3649,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967292,
                            "src": "1785:5:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 3650,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "src": "1785:15:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "id": 3651,
                          "name": "deadline",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3638,
                          "src": "1804:8:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "1785:27:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "45524332305065726d69743a206578706972656420646561646c696e65",
                        "id": 3653,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1814:31:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_3e89525a63fb9c966b61cf8f5305156de8420bc773a2b60828a2f32c3c5797bd",
                          "typeString": "literal_string \"ERC20Permit: expired deadline\""
                        },
                        "value": "ERC20Permit: expired deadline"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_3e89525a63fb9c966b61cf8f5305156de8420bc773a2b60828a2f32c3c5797bd",
                          "typeString": "literal_string \"ERC20Permit: expired deadline\""
                        }
                      ],
                      "id": 3648,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "1777:7:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3654,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1777:69:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3655,
                  "nodeType": "ExpressionStatement",
                  "src": "1777:69:18"
                },
                {
                  "assignments": [
                    3657
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3657,
                      "mutability": "mutable",
                      "name": "structHash",
                      "nameLocation": "1865:10:18",
                      "nodeType": "VariableDeclaration",
                      "scope": 3701,
                      "src": "1857:18:18",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 3656,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "1857:7:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 3671,
                  "initialValue": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 3661,
                            "name": "_PERMIT_TYPEHASH",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3618,
                            "src": "1899:16:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "id": 3662,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3632,
                            "src": "1917:5:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "id": 3663,
                            "name": "spender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3634,
                            "src": "1924:7:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "id": 3664,
                            "name": "value",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3636,
                            "src": "1933:5:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          {
                            "arguments": [
                              {
                                "id": 3666,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3632,
                                "src": "1950:5:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 3665,
                              "name": "_useNonce",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3758,
                              "src": "1940:9:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint256_$",
                                "typeString": "function (address) returns (uint256)"
                              }
                            },
                            "id": 3667,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1940:16:18",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          {
                            "id": 3668,
                            "name": "deadline",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3638,
                            "src": "1958:8:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "id": 3659,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967295,
                            "src": "1888:3:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 3660,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encode",
                          "nodeType": "MemberAccess",
                          "src": "1888:10:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function () pure returns (bytes memory)"
                          }
                        },
                        "id": 3669,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1888:79:18",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 3658,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4294967288,
                      "src": "1878:9:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 3670,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1878:90:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1857:111:18"
                },
                {
                  "assignments": [
                    3673
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3673,
                      "mutability": "mutable",
                      "name": "hash",
                      "nameLocation": "1987:4:18",
                      "nodeType": "VariableDeclaration",
                      "scope": 3701,
                      "src": "1979:12:18",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 3672,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "1979:7:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 3677,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 3675,
                        "name": "structHash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3657,
                        "src": "2011:10:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 3674,
                      "name": "_hashTypedDataV4",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6227,
                      "src": "1994:16:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$",
                        "typeString": "function (bytes32) view returns (bytes32)"
                      }
                    },
                    "id": 3676,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1994:28:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1979:43:18"
                },
                {
                  "assignments": [
                    3679
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3679,
                      "mutability": "mutable",
                      "name": "signer",
                      "nameLocation": "2041:6:18",
                      "nodeType": "VariableDeclaration",
                      "scope": 3701,
                      "src": "2033:14:18",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 3678,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "2033:7:18",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 3687,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 3682,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3673,
                        "src": "2064:4:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 3683,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3640,
                        "src": "2070:1:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 3684,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3642,
                        "src": "2073:1:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 3685,
                        "name": "s",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3644,
                        "src": "2076:1:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "expression": {
                        "id": 3680,
                        "name": "ECDSA",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5981,
                        "src": "2050:5:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_ECDSA_$5981_$",
                          "typeString": "type(library ECDSA)"
                        }
                      },
                      "id": 3681,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "recover",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5921,
                      "src": "2050:13:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                        "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"
                      }
                    },
                    "id": 3686,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2050:28:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2033:45:18"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 3691,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 3689,
                          "name": "signer",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3679,
                          "src": "2096:6:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "id": 3690,
                          "name": "owner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3632,
                          "src": "2106:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "2096:15:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "45524332305065726d69743a20696e76616c6964207369676e6174757265",
                        "id": 3692,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2113:32:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_94ca1ab58dfda790a1782ffbb0c0a140ec51d4148dbeecc6c39e37b25ff4b124",
                          "typeString": "literal_string \"ERC20Permit: invalid signature\""
                        },
                        "value": "ERC20Permit: invalid signature"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_94ca1ab58dfda790a1782ffbb0c0a140ec51d4148dbeecc6c39e37b25ff4b124",
                          "typeString": "literal_string \"ERC20Permit: invalid signature\""
                        }
                      ],
                      "id": 3688,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "2088:7:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2088:58:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3694,
                  "nodeType": "ExpressionStatement",
                  "src": "2088:58:18"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 3696,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3632,
                        "src": "2166:5:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 3697,
                        "name": "spender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3634,
                        "src": "2173:7:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 3698,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3636,
                        "src": "2182:5:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 3695,
                      "name": "_approve",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2740,
                      "src": "2157:8:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 3699,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2157:31:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3700,
                  "nodeType": "ExpressionStatement",
                  "src": "2157:31:18"
                }
              ]
            },
            "documentation": {
              "id": 3630,
              "nodeType": "StructuredDocumentation",
              "src": "1514:50:18",
              "text": " @dev See {IERC20Permit-permit}."
            },
            "functionSelector": "d505accf",
            "id": 3702,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "permit",
            "nameLocation": "1578:6:18",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 3646,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1758:8:18"
            },
            "parameters": {
              "id": 3645,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3632,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "1602:5:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1594:13:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3631,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1594:7:18",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3634,
                  "mutability": "mutable",
                  "name": "spender",
                  "nameLocation": "1625:7:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1617:15:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3633,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1617:7:18",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3636,
                  "mutability": "mutable",
                  "name": "value",
                  "nameLocation": "1650:5:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1642:13:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3635,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1642:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3638,
                  "mutability": "mutable",
                  "name": "deadline",
                  "nameLocation": "1673:8:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1665:16:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3637,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1665:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3640,
                  "mutability": "mutable",
                  "name": "v",
                  "nameLocation": "1697:1:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1691:7:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3639,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "1691:5:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3642,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "1716:1:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1708:9:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3641,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1708:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3644,
                  "mutability": "mutable",
                  "name": "s",
                  "nameLocation": "1735:1:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1727:9:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3643,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1727:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1584:158:18"
            },
            "returnParameters": {
              "id": 3647,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1767:0:18"
            },
            "scope": 3759,
            "src": "1569:626:18",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              3788
            ],
            "body": {
              "id": 3717,
              "nodeType": "Block",
              "src": "2334:48:18",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "baseExpression": {
                          "id": 3711,
                          "name": "_nonces",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3613,
                          "src": "2351:7:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$5303_storage_$",
                            "typeString": "mapping(address => struct Counters.Counter storage ref)"
                          }
                        },
                        "id": 3713,
                        "indexExpression": {
                          "id": 3712,
                          "name": "owner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3705,
                          "src": "2359:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "2351:14:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$5303_storage",
                          "typeString": "struct Counters.Counter storage ref"
                        }
                      },
                      "id": 3714,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "current",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5315,
                      "src": "2351:22:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Counter_$5303_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Counter_$5303_storage_ptr_$",
                        "typeString": "function (struct Counters.Counter storage pointer) view returns (uint256)"
                      }
                    },
                    "id": 3715,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2351:24:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 3710,
                  "id": 3716,
                  "nodeType": "Return",
                  "src": "2344:31:18"
                }
              ]
            },
            "documentation": {
              "id": 3703,
              "nodeType": "StructuredDocumentation",
              "src": "2201:50:18",
              "text": " @dev See {IERC20Permit-nonces}."
            },
            "functionSelector": "7ecebe00",
            "id": 3718,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "nonces",
            "nameLocation": "2265:6:18",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 3707,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2307:8:18"
            },
            "parameters": {
              "id": 3706,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3705,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "2280:5:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3718,
                  "src": "2272:13:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3704,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2272:7:18",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2271:15:18"
            },
            "returnParameters": {
              "id": 3710,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3709,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 3718,
                  "src": "2325:7:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3708,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2325:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2324:9:18"
            },
            "scope": 3759,
            "src": "2256:126:18",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              3794
            ],
            "body": {
              "id": 3728,
              "nodeType": "Block",
              "src": "2575:44:18",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 3725,
                      "name": "_domainSeparatorV4",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6184,
                      "src": "2592:18:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$",
                        "typeString": "function () view returns (bytes32)"
                      }
                    },
                    "id": 3726,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2592:20:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 3724,
                  "id": 3727,
                  "nodeType": "Return",
                  "src": "2585:27:18"
                }
              ]
            },
            "documentation": {
              "id": 3719,
              "nodeType": "StructuredDocumentation",
              "src": "2388:60:18",
              "text": " @dev See {IERC20Permit-DOMAIN_SEPARATOR}."
            },
            "functionSelector": "3644e515",
            "id": 3729,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "DOMAIN_SEPARATOR",
            "nameLocation": "2515:16:18",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 3721,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2548:8:18"
            },
            "parameters": {
              "id": 3720,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2531:2:18"
            },
            "returnParameters": {
              "id": 3724,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3723,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 3729,
                  "src": "2566:7:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3722,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2566:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2565:9:18"
            },
            "scope": 3759,
            "src": "2506:113:18",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3757,
              "nodeType": "Block",
              "src": "2827:126:18",
              "statements": [
                {
                  "assignments": [
                    3741
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3741,
                      "mutability": "mutable",
                      "name": "nonce",
                      "nameLocation": "2862:5:18",
                      "nodeType": "VariableDeclaration",
                      "scope": 3757,
                      "src": "2837:30:18",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                        "typeString": "struct Counters.Counter"
                      },
                      "typeName": {
                        "id": 3740,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 3739,
                          "name": "Counters.Counter",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 5303,
                          "src": "2837:16:18"
                        },
                        "referencedDeclaration": 5303,
                        "src": "2837:16:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                          "typeString": "struct Counters.Counter"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 3745,
                  "initialValue": {
                    "baseExpression": {
                      "id": 3742,
                      "name": "_nonces",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3613,
                      "src": "2870:7:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$5303_storage_$",
                        "typeString": "mapping(address => struct Counters.Counter storage ref)"
                      }
                    },
                    "id": 3744,
                    "indexExpression": {
                      "id": 3743,
                      "name": "owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3732,
                      "src": "2878:5:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2870:14:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Counter_$5303_storage",
                      "typeString": "struct Counters.Counter storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2837:47:18"
                },
                {
                  "expression": {
                    "id": 3750,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 3746,
                      "name": "current",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3735,
                      "src": "2894:7:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "expression": {
                          "id": 3747,
                          "name": "nonce",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3741,
                          "src": "2904:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                            "typeString": "struct Counters.Counter storage pointer"
                          }
                        },
                        "id": 3748,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "current",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 5315,
                        "src": "2904:13:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_struct$_Counter_$5303_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Counter_$5303_storage_ptr_$",
                          "typeString": "function (struct Counters.Counter storage pointer) view returns (uint256)"
                        }
                      },
                      "id": 3749,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2904:15:18",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2894:25:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 3751,
                  "nodeType": "ExpressionStatement",
                  "src": "2894:25:18"
                },
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "id": 3752,
                        "name": "nonce",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3741,
                        "src": "2929:5:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                          "typeString": "struct Counters.Counter storage pointer"
                        }
                      },
                      "id": 3754,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "increment",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5329,
                      "src": "2929:15:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Counter_$5303_storage_ptr_$returns$__$bound_to$_t_struct$_Counter_$5303_storage_ptr_$",
                        "typeString": "function (struct Counters.Counter storage pointer)"
                      }
                    },
                    "id": 3755,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2929:17:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3756,
                  "nodeType": "ExpressionStatement",
                  "src": "2929:17:18"
                }
              ]
            },
            "documentation": {
              "id": 3730,
              "nodeType": "StructuredDocumentation",
              "src": "2625:120:18",
              "text": " @dev \"Consume a nonce\": return the current value and increment.\n _Available since v4.1._"
            },
            "id": 3758,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_useNonce",
            "nameLocation": "2759:9:18",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3733,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3732,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "2777:5:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3758,
                  "src": "2769:13:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3731,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2769:7:18",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2768:15:18"
            },
            "returnParameters": {
              "id": 3736,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3735,
                  "mutability": "mutable",
                  "name": "current",
                  "nameLocation": "2818:7:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3758,
                  "src": "2810:15:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3734,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2810:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2809:17:18"
            },
            "scope": 3759,
            "src": "2750:203:18",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          }
        ],
        "scope": 3760,
        "src": "856:2099:18",
        "usedErrors": []
      }
    ],
    "src": "113:2843:18"
  },
  "legacyAST": {
    "absolutePath": "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol",
    "exportedSymbols": {
      "Context": [
        5297
      ],
      "Counters": [
        5371
      ],
      "ECDSA": [
        5981
      ],
      "EIP712": [
        6228
      ],
      "ERC20": [
        2806
      ],
      "ERC20Permit": [
        3759
      ],
      "IERC20": [
        2884
      ],
      "IERC20Metadata": [
        3590
      ],
      "IERC20Permit": [
        3795
      ],
      "Strings": [
        5574
      ]
    },
    "id": 3760,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3592,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "113:23:18"
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol",
        "file": "./draft-IERC20Permit.sol",
        "id": 3593,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 3760,
        "sourceUnit": 3796,
        "src": "138:34:18",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/ERC20.sol",
        "file": "../ERC20.sol",
        "id": 3594,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 3760,
        "sourceUnit": 2807,
        "src": "173:22:18",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol",
        "file": "../../../utils/cryptography/draft-EIP712.sol",
        "id": 3595,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 3760,
        "sourceUnit": 6229,
        "src": "196:54:18",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
        "file": "../../../utils/cryptography/ECDSA.sol",
        "id": 3596,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 3760,
        "sourceUnit": 5982,
        "src": "251:47:18",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/Counters.sol",
        "file": "../../../utils/Counters.sol",
        "id": 3597,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 3760,
        "sourceUnit": 5372,
        "src": "299:37:18",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 3599,
              "name": "ERC20",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 2806,
              "src": "889:5:18"
            },
            "id": 3600,
            "nodeType": "InheritanceSpecifier",
            "src": "889:5:18"
          },
          {
            "baseName": {
              "id": 3601,
              "name": "IERC20Permit",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 3795,
              "src": "896:12:18"
            },
            "id": 3602,
            "nodeType": "InheritanceSpecifier",
            "src": "896:12:18"
          },
          {
            "baseName": {
              "id": 3603,
              "name": "EIP712",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 6228,
              "src": "910:6:18"
            },
            "id": 3604,
            "nodeType": "InheritanceSpecifier",
            "src": "910:6:18"
          }
        ],
        "canonicalName": "ERC20Permit",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 3598,
          "nodeType": "StructuredDocumentation",
          "src": "338:517:18",
          "text": " @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n need to send a transaction, and thus is not required to hold Ether at all.\n _Available since v3.4._"
        },
        "fullyImplemented": false,
        "id": 3759,
        "linearizedBaseContracts": [
          3759,
          6228,
          3795,
          2806,
          3590,
          2884,
          5297
        ],
        "name": "ERC20Permit",
        "nameLocation": "874:11:18",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 3608,
            "libraryName": {
              "id": 3605,
              "name": "Counters",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 5371,
              "src": "929:8:18"
            },
            "nodeType": "UsingForDirective",
            "src": "923:36:18",
            "typeName": {
              "id": 3607,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 3606,
                "name": "Counters.Counter",
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 5303,
                "src": "942:16:18"
              },
              "referencedDeclaration": 5303,
              "src": "942:16:18",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                "typeString": "struct Counters.Counter"
              }
            }
          },
          {
            "constant": false,
            "id": 3613,
            "mutability": "mutable",
            "name": "_nonces",
            "nameLocation": "1010:7:18",
            "nodeType": "VariableDeclaration",
            "scope": 3759,
            "src": "965:52:18",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$5303_storage_$",
              "typeString": "mapping(address => struct Counters.Counter)"
            },
            "typeName": {
              "id": 3612,
              "keyType": {
                "id": 3609,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "973:7:18",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "965:36:18",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$5303_storage_$",
                "typeString": "mapping(address => struct Counters.Counter)"
              },
              "valueType": {
                "id": 3611,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 3610,
                  "name": "Counters.Counter",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 5303,
                  "src": "984:16:18"
                },
                "referencedDeclaration": 5303,
                "src": "984:16:18",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                  "typeString": "struct Counters.Counter"
                }
              }
            },
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 3618,
            "mutability": "immutable",
            "name": "_PERMIT_TYPEHASH",
            "nameLocation": "1102:16:18",
            "nodeType": "VariableDeclaration",
            "scope": 3759,
            "src": "1076:148:18",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes32",
              "typeString": "bytes32"
            },
            "typeName": {
              "id": 3614,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "1076:7:18",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "value": {
              "arguments": [
                {
                  "hexValue": "5065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529",
                  "id": 3616,
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "kind": "string",
                  "lValueRequested": false,
                  "nodeType": "Literal",
                  "src": "1139:84:18",
                  "typeDescriptions": {
                    "typeIdentifier": "t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9",
                    "typeString": "literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""
                  },
                  "value": "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                }
              ],
              "expression": {
                "argumentTypes": [
                  {
                    "typeIdentifier": "t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9",
                    "typeString": "literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""
                  }
                ],
                "id": 3615,
                "name": "keccak256",
                "nodeType": "Identifier",
                "overloadedDeclarations": [],
                "referencedDeclaration": 4294967288,
                "src": "1129:9:18",
                "typeDescriptions": {
                  "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                  "typeString": "function (bytes memory) pure returns (bytes32)"
                }
              },
              "id": 3617,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "functionCall",
              "lValueRequested": false,
              "names": [],
              "nodeType": "FunctionCall",
              "src": "1129:95:18",
              "tryCall": false,
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "visibility": "private"
          },
          {
            "body": {
              "id": 3628,
              "nodeType": "Block",
              "src": "1506:2:18",
              "statements": []
            },
            "documentation": {
              "id": 3619,
              "nodeType": "StructuredDocumentation",
              "src": "1231:220:18",
              "text": " @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n It's a good idea to use the same `name` that is defined as the ERC20 token name."
            },
            "id": 3629,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [
              {
                "arguments": [
                  {
                    "id": 3624,
                    "name": "name",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 3621,
                    "src": "1495:4:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  {
                    "hexValue": "31",
                    "id": 3625,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1501:3:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6",
                      "typeString": "literal_string \"1\""
                    },
                    "value": "1"
                  }
                ],
                "id": 3626,
                "kind": "baseConstructorSpecifier",
                "modifierName": {
                  "id": 3623,
                  "name": "EIP712",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 6228,
                  "src": "1488:6:18"
                },
                "nodeType": "ModifierInvocation",
                "src": "1488:17:18"
              }
            ],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3622,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3621,
                  "mutability": "mutable",
                  "name": "name",
                  "nameLocation": "1482:4:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3629,
                  "src": "1468:18:18",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3620,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1468:6:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1467:20:18"
            },
            "returnParameters": {
              "id": 3627,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1506:0:18"
            },
            "scope": 3759,
            "src": "1456:52:18",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              3780
            ],
            "body": {
              "id": 3701,
              "nodeType": "Block",
              "src": "1767:428:18",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 3652,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 3649,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967292,
                            "src": "1785:5:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 3650,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "src": "1785:15:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "id": 3651,
                          "name": "deadline",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3638,
                          "src": "1804:8:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "1785:27:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "45524332305065726d69743a206578706972656420646561646c696e65",
                        "id": 3653,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1814:31:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_3e89525a63fb9c966b61cf8f5305156de8420bc773a2b60828a2f32c3c5797bd",
                          "typeString": "literal_string \"ERC20Permit: expired deadline\""
                        },
                        "value": "ERC20Permit: expired deadline"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_3e89525a63fb9c966b61cf8f5305156de8420bc773a2b60828a2f32c3c5797bd",
                          "typeString": "literal_string \"ERC20Permit: expired deadline\""
                        }
                      ],
                      "id": 3648,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "1777:7:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3654,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1777:69:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3655,
                  "nodeType": "ExpressionStatement",
                  "src": "1777:69:18"
                },
                {
                  "assignments": [
                    3657
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3657,
                      "mutability": "mutable",
                      "name": "structHash",
                      "nameLocation": "1865:10:18",
                      "nodeType": "VariableDeclaration",
                      "scope": 3701,
                      "src": "1857:18:18",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 3656,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "1857:7:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 3671,
                  "initialValue": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 3661,
                            "name": "_PERMIT_TYPEHASH",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3618,
                            "src": "1899:16:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "id": 3662,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3632,
                            "src": "1917:5:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "id": 3663,
                            "name": "spender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3634,
                            "src": "1924:7:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "id": 3664,
                            "name": "value",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3636,
                            "src": "1933:5:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          {
                            "arguments": [
                              {
                                "id": 3666,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3632,
                                "src": "1950:5:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 3665,
                              "name": "_useNonce",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3758,
                              "src": "1940:9:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint256_$",
                                "typeString": "function (address) returns (uint256)"
                              }
                            },
                            "id": 3667,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1940:16:18",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          {
                            "id": 3668,
                            "name": "deadline",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3638,
                            "src": "1958:8:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "id": 3659,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967295,
                            "src": "1888:3:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 3660,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encode",
                          "nodeType": "MemberAccess",
                          "src": "1888:10:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function () pure returns (bytes memory)"
                          }
                        },
                        "id": 3669,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1888:79:18",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 3658,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4294967288,
                      "src": "1878:9:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 3670,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1878:90:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1857:111:18"
                },
                {
                  "assignments": [
                    3673
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3673,
                      "mutability": "mutable",
                      "name": "hash",
                      "nameLocation": "1987:4:18",
                      "nodeType": "VariableDeclaration",
                      "scope": 3701,
                      "src": "1979:12:18",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 3672,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "1979:7:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 3677,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 3675,
                        "name": "structHash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3657,
                        "src": "2011:10:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 3674,
                      "name": "_hashTypedDataV4",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6227,
                      "src": "1994:16:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$",
                        "typeString": "function (bytes32) view returns (bytes32)"
                      }
                    },
                    "id": 3676,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1994:28:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1979:43:18"
                },
                {
                  "assignments": [
                    3679
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3679,
                      "mutability": "mutable",
                      "name": "signer",
                      "nameLocation": "2041:6:18",
                      "nodeType": "VariableDeclaration",
                      "scope": 3701,
                      "src": "2033:14:18",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 3678,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "2033:7:18",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 3687,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 3682,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3673,
                        "src": "2064:4:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 3683,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3640,
                        "src": "2070:1:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 3684,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3642,
                        "src": "2073:1:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 3685,
                        "name": "s",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3644,
                        "src": "2076:1:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "expression": {
                        "id": 3680,
                        "name": "ECDSA",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5981,
                        "src": "2050:5:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_ECDSA_$5981_$",
                          "typeString": "type(library ECDSA)"
                        }
                      },
                      "id": 3681,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "recover",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5921,
                      "src": "2050:13:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                        "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"
                      }
                    },
                    "id": 3686,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2050:28:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2033:45:18"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 3691,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 3689,
                          "name": "signer",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3679,
                          "src": "2096:6:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "id": 3690,
                          "name": "owner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3632,
                          "src": "2106:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "2096:15:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "45524332305065726d69743a20696e76616c6964207369676e6174757265",
                        "id": 3692,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2113:32:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_94ca1ab58dfda790a1782ffbb0c0a140ec51d4148dbeecc6c39e37b25ff4b124",
                          "typeString": "literal_string \"ERC20Permit: invalid signature\""
                        },
                        "value": "ERC20Permit: invalid signature"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_94ca1ab58dfda790a1782ffbb0c0a140ec51d4148dbeecc6c39e37b25ff4b124",
                          "typeString": "literal_string \"ERC20Permit: invalid signature\""
                        }
                      ],
                      "id": 3688,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "2088:7:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2088:58:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3694,
                  "nodeType": "ExpressionStatement",
                  "src": "2088:58:18"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 3696,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3632,
                        "src": "2166:5:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 3697,
                        "name": "spender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3634,
                        "src": "2173:7:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 3698,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3636,
                        "src": "2182:5:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 3695,
                      "name": "_approve",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2740,
                      "src": "2157:8:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 3699,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2157:31:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3700,
                  "nodeType": "ExpressionStatement",
                  "src": "2157:31:18"
                }
              ]
            },
            "documentation": {
              "id": 3630,
              "nodeType": "StructuredDocumentation",
              "src": "1514:50:18",
              "text": " @dev See {IERC20Permit-permit}."
            },
            "functionSelector": "d505accf",
            "id": 3702,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "permit",
            "nameLocation": "1578:6:18",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 3646,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1758:8:18"
            },
            "parameters": {
              "id": 3645,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3632,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "1602:5:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1594:13:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3631,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1594:7:18",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3634,
                  "mutability": "mutable",
                  "name": "spender",
                  "nameLocation": "1625:7:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1617:15:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3633,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1617:7:18",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3636,
                  "mutability": "mutable",
                  "name": "value",
                  "nameLocation": "1650:5:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1642:13:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3635,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1642:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3638,
                  "mutability": "mutable",
                  "name": "deadline",
                  "nameLocation": "1673:8:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1665:16:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3637,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1665:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3640,
                  "mutability": "mutable",
                  "name": "v",
                  "nameLocation": "1697:1:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1691:7:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3639,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "1691:5:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3642,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "1716:1:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1708:9:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3641,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1708:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3644,
                  "mutability": "mutable",
                  "name": "s",
                  "nameLocation": "1735:1:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3702,
                  "src": "1727:9:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3643,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1727:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1584:158:18"
            },
            "returnParameters": {
              "id": 3647,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1767:0:18"
            },
            "scope": 3759,
            "src": "1569:626:18",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              3788
            ],
            "body": {
              "id": 3717,
              "nodeType": "Block",
              "src": "2334:48:18",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "baseExpression": {
                          "id": 3711,
                          "name": "_nonces",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3613,
                          "src": "2351:7:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$5303_storage_$",
                            "typeString": "mapping(address => struct Counters.Counter storage ref)"
                          }
                        },
                        "id": 3713,
                        "indexExpression": {
                          "id": 3712,
                          "name": "owner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3705,
                          "src": "2359:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "2351:14:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$5303_storage",
                          "typeString": "struct Counters.Counter storage ref"
                        }
                      },
                      "id": 3714,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "current",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5315,
                      "src": "2351:22:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Counter_$5303_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Counter_$5303_storage_ptr_$",
                        "typeString": "function (struct Counters.Counter storage pointer) view returns (uint256)"
                      }
                    },
                    "id": 3715,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2351:24:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 3710,
                  "id": 3716,
                  "nodeType": "Return",
                  "src": "2344:31:18"
                }
              ]
            },
            "documentation": {
              "id": 3703,
              "nodeType": "StructuredDocumentation",
              "src": "2201:50:18",
              "text": " @dev See {IERC20Permit-nonces}."
            },
            "functionSelector": "7ecebe00",
            "id": 3718,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "nonces",
            "nameLocation": "2265:6:18",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 3707,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2307:8:18"
            },
            "parameters": {
              "id": 3706,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3705,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "2280:5:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3718,
                  "src": "2272:13:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3704,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2272:7:18",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2271:15:18"
            },
            "returnParameters": {
              "id": 3710,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3709,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 3718,
                  "src": "2325:7:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3708,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2325:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2324:9:18"
            },
            "scope": 3759,
            "src": "2256:126:18",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              3794
            ],
            "body": {
              "id": 3728,
              "nodeType": "Block",
              "src": "2575:44:18",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 3725,
                      "name": "_domainSeparatorV4",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6184,
                      "src": "2592:18:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$",
                        "typeString": "function () view returns (bytes32)"
                      }
                    },
                    "id": 3726,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2592:20:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 3724,
                  "id": 3727,
                  "nodeType": "Return",
                  "src": "2585:27:18"
                }
              ]
            },
            "documentation": {
              "id": 3719,
              "nodeType": "StructuredDocumentation",
              "src": "2388:60:18",
              "text": " @dev See {IERC20Permit-DOMAIN_SEPARATOR}."
            },
            "functionSelector": "3644e515",
            "id": 3729,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "DOMAIN_SEPARATOR",
            "nameLocation": "2515:16:18",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 3721,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2548:8:18"
            },
            "parameters": {
              "id": 3720,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2531:2:18"
            },
            "returnParameters": {
              "id": 3724,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3723,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 3729,
                  "src": "2566:7:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3722,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2566:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2565:9:18"
            },
            "scope": 3759,
            "src": "2506:113:18",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3757,
              "nodeType": "Block",
              "src": "2827:126:18",
              "statements": [
                {
                  "assignments": [
                    3741
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3741,
                      "mutability": "mutable",
                      "name": "nonce",
                      "nameLocation": "2862:5:18",
                      "nodeType": "VariableDeclaration",
                      "scope": 3757,
                      "src": "2837:30:18",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                        "typeString": "struct Counters.Counter"
                      },
                      "typeName": {
                        "id": 3740,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 3739,
                          "name": "Counters.Counter",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 5303,
                          "src": "2837:16:18"
                        },
                        "referencedDeclaration": 5303,
                        "src": "2837:16:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                          "typeString": "struct Counters.Counter"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 3745,
                  "initialValue": {
                    "baseExpression": {
                      "id": 3742,
                      "name": "_nonces",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3613,
                      "src": "2870:7:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$5303_storage_$",
                        "typeString": "mapping(address => struct Counters.Counter storage ref)"
                      }
                    },
                    "id": 3744,
                    "indexExpression": {
                      "id": 3743,
                      "name": "owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3732,
                      "src": "2878:5:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2870:14:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Counter_$5303_storage",
                      "typeString": "struct Counters.Counter storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2837:47:18"
                },
                {
                  "expression": {
                    "id": 3750,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 3746,
                      "name": "current",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3735,
                      "src": "2894:7:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "expression": {
                          "id": 3747,
                          "name": "nonce",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3741,
                          "src": "2904:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                            "typeString": "struct Counters.Counter storage pointer"
                          }
                        },
                        "id": 3748,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "current",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 5315,
                        "src": "2904:13:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_struct$_Counter_$5303_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Counter_$5303_storage_ptr_$",
                          "typeString": "function (struct Counters.Counter storage pointer) view returns (uint256)"
                        }
                      },
                      "id": 3749,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2904:15:18",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2894:25:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 3751,
                  "nodeType": "ExpressionStatement",
                  "src": "2894:25:18"
                },
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "id": 3752,
                        "name": "nonce",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3741,
                        "src": "2929:5:18",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$5303_storage_ptr",
                          "typeString": "struct Counters.Counter storage pointer"
                        }
                      },
                      "id": 3754,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "increment",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5329,
                      "src": "2929:15:18",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Counter_$5303_storage_ptr_$returns$__$bound_to$_t_struct$_Counter_$5303_storage_ptr_$",
                        "typeString": "function (struct Counters.Counter storage pointer)"
                      }
                    },
                    "id": 3755,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2929:17:18",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3756,
                  "nodeType": "ExpressionStatement",
                  "src": "2929:17:18"
                }
              ]
            },
            "documentation": {
              "id": 3730,
              "nodeType": "StructuredDocumentation",
              "src": "2625:120:18",
              "text": " @dev \"Consume a nonce\": return the current value and increment.\n _Available since v4.1._"
            },
            "id": 3758,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_useNonce",
            "nameLocation": "2759:9:18",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3733,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3732,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "2777:5:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3758,
                  "src": "2769:13:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3731,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2769:7:18",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2768:15:18"
            },
            "returnParameters": {
              "id": 3736,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3735,
                  "mutability": "mutable",
                  "name": "current",
                  "nameLocation": "2818:7:18",
                  "nodeType": "VariableDeclaration",
                  "scope": 3758,
                  "src": "2810:15:18",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3734,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2810:7:18",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2809:17:18"
            },
            "scope": 3759,
            "src": "2750:203:18",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          }
        ],
        "scope": 3760,
        "src": "856:2099:18",
        "usedErrors": []
      }
    ],
    "src": "113:2843:18"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.11+commit.d7f03943.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.4",
  "updatedAt": "2022-03-06T23:47:11.032Z",
  "devdoc": {
    "details": "Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all. _Available since v3.4._",
    "kind": "dev",
    "methods": {
      "DOMAIN_SEPARATOR()": {
        "details": "See {IERC20Permit-DOMAIN_SEPARATOR}."
      },
      "allowance(address,address)": {
        "details": "See {IERC20-allowance}."
      },
      "approve(address,uint256)": {
        "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."
      },
      "balanceOf(address)": {
        "details": "See {IERC20-balanceOf}."
      },
      "constructor": {
        "details": "Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`. It's a good idea to use the same `name` that is defined as the ERC20 token name."
      },
      "decimals()": {
        "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
      },
      "decreaseAllowance(address,uint256)": {
        "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
      },
      "increaseAllowance(address,uint256)": {
        "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
      },
      "name()": {
        "details": "Returns the name of the token."
      },
      "nonces(address)": {
        "details": "See {IERC20Permit-nonces}."
      },
      "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
        "details": "See {IERC20Permit-permit}."
      },
      "symbol()": {
        "details": "Returns the symbol of the token, usually a shorter version of the name."
      },
      "totalSupply()": {
        "details": "See {IERC20-totalSupply}."
      },
      "transfer(address,uint256)": {
        "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`."
      },
      "transferFrom(address,address,uint256)": {
        "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  }
}