{
  "fileName": "ERC20Snapshot.sol",
  "contractName": "ERC20SnapshotUpgradeSafe",
  "source": "pragma solidity ^0.6.0;\n\nimport \"../../math/SafeMath.sol\";\nimport \"../../utils/Arrays.sol\";\nimport \"../../utils/Counters.sol\";\nimport \"./ERC20.sol\";\nimport \"../../Initializable.sol\";\n\n/**\n * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and\n * total supply at the time are recorded for later access.\n *\n * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting.\n * In naive implementations it's possible to perform a \"double spend\" attack by reusing the same balance from different\n * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be\n * used to create an efficient ERC20 forking mechanism.\n *\n * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a\n * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot\n * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id\n * and the account address.\n *\n * ==== Gas Costs\n *\n * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log\n * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much\n * smaller since identical balances in subsequent snapshots are stored as a single entry.\n *\n * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is\n * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent\n * transfers will have normal cost until the next snapshot, and so on.\n */\nabstract contract ERC20SnapshotUpgradeSafe is Initializable, ERC20UpgradeSafe {\n    function __ERC20Snapshot_init() internal initializer {\n        __Context_init_unchained();\n        __ERC20Snapshot_init_unchained();\n    }\n\n    function __ERC20Snapshot_init_unchained() internal initializer {\n\n\n    }\n\n    // Inspired by Jordi Baylina's MiniMeToken to record historical balances:\n    // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol\n\n    using SafeMath for uint256;\n    using Arrays for uint256[];\n    using Counters for Counters.Counter;\n\n    // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a\n    // Snapshot struct, but that would impede usage of functions that work on an array.\n    struct Snapshots {\n        uint256[] ids;\n        uint256[] values;\n    }\n\n    mapping (address => Snapshots) private _accountBalanceSnapshots;\n    Snapshots private _totalSupplySnapshots;\n\n    // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid.\n    Counters.Counter private _currentSnapshotId;\n\n    /**\n     * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created.\n     */\n    event Snapshot(uint256 id);\n\n    /**\n     * @dev Creates a new snapshot and returns its snapshot id.\n     *\n     * Emits a {Snapshot} event that contains the same id.\n     *\n     * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a\n     * set of accounts, for example using {AccessControl}, or it may be open to the public.\n     *\n     * [WARNING]\n     * ====\n     * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking,\n     * you must consider that it can potentially be used by attackers in two ways.\n     *\n     * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow\n     * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target\n     * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs\n     * section above.\n     *\n     * We haven't measured the actual numbers; if this is something you're interested in please reach out to us.\n     * ====\n     */\n    function _snapshot() internal virtual returns (uint256) {\n        _currentSnapshotId.increment();\n\n        uint256 currentId = _currentSnapshotId.current();\n        emit Snapshot(currentId);\n        return currentId;\n    }\n\n    /**\n     * @dev Retrieves the balance of `account` at the time `snapshotId` was created.\n     */\n    function balanceOfAt(address account, uint256 snapshotId) public view returns (uint256) {\n        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);\n\n        return snapshotted ? value : balanceOf(account);\n    }\n\n    /**\n     * @dev Retrieves the total supply at the time `snapshotId` was created.\n     */\n    function totalSupplyAt(uint256 snapshotId) public view returns(uint256) {\n        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);\n\n        return snapshotted ? value : totalSupply();\n    }\n\n    // _transfer, _mint and _burn are the only functions where the balances are modified, so it is there that the\n    // snapshots are updated. Note that the update happens _before_ the balance change, with the pre-modified value.\n    // The same is true for the total supply and _mint and _burn.\n    function _transfer(address from, address to, uint256 value) internal virtual override {\n        _updateAccountSnapshot(from);\n        _updateAccountSnapshot(to);\n\n        super._transfer(from, to, value);\n    }\n\n    function _mint(address account, uint256 value) internal virtual override {\n        _updateAccountSnapshot(account);\n        _updateTotalSupplySnapshot();\n\n        super._mint(account, value);\n    }\n\n    function _burn(address account, uint256 value) internal virtual override {\n        _updateAccountSnapshot(account);\n        _updateTotalSupplySnapshot();\n\n        super._burn(account, value);\n    }\n\n    function _valueAt(uint256 snapshotId, Snapshots storage snapshots)\n        private view returns (bool, uint256)\n    {\n        require(snapshotId > 0, \"ERC20Snapshot: id is 0\");\n        // solhint-disable-next-line max-line-length\n        require(snapshotId <= _currentSnapshotId.current(), \"ERC20Snapshot: nonexistent id\");\n\n        // When a valid snapshot is queried, there are three possibilities:\n        //  a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never\n        //  created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds\n        //  to this id is the current one.\n        //  b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the\n        //  requested id, and its value is the one to return.\n        //  c) More snapshots were created after the requested one, and the queried value was later modified. There will be\n        //  no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is\n        //  larger than the requested one.\n        //\n        // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if\n        // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does\n        // exactly this.\n\n        uint256 index = snapshots.ids.findUpperBound(snapshotId);\n\n        if (index == snapshots.ids.length) {\n            return (false, 0);\n        } else {\n            return (true, snapshots.values[index]);\n        }\n    }\n\n    function _updateAccountSnapshot(address account) private {\n        _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));\n    }\n\n    function _updateTotalSupplySnapshot() private {\n        _updateSnapshot(_totalSupplySnapshots, totalSupply());\n    }\n\n    function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {\n        uint256 currentId = _currentSnapshotId.current();\n        if (_lastSnapshotId(snapshots.ids) < currentId) {\n            snapshots.ids.push(currentId);\n            snapshots.values.push(currentValue);\n        }\n    }\n\n    function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {\n        if (ids.length == 0) {\n            return 0;\n        } else {\n            return ids[ids.length - 1];\n        }\n    }\n\n    uint256[46] private __gap;\n}\n",
  "sourcePath": "contracts/token/ERC20/ERC20Snapshot.sol",
  "sourceMap": "",
  "deployedSourceMap": "",
  "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": false,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "Snapshot",
      "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": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "snapshotId",
          "type": "uint256"
        }
      ],
      "name": "balanceOfAt",
      "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": "uint256",
          "name": "snapshotId",
          "type": "uint256"
        }
      ],
      "name": "totalSupplyAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "ast": {
    "absolutePath": "contracts/token/ERC20/ERC20Snapshot.sol",
    "exportedSymbols": {
      "ERC20SnapshotUpgradeSafe": [
        10784
      ]
    },
    "id": 10785,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 10428,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:82"
      },
      {
        "absolutePath": "contracts/math/SafeMath.sol",
        "file": "../../math/SafeMath.sol",
        "id": 10429,
        "nodeType": "ImportDirective",
        "scope": 10785,
        "sourceUnit": 3153,
        "src": "25:33:82",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/utils/Arrays.sol",
        "file": "../../utils/Arrays.sol",
        "id": 10430,
        "nodeType": "ImportDirective",
        "scope": 10785,
        "sourceUnit": 14023,
        "src": "59:32:82",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/utils/Counters.sol",
        "file": "../../utils/Counters.sol",
        "id": 10431,
        "nodeType": "ImportDirective",
        "scope": 10785,
        "sourceUnit": 14073,
        "src": "92:34:82",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/token/ERC20/ERC20.sol",
        "file": "./ERC20.sol",
        "id": 10432,
        "nodeType": "ImportDirective",
        "scope": 10785,
        "sourceUnit": 10182,
        "src": "127:21:82",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/Initializable.sol",
        "file": "../../Initializable.sol",
        "id": 10433,
        "nodeType": "ImportDirective",
        "scope": 10785,
        "sourceUnit": 1408,
        "src": "149:33:82",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 10435,
              "name": "Initializable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1407,
              "src": "1876:13:82",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Initializable_$1407",
                "typeString": "contract Initializable"
              }
            },
            "id": 10436,
            "nodeType": "InheritanceSpecifier",
            "src": "1876:13:82"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 10437,
              "name": "ERC20UpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 10181,
              "src": "1891:16:82",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC20UpgradeSafe_$10181",
                "typeString": "contract ERC20UpgradeSafe"
              }
            },
            "id": 10438,
            "nodeType": "InheritanceSpecifier",
            "src": "1891:16:82"
          }
        ],
        "contractDependencies": [
          44,
          1407,
          10181,
          10862
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 10434,
          "nodeType": "StructuredDocumentation",
          "src": "184:1645:82",
          "text": "@dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and\ntotal supply at the time are recorded for later access.\n * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting.\nIn naive implementations it's possible to perform a \"double spend\" attack by reusing the same balance from different\naccounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be\nused to create an efficient ERC20 forking mechanism.\n * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a\nsnapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot\nid. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id\nand the account address.\n * ==== Gas Costs\n * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log\nn)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much\nsmaller since identical balances in subsequent snapshots are stored as a single entry.\n * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is\nonly significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent\ntransfers will have normal cost until the next snapshot, and so on."
        },
        "fullyImplemented": true,
        "id": 10784,
        "linearizedBaseContracts": [
          10784,
          10181,
          10862,
          44,
          1407
        ],
        "name": "ERC20SnapshotUpgradeSafe",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 10449,
              "nodeType": "Block",
              "src": "1967:85:82",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 10443,
                      "name": "__Context_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19,
                      "src": "1977:24:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 10444,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1977:26:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10445,
                  "nodeType": "ExpressionStatement",
                  "src": "1977:26:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 10446,
                      "name": "__ERC20Snapshot_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10456,
                      "src": "2013:30:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 10447,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2013:32:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10448,
                  "nodeType": "ExpressionStatement",
                  "src": "2013:32:82"
                }
              ]
            },
            "documentation": null,
            "id": 10450,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 10441,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 10440,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "1955:11:82",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1955:11:82"
              }
            ],
            "name": "__ERC20Snapshot_init",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10439,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1943:2:82"
            },
            "returnParameters": {
              "id": 10442,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1967:0:82"
            },
            "scope": 10784,
            "src": "1914:138:82",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 10455,
              "nodeType": "Block",
              "src": "2121:9:82",
              "statements": []
            },
            "documentation": null,
            "id": 10456,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 10453,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 10452,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "2109:11:82",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2109:11:82"
              }
            ],
            "name": "__ERC20Snapshot_init_unchained",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10451,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2097:2:82"
            },
            "returnParameters": {
              "id": 10454,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2121:0:82"
            },
            "scope": 10784,
            "src": "2058:72:82",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 10459,
            "libraryName": {
              "contractScope": null,
              "id": 10457,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3152,
              "src": "2333:8:82",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$3152",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "2327:27:82",
            "typeName": {
              "id": 10458,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "2346:7:82",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 10463,
            "libraryName": {
              "contractScope": null,
              "id": 10460,
              "name": "Arrays",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 14022,
              "src": "2365:6:82",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Arrays_$14022",
                "typeString": "library Arrays"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "2359:27:82",
            "typeName": {
              "baseType": {
                "id": 10461,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "2376:7:82",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 10462,
              "length": null,
              "nodeType": "ArrayTypeName",
              "src": "2376:9:82",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                "typeString": "uint256[]"
              }
            }
          },
          {
            "id": 10466,
            "libraryName": {
              "contractScope": null,
              "id": 10464,
              "name": "Counters",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 14072,
              "src": "2397:8:82",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Counters_$14072",
                "typeString": "library Counters"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "2391:36:82",
            "typeName": {
              "contractScope": null,
              "id": 10465,
              "name": "Counters.Counter",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 14032,
              "src": "2410:16:82",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Counter_$14032_storage_ptr",
                "typeString": "struct Counters.Counter"
              }
            }
          },
          {
            "canonicalName": "ERC20SnapshotUpgradeSafe.Snapshots",
            "id": 10473,
            "members": [
              {
                "constant": false,
                "id": 10469,
                "mutability": "mutable",
                "name": "ids",
                "nodeType": "VariableDeclaration",
                "overrides": null,
                "scope": 10473,
                "src": "2662:13:82",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                  "typeString": "uint256[]"
                },
                "typeName": {
                  "baseType": {
                    "id": 10467,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2662:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 10468,
                  "length": null,
                  "nodeType": "ArrayTypeName",
                  "src": "2662:9:82",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                    "typeString": "uint256[]"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 10472,
                "mutability": "mutable",
                "name": "values",
                "nodeType": "VariableDeclaration",
                "overrides": null,
                "scope": 10473,
                "src": "2685:16:82",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                  "typeString": "uint256[]"
                },
                "typeName": {
                  "baseType": {
                    "id": 10470,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2685:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 10471,
                  "length": null,
                  "nodeType": "ArrayTypeName",
                  "src": "2685:9:82",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                    "typeString": "uint256[]"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "Snapshots",
            "nodeType": "StructDefinition",
            "scope": 10784,
            "src": "2635:73:82",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 10477,
            "mutability": "mutable",
            "name": "_accountBalanceSnapshots",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 10784,
            "src": "2714:63:82",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Snapshots_$10473_storage_$",
              "typeString": "mapping(address => struct ERC20SnapshotUpgradeSafe.Snapshots)"
            },
            "typeName": {
              "id": 10476,
              "keyType": {
                "id": 10474,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "2723:7:82",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "2714:30:82",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Snapshots_$10473_storage_$",
                "typeString": "mapping(address => struct ERC20SnapshotUpgradeSafe.Snapshots)"
              },
              "valueType": {
                "contractScope": null,
                "id": 10475,
                "name": "Snapshots",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 10473,
                "src": "2734:9:82",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                  "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots"
                }
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 10479,
            "mutability": "mutable",
            "name": "_totalSupplySnapshots",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 10784,
            "src": "2783:39:82",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_struct$_Snapshots_$10473_storage",
              "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots"
            },
            "typeName": {
              "contractScope": null,
              "id": 10478,
              "name": "Snapshots",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 10473,
              "src": "2783:9:82",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 10481,
            "mutability": "mutable",
            "name": "_currentSnapshotId",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 10784,
            "src": "2926:43:82",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_struct$_Counter_$14032_storage",
              "typeString": "struct Counters.Counter"
            },
            "typeName": {
              "contractScope": null,
              "id": 10480,
              "name": "Counters.Counter",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 14032,
              "src": "2926:16:82",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Counter_$14032_storage_ptr",
                "typeString": "struct Counters.Counter"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 10482,
              "nodeType": "StructuredDocumentation",
              "src": "2976:93:82",
              "text": "@dev Emitted by {_snapshot} when a snapshot identified by `id` is created."
            },
            "id": 10486,
            "name": "Snapshot",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 10485,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10484,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "id",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10486,
                  "src": "3089:10:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10483,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3089:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3088:12:82"
            },
            "src": "3074:27:82"
          },
          {
            "body": {
              "id": 10509,
              "nodeType": "Block",
              "src": "4264:166:82",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 10492,
                        "name": "_currentSnapshotId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10481,
                        "src": "4274:18:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$14032_storage",
                          "typeString": "struct Counters.Counter storage ref"
                        }
                      },
                      "id": 10494,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "increment",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 14055,
                      "src": "4274:28:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Counter_$14032_storage_ptr_$returns$__$bound_to$_t_struct$_Counter_$14032_storage_ptr_$",
                        "typeString": "function (struct Counters.Counter storage pointer)"
                      }
                    },
                    "id": 10495,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4274:30:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10496,
                  "nodeType": "ExpressionStatement",
                  "src": "4274:30:82"
                },
                {
                  "assignments": [
                    10498
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 10498,
                      "mutability": "mutable",
                      "name": "currentId",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 10509,
                      "src": "4315:17:82",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 10497,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4315:7:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 10502,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 10499,
                        "name": "_currentSnapshotId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10481,
                        "src": "4335:18:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$14032_storage",
                          "typeString": "struct Counters.Counter storage ref"
                        }
                      },
                      "id": 10500,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "current",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 14043,
                      "src": "4335:26:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Counter_$14032_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Counter_$14032_storage_ptr_$",
                        "typeString": "function (struct Counters.Counter storage pointer) view returns (uint256)"
                      }
                    },
                    "id": 10501,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4335:28:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4315:48:82"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10504,
                        "name": "currentId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10498,
                        "src": "4387:9:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 10503,
                      "name": "Snapshot",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10486,
                      "src": "4378:8:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 10505,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4378:19:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10506,
                  "nodeType": "EmitStatement",
                  "src": "4373:24:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 10507,
                    "name": "currentId",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 10498,
                    "src": "4414:9:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 10491,
                  "id": 10508,
                  "nodeType": "Return",
                  "src": "4407:16:82"
                }
              ]
            },
            "documentation": {
              "id": 10487,
              "nodeType": "StructuredDocumentation",
              "src": "3107:1096:82",
              "text": "@dev Creates a new snapshot and returns its snapshot id.\n     * Emits a {Snapshot} event that contains the same id.\n     * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a\nset of accounts, for example using {AccessControl}, or it may be open to the public.\n     * [WARNING]\n====\nWhile an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking,\nyou must consider that it can potentially be used by attackers in two ways.\n     * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow\nlogarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target\nspecific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs\nsection above.\n     * We haven't measured the actual numbers; if this is something you're interested in please reach out to us.\n===="
            },
            "id": 10510,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_snapshot",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10488,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4226:2:82"
            },
            "returnParameters": {
              "id": 10491,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10490,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10510,
                  "src": "4255:7:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10489,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4255:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4254:9:82"
            },
            "scope": 10784,
            "src": "4208:222:82",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 10538,
              "nodeType": "Block",
              "src": "4625:166:82",
              "statements": [
                {
                  "assignments": [
                    10521,
                    10523
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 10521,
                      "mutability": "mutable",
                      "name": "snapshotted",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 10538,
                      "src": "4636:16:82",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 10520,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "4636:4:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 10523,
                      "mutability": "mutable",
                      "name": "value",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 10538,
                      "src": "4654:13:82",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 10522,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4654:7:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 10530,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10525,
                        "name": "snapshotId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10515,
                        "src": "4680:10:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 10526,
                          "name": "_accountBalanceSnapshots",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10477,
                          "src": "4692:24:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Snapshots_$10473_storage_$",
                            "typeString": "mapping(address => struct ERC20SnapshotUpgradeSafe.Snapshots storage ref)"
                          }
                        },
                        "id": 10528,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 10527,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10513,
                          "src": "4717:7:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4692:33:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Snapshots_$10473_storage",
                          "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage ref"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_struct$_Snapshots_$10473_storage",
                          "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage ref"
                        }
                      ],
                      "id": 10524,
                      "name": "_valueAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10691,
                      "src": "4671:8:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_uint256_$_t_struct$_Snapshots_$10473_storage_ptr_$returns$_t_bool_$_t_uint256_$",
                        "typeString": "function (uint256,struct ERC20SnapshotUpgradeSafe.Snapshots storage pointer) view returns (bool,uint256)"
                      }
                    },
                    "id": 10529,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4671:55:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                      "typeString": "tuple(bool,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4635:91:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "condition": {
                      "argumentTypes": null,
                      "id": 10531,
                      "name": "snapshotted",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10521,
                      "src": "4744:11:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 10534,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10513,
                          "src": "4776:7:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 10533,
                        "name": "balanceOf",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9777,
                        "src": "4766:9:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view returns (uint256)"
                        }
                      },
                      "id": 10535,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4766:18:82",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 10536,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "Conditional",
                    "src": "4744:40:82",
                    "trueExpression": {
                      "argumentTypes": null,
                      "id": 10532,
                      "name": "value",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10523,
                      "src": "4758:5:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 10519,
                  "id": 10537,
                  "nodeType": "Return",
                  "src": "4737:47:82"
                }
              ]
            },
            "documentation": {
              "id": 10511,
              "nodeType": "StructuredDocumentation",
              "src": "4436:96:82",
              "text": "@dev Retrieves the balance of `account` at the time `snapshotId` was created."
            },
            "functionSelector": "4ee2cd7e",
            "id": 10539,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "balanceOfAt",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10516,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10513,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10539,
                  "src": "4558:15:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10512,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4558:7:82",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10515,
                  "mutability": "mutable",
                  "name": "snapshotId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10539,
                  "src": "4575:18:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10514,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4575:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4557:37:82"
            },
            "returnParameters": {
              "id": 10519,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10518,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10539,
                  "src": "4616:7:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10517,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4616:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4615:9:82"
            },
            "scope": 10784,
            "src": "4537:254:82",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 10562,
              "nodeType": "Block",
              "src": "4962:149:82",
              "statements": [
                {
                  "assignments": [
                    10548,
                    10550
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 10548,
                      "mutability": "mutable",
                      "name": "snapshotted",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 10562,
                      "src": "4973:16:82",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 10547,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "4973:4:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 10550,
                      "mutability": "mutable",
                      "name": "value",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 10562,
                      "src": "4991:13:82",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 10549,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4991:7:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 10555,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10552,
                        "name": "snapshotId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10542,
                        "src": "5017:10:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 10553,
                        "name": "_totalSupplySnapshots",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10479,
                        "src": "5029:21:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Snapshots_$10473_storage",
                          "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage ref"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_struct$_Snapshots_$10473_storage",
                          "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage ref"
                        }
                      ],
                      "id": 10551,
                      "name": "_valueAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10691,
                      "src": "5008:8:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_uint256_$_t_struct$_Snapshots_$10473_storage_ptr_$returns$_t_bool_$_t_uint256_$",
                        "typeString": "function (uint256,struct ERC20SnapshotUpgradeSafe.Snapshots storage pointer) view returns (bool,uint256)"
                      }
                    },
                    "id": 10554,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5008:43:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                      "typeString": "tuple(bool,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4972:79:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "condition": {
                      "argumentTypes": null,
                      "id": 10556,
                      "name": "snapshotted",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10548,
                      "src": "5069:11:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 10558,
                        "name": "totalSupply",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9763,
                        "src": "5091:11:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                          "typeString": "function () view returns (uint256)"
                        }
                      },
                      "id": 10559,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5091:13:82",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 10560,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "Conditional",
                    "src": "5069:35:82",
                    "trueExpression": {
                      "argumentTypes": null,
                      "id": 10557,
                      "name": "value",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10550,
                      "src": "5083:5:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 10546,
                  "id": 10561,
                  "nodeType": "Return",
                  "src": "5062:42:82"
                }
              ]
            },
            "documentation": {
              "id": 10540,
              "nodeType": "StructuredDocumentation",
              "src": "4797:88:82",
              "text": "@dev Retrieves the total supply at the time `snapshotId` was created."
            },
            "functionSelector": "981b24d0",
            "id": 10563,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "totalSupplyAt",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10543,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10542,
                  "mutability": "mutable",
                  "name": "snapshotId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10563,
                  "src": "4913:18:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10541,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4913:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4912:20:82"
            },
            "returnParameters": {
              "id": 10546,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10545,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10563,
                  "src": "4953:7:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10544,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4953:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4952:9:82"
            },
            "scope": 10784,
            "src": "4890:221:82",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              9998
            ],
            "body": {
              "id": 10589,
              "nodeType": "Block",
              "src": "5500:124:82",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10574,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10565,
                        "src": "5533:4:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 10573,
                      "name": "_updateAccountSnapshot",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10706,
                      "src": "5510:22:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 10575,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5510:28:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10576,
                  "nodeType": "ExpressionStatement",
                  "src": "5510:28:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10578,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10567,
                        "src": "5571:2:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 10577,
                      "name": "_updateAccountSnapshot",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10706,
                      "src": "5548:22:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 10579,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5548:26:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10580,
                  "nodeType": "ExpressionStatement",
                  "src": "5548:26:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10584,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10565,
                        "src": "5601:4:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 10585,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10567,
                        "src": "5607:2:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 10586,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10569,
                        "src": "5611:5:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 10581,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "5585:5:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ERC20SnapshotUpgradeSafe_$10784",
                          "typeString": "contract super ERC20SnapshotUpgradeSafe"
                        }
                      },
                      "id": 10583,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "_transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 9998,
                      "src": "5585:15:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 10587,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5585:32:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10588,
                  "nodeType": "ExpressionStatement",
                  "src": "5585:32:82"
                }
              ]
            },
            "documentation": null,
            "id": 10590,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_transfer",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 10571,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "5491:8:82"
            },
            "parameters": {
              "id": 10570,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10565,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10590,
                  "src": "5433:12:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10564,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5433:7:82",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10567,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10590,
                  "src": "5447:10:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10566,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5447:7:82",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10569,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10590,
                  "src": "5459:13:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10568,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5459:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5432:41:82"
            },
            "returnParameters": {
              "id": 10572,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5500:0:82"
            },
            "scope": 10784,
            "src": "5414:210:82",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              10053
            ],
            "body": {
              "id": 10612,
              "nodeType": "Block",
              "src": "5703:124:82",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10599,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10592,
                        "src": "5736:7:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 10598,
                      "name": "_updateAccountSnapshot",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10706,
                      "src": "5713:22:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 10600,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5713:31:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10601,
                  "nodeType": "ExpressionStatement",
                  "src": "5713:31:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 10602,
                      "name": "_updateTotalSupplySnapshot",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10716,
                      "src": "5754:26:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 10603,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5754:28:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10604,
                  "nodeType": "ExpressionStatement",
                  "src": "5754:28:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10608,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10592,
                        "src": "5805:7:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 10609,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10594,
                        "src": "5814:5:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 10605,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "5793:5:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ERC20SnapshotUpgradeSafe_$10784",
                          "typeString": "contract super ERC20SnapshotUpgradeSafe"
                        }
                      },
                      "id": 10607,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "_mint",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 10053,
                      "src": "5793:11:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 10610,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5793:27:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10611,
                  "nodeType": "ExpressionStatement",
                  "src": "5793:27:82"
                }
              ]
            },
            "documentation": null,
            "id": 10613,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_mint",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 10596,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "5694:8:82"
            },
            "parameters": {
              "id": 10595,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10592,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10613,
                  "src": "5645:15:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10591,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5645:7:82",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10594,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10613,
                  "src": "5662:13:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10593,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5662:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5644:32:82"
            },
            "returnParameters": {
              "id": 10597,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5703:0:82"
            },
            "scope": 10784,
            "src": "5630:197:82",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              10109
            ],
            "body": {
              "id": 10635,
              "nodeType": "Block",
              "src": "5906:124:82",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10622,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10615,
                        "src": "5939:7:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 10621,
                      "name": "_updateAccountSnapshot",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10706,
                      "src": "5916:22:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 10623,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5916:31:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10624,
                  "nodeType": "ExpressionStatement",
                  "src": "5916:31:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 10625,
                      "name": "_updateTotalSupplySnapshot",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10716,
                      "src": "5957:26:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 10626,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5957:28:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10627,
                  "nodeType": "ExpressionStatement",
                  "src": "5957:28:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10631,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10615,
                        "src": "6008:7:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 10632,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10617,
                        "src": "6017:5:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 10628,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "5996:5:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ERC20SnapshotUpgradeSafe_$10784",
                          "typeString": "contract super ERC20SnapshotUpgradeSafe"
                        }
                      },
                      "id": 10630,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "_burn",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 10109,
                      "src": "5996:11:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 10633,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5996:27:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10634,
                  "nodeType": "ExpressionStatement",
                  "src": "5996:27:82"
                }
              ]
            },
            "documentation": null,
            "id": 10636,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_burn",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 10619,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "5897:8:82"
            },
            "parameters": {
              "id": 10618,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10615,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10636,
                  "src": "5848:15:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10614,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5848:7:82",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10617,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10636,
                  "src": "5865:13:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10616,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5865:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5847:32:82"
            },
            "returnParameters": {
              "id": 10620,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5906:0:82"
            },
            "scope": 10784,
            "src": "5833:197:82",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 10690,
              "nodeType": "Block",
              "src": "6152:1548:82",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 10650,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 10648,
                          "name": "snapshotId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10638,
                          "src": "6170:10:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 10649,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "6183:1:82",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "6170:14:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4552433230536e617073686f743a2069642069732030",
                        "id": 10651,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6186:24:82",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_d85a3cdc203c5cdc6dda93c12cd017145671a0ed9058a16c7aa00b8398a4a8e6",
                          "typeString": "literal_string \"ERC20Snapshot: id is 0\""
                        },
                        "value": "ERC20Snapshot: id is 0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_d85a3cdc203c5cdc6dda93c12cd017145671a0ed9058a16c7aa00b8398a4a8e6",
                          "typeString": "literal_string \"ERC20Snapshot: id is 0\""
                        }
                      ],
                      "id": 10647,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "6162:7:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 10652,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6162:49:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10653,
                  "nodeType": "ExpressionStatement",
                  "src": "6162:49:82"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 10659,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 10655,
                          "name": "snapshotId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10638,
                          "src": "6282:10:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10656,
                              "name": "_currentSnapshotId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10481,
                              "src": "6296:18:82",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Counter_$14032_storage",
                                "typeString": "struct Counters.Counter storage ref"
                              }
                            },
                            "id": 10657,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "current",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 14043,
                            "src": "6296:26:82",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Counter_$14032_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Counter_$14032_storage_ptr_$",
                              "typeString": "function (struct Counters.Counter storage pointer) view returns (uint256)"
                            }
                          },
                          "id": 10658,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6296:28:82",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "6282:42:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4552433230536e617073686f743a206e6f6e6578697374656e74206964",
                        "id": 10660,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6326:31:82",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_031e0835d070e7bbd2c8dcce466eadb8c6b9fd22432b0357ab8c37bd9a385940",
                          "typeString": "literal_string \"ERC20Snapshot: nonexistent id\""
                        },
                        "value": "ERC20Snapshot: nonexistent id"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_031e0835d070e7bbd2c8dcce466eadb8c6b9fd22432b0357ab8c37bd9a385940",
                          "typeString": "literal_string \"ERC20Snapshot: nonexistent id\""
                        }
                      ],
                      "id": 10654,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "6274:7:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 10661,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6274:84:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10662,
                  "nodeType": "ExpressionStatement",
                  "src": "6274:84:82"
                },
                {
                  "assignments": [
                    10664
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 10664,
                      "mutability": "mutable",
                      "name": "index",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 10690,
                      "src": "7481:13:82",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 10663,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "7481:7:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 10670,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10668,
                        "name": "snapshotId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10638,
                        "src": "7526:10:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 10665,
                          "name": "snapshots",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10640,
                          "src": "7497:9:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                            "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage pointer"
                          }
                        },
                        "id": 10666,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "ids",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 10469,
                        "src": "7497:13:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                          "typeString": "uint256[] storage ref"
                        }
                      },
                      "id": 10667,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "findUpperBound",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 14021,
                      "src": "7497:28:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_array$_t_uint256_$dyn_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_array$_t_uint256_$dyn_storage_ptr_$",
                        "typeString": "function (uint256[] storage pointer,uint256) view returns (uint256)"
                      }
                    },
                    "id": 10669,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7497:40:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7481:56:82"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 10675,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 10671,
                      "name": "index",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10664,
                      "src": "7552:5:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 10672,
                          "name": "snapshots",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10640,
                          "src": "7561:9:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                            "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage pointer"
                          }
                        },
                        "id": 10673,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "ids",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 10469,
                        "src": "7561:13:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                          "typeString": "uint256[] storage ref"
                        }
                      },
                      "id": 10674,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "7561:20:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "7552:29:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 10688,
                    "nodeType": "Block",
                    "src": "7631:63:82",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 10681,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7653:4:82",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 10682,
                                  "name": "snapshots",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10640,
                                  "src": "7659:9:82",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                                    "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage pointer"
                                  }
                                },
                                "id": 10683,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "values",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 10472,
                                "src": "7659:16:82",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                  "typeString": "uint256[] storage ref"
                                }
                              },
                              "id": 10685,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 10684,
                                "name": "index",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10664,
                                "src": "7676:5:82",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "7659:23:82",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 10686,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "7652:31:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 10646,
                        "id": 10687,
                        "nodeType": "Return",
                        "src": "7645:38:82"
                      }
                    ]
                  },
                  "id": 10689,
                  "nodeType": "IfStatement",
                  "src": "7548:146:82",
                  "trueBody": {
                    "id": 10680,
                    "nodeType": "Block",
                    "src": "7583:42:82",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "66616c7365",
                              "id": 10676,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7605:5:82",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "false"
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 10677,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7612:1:82",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "id": 10678,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "7604:10:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                            "typeString": "tuple(bool,int_const 0)"
                          }
                        },
                        "functionReturnParameters": 10646,
                        "id": 10679,
                        "nodeType": "Return",
                        "src": "7597:17:82"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 10691,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_valueAt",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10641,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10638,
                  "mutability": "mutable",
                  "name": "snapshotId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10691,
                  "src": "6054:18:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10637,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6054:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10640,
                  "mutability": "mutable",
                  "name": "snapshots",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10691,
                  "src": "6074:27:82",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                    "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 10639,
                    "name": "Snapshots",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 10473,
                    "src": "6074:9:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                      "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6053:49:82"
            },
            "returnParameters": {
              "id": 10646,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10643,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10691,
                  "src": "6133:4:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 10642,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "6133:4:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10645,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10691,
                  "src": "6139:7:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10644,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6139:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6132:15:82"
            },
            "scope": 10784,
            "src": "6036:1664:82",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 10705,
              "nodeType": "Block",
              "src": "7763:87:82",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 10697,
                          "name": "_accountBalanceSnapshots",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10477,
                          "src": "7789:24:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Snapshots_$10473_storage_$",
                            "typeString": "mapping(address => struct ERC20SnapshotUpgradeSafe.Snapshots storage ref)"
                          }
                        },
                        "id": 10699,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 10698,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10693,
                          "src": "7814:7:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "7789:33:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Snapshots_$10473_storage",
                          "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage ref"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 10701,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10693,
                            "src": "7834:7:82",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 10700,
                          "name": "balanceOf",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9777,
                          "src": "7824:9:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                            "typeString": "function (address) view returns (uint256)"
                          }
                        },
                        "id": 10702,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "7824:18:82",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_Snapshots_$10473_storage",
                          "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 10696,
                      "name": "_updateSnapshot",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10754,
                      "src": "7773:15:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Snapshots_$10473_storage_ptr_$_t_uint256_$returns$__$",
                        "typeString": "function (struct ERC20SnapshotUpgradeSafe.Snapshots storage pointer,uint256)"
                      }
                    },
                    "id": 10703,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7773:70:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10704,
                  "nodeType": "ExpressionStatement",
                  "src": "7773:70:82"
                }
              ]
            },
            "documentation": null,
            "id": 10706,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateAccountSnapshot",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10694,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10693,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10706,
                  "src": "7738:15:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10692,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7738:7:82",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7737:17:82"
            },
            "returnParameters": {
              "id": 10695,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7763:0:82"
            },
            "scope": 10784,
            "src": "7706:144:82",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 10715,
              "nodeType": "Block",
              "src": "7902:70:82",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10710,
                        "name": "_totalSupplySnapshots",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10479,
                        "src": "7928:21:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Snapshots_$10473_storage",
                          "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage ref"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 10711,
                          "name": "totalSupply",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9763,
                          "src": "7951:11:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                            "typeString": "function () view returns (uint256)"
                          }
                        },
                        "id": 10712,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "7951:13:82",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_Snapshots_$10473_storage",
                          "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 10709,
                      "name": "_updateSnapshot",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10754,
                      "src": "7912:15:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Snapshots_$10473_storage_ptr_$_t_uint256_$returns$__$",
                        "typeString": "function (struct ERC20SnapshotUpgradeSafe.Snapshots storage pointer,uint256)"
                      }
                    },
                    "id": 10713,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7912:53:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10714,
                  "nodeType": "ExpressionStatement",
                  "src": "7912:53:82"
                }
              ]
            },
            "documentation": null,
            "id": 10716,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateTotalSupplySnapshot",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10707,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7891:2:82"
            },
            "returnParameters": {
              "id": 10708,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7902:0:82"
            },
            "scope": 10784,
            "src": "7856:116:82",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 10753,
              "nodeType": "Block",
              "src": "8062:225:82",
              "statements": [
                {
                  "assignments": [
                    10724
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 10724,
                      "mutability": "mutable",
                      "name": "currentId",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 10753,
                      "src": "8072:17:82",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 10723,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "8072:7:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 10728,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 10725,
                        "name": "_currentSnapshotId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10481,
                        "src": "8092:18:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$14032_storage",
                          "typeString": "struct Counters.Counter storage ref"
                        }
                      },
                      "id": 10726,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "current",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 14043,
                      "src": "8092:26:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Counter_$14032_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Counter_$14032_storage_ptr_$",
                        "typeString": "function (struct Counters.Counter storage pointer) view returns (uint256)"
                      }
                    },
                    "id": 10727,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8092:28:82",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "8072:48:82"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 10734,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 10730,
                            "name": "snapshots",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10718,
                            "src": "8150:9:82",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                              "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage pointer"
                            }
                          },
                          "id": 10731,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "ids",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 10469,
                          "src": "8150:13:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                            "typeString": "uint256[] storage ref"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                            "typeString": "uint256[] storage ref"
                          }
                        ],
                        "id": 10729,
                        "name": "_lastSnapshotId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10779,
                        "src": "8134:15:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_array$_t_uint256_$dyn_storage_ptr_$returns$_t_uint256_$",
                          "typeString": "function (uint256[] storage pointer) view returns (uint256)"
                        }
                      },
                      "id": 10732,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "8134:30:82",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 10733,
                      "name": "currentId",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10724,
                      "src": "8167:9:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "8134:42:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 10752,
                  "nodeType": "IfStatement",
                  "src": "8130:151:82",
                  "trueBody": {
                    "id": 10751,
                    "nodeType": "Block",
                    "src": "8178:103:82",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10740,
                              "name": "currentId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10724,
                              "src": "8211:9:82",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 10735,
                                "name": "snapshots",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10718,
                                "src": "8192:9:82",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                                  "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage pointer"
                                }
                              },
                              "id": 10738,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "ids",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 10469,
                              "src": "8192:13:82",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                "typeString": "uint256[] storage ref"
                              }
                            },
                            "id": 10739,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "push",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "8192:18:82",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_arraypush_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 10741,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8192:29:82",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10742,
                        "nodeType": "ExpressionStatement",
                        "src": "8192:29:82"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10748,
                              "name": "currentValue",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10720,
                              "src": "8257:12:82",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 10743,
                                "name": "snapshots",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10718,
                                "src": "8235:9:82",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                                  "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots storage pointer"
                                }
                              },
                              "id": 10746,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "values",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 10472,
                              "src": "8235:16:82",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                "typeString": "uint256[] storage ref"
                              }
                            },
                            "id": 10747,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "push",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "8235:21:82",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_arraypush_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 10749,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8235:35:82",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10750,
                        "nodeType": "ExpressionStatement",
                        "src": "8235:35:82"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 10754,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateSnapshot",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10721,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10718,
                  "mutability": "mutable",
                  "name": "snapshots",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10754,
                  "src": "8003:27:82",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                    "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 10717,
                    "name": "Snapshots",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 10473,
                    "src": "8003:9:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Snapshots_$10473_storage_ptr",
                      "typeString": "struct ERC20SnapshotUpgradeSafe.Snapshots"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10720,
                  "mutability": "mutable",
                  "name": "currentValue",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10754,
                  "src": "8032:20:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10719,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8032:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8002:51:82"
            },
            "returnParameters": {
              "id": 10722,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8062:0:82"
            },
            "scope": 10784,
            "src": "7978:309:82",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 10778,
              "nodeType": "Block",
              "src": "8372:127:82",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 10765,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 10762,
                        "name": "ids",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10757,
                        "src": "8386:3:82",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[] storage pointer"
                        }
                      },
                      "id": 10763,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "8386:10:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 10764,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "8400:1:82",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "8386:15:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 10776,
                    "nodeType": "Block",
                    "src": "8442:51:82",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 10769,
                            "name": "ids",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10757,
                            "src": "8463:3:82",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                              "typeString": "uint256[] storage pointer"
                            }
                          },
                          "id": 10774,
                          "indexExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 10773,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 10770,
                                "name": "ids",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10757,
                                "src": "8467:3:82",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                  "typeString": "uint256[] storage pointer"
                                }
                              },
                              "id": 10771,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "length",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "8467:10:82",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "-",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 10772,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8480:1:82",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1_by_1",
                                "typeString": "int_const 1"
                              },
                              "value": "1"
                            },
                            "src": "8467:14:82",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "8463:19:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 10761,
                        "id": 10775,
                        "nodeType": "Return",
                        "src": "8456:26:82"
                      }
                    ]
                  },
                  "id": 10777,
                  "nodeType": "IfStatement",
                  "src": "8382:111:82",
                  "trueBody": {
                    "id": 10768,
                    "nodeType": "Block",
                    "src": "8403:33:82",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 10766,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "8424:1:82",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "functionReturnParameters": 10761,
                        "id": 10767,
                        "nodeType": "Return",
                        "src": "8417:8:82"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 10779,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_lastSnapshotId",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10758,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10757,
                  "mutability": "mutable",
                  "name": "ids",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10779,
                  "src": "8318:21:82",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 10755,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "8318:7:82",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 10756,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "8318:9:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8317:23:82"
            },
            "returnParameters": {
              "id": 10761,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10760,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10779,
                  "src": "8363:7:82",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10759,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8363:7:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8362:9:82"
            },
            "scope": 10784,
            "src": "8293:206:82",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 10783,
            "mutability": "mutable",
            "name": "__gap",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 10784,
            "src": "8505:25:82",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$46_storage",
              "typeString": "uint256[46]"
            },
            "typeName": {
              "baseType": {
                "id": 10780,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "8505:7:82",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 10782,
              "length": {
                "argumentTypes": null,
                "hexValue": "3436",
                "id": 10781,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "8513:2:82",
                "subdenomination": null,
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_46_by_1",
                  "typeString": "int_const 46"
                },
                "value": "46"
              },
              "nodeType": "ArrayTypeName",
              "src": "8505:11:82",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$46_storage_ptr",
                "typeString": "uint256[46]"
              }
            },
            "value": null,
            "visibility": "private"
          }
        ],
        "scope": 10785,
        "src": "1830:6703:82"
      }
    ],
    "src": "0:8534:82"
  },
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "compiler": {
    "name": "solc",
    "version": "0.6.7+commit.b8d736ae.Emscripten.clang",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "evmVersion": "petersburg"
  }
}
