{ "contractName": "Counters", "abi": [], "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Matt Condon (@shrugs)\",\"details\":\"Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number of elements in a mapping, issuing ERC721 ids, or counting request ids. Include with `using Counters for Counters.Counter;`\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Counters\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Counters.sol\":\"Counters\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]}},\"version\":1}", "bytecode": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220f4830d7f86e1ab2f8303d17696b97e631053fd399cf240c2d50ef4c88fdba17564736f6c63430008130033", "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220f4830d7f86e1ab2f8303d17696b97e631053fd399cf240c2d50ef4c88fdba17564736f6c63430008130033", "immutableReferences": {}, "generatedSources": [], "deployedGeneratedSources": [], "sourceMap": "424:971:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", "deployedSourceMap": "424:971:7:-:0;;;;;;;;", "source": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n", "sourcePath": "@openzeppelin/contracts/utils/Counters.sol", "ast": { "absolutePath": "@openzeppelin/contracts/utils/Counters.sol", "exportedSymbols": { "Counters": [ 1560 ] }, "id": 1561, "license": "MIT", "nodeType": "SourceUnit", "nodes": [ { "id": 1488, "literals": [ "solidity", "^", "0.8", ".0" ], "nodeType": "PragmaDirective", "src": "87:23:7" }, { "abstract": false, "baseContracts": [], "canonicalName": "Counters", "contractDependencies": [], "contractKind": "library", "documentation": { "id": 1489, "nodeType": "StructuredDocumentation", "src": "112:311:7", "text": " @title Counters\n @author Matt Condon (@shrugs)\n @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n of elements in a mapping, issuing ERC721 ids, or counting request ids.\n Include with `using Counters for Counters.Counter;`" }, "fullyImplemented": true, "id": 1560, "linearizedBaseContracts": [ 1560 ], "name": "Counters", "nameLocation": "432:8:7", "nodeType": "ContractDefinition", "nodes": [ { "canonicalName": "Counters.Counter", "id": 1492, "members": [ { "constant": false, "id": 1491, "mutability": "mutable", "name": "_value", "nameLocation": "794:6:7", "nodeType": "VariableDeclaration", "scope": 1492, "src": "786:14:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 1490, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "786:7:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "visibility": "internal" } ], "name": "Counter", "nameLocation": "454:7:7", "nodeType": "StructDefinition", "scope": 1560, "src": "447:374:7", "visibility": "public" }, { "body": { "id": 1503, "nodeType": "Block", "src": "901:38:7", "statements": [ { "expression": { "expression": { "id": 1500, "name": "counter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1495, "src": "918:7:7", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter storage pointer" } }, "id": 1501, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "926:6:7", "memberName": "_value", "nodeType": "MemberAccess", "referencedDeclaration": 1491, "src": "918:14:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "functionReturnParameters": 1499, "id": 1502, "nodeType": "Return", "src": "911:21:7" } ] }, "id": 1504, "implemented": true, "kind": "function", "modifiers": [], "name": "current", "nameLocation": "836:7:7", "nodeType": "FunctionDefinition", "parameters": { "id": 1496, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 1495, "mutability": "mutable", "name": "counter", "nameLocation": "860:7:7", "nodeType": "VariableDeclaration", "scope": 1504, "src": "844:23:7", "stateVariable": false, "storageLocation": "storage", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter" }, "typeName": { "id": 1494, "nodeType": "UserDefinedTypeName", "pathNode": { "id": 1493, "name": "Counter", "nameLocations": [ "844:7:7" ], "nodeType": "IdentifierPath", "referencedDeclaration": 1492, "src": "844:7:7" }, "referencedDeclaration": 1492, "src": "844:7:7", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter" } }, "visibility": "internal" } ], "src": "843:25:7" }, "returnParameters": { "id": 1499, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 1498, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 1504, "src": "892:7:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 1497, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "892:7:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "visibility": "internal" } ], "src": "891:9:7" }, "scope": 1560, "src": "827:112:7", "stateMutability": "view", "virtual": false, "visibility": "internal" }, { "body": { "id": 1517, "nodeType": "Block", "src": "998:70:7", "statements": [ { "id": 1516, "nodeType": "UncheckedBlock", "src": "1008:54:7", "statements": [ { "expression": { "id": 1514, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": { "expression": { "id": 1510, "name": "counter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1507, "src": "1032:7:7", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter storage pointer" } }, "id": 1512, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "1040:6:7", "memberName": "_value", "nodeType": "MemberAccess", "referencedDeclaration": 1491, "src": "1032:14:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "Assignment", "operator": "+=", "rightHandSide": { "hexValue": "31", "id": 1513, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1050:1:7", "typeDescriptions": { "typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1" }, "value": "1" }, "src": "1032:19:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "id": 1515, "nodeType": "ExpressionStatement", "src": "1032:19:7" } ] } ] }, "id": 1518, "implemented": true, "kind": "function", "modifiers": [], "name": "increment", "nameLocation": "954:9:7", "nodeType": "FunctionDefinition", "parameters": { "id": 1508, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 1507, "mutability": "mutable", "name": "counter", "nameLocation": "980:7:7", "nodeType": "VariableDeclaration", "scope": 1518, "src": "964:23:7", "stateVariable": false, "storageLocation": "storage", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter" }, "typeName": { "id": 1506, "nodeType": "UserDefinedTypeName", "pathNode": { "id": 1505, "name": "Counter", "nameLocations": [ "964:7:7" ], "nodeType": "IdentifierPath", "referencedDeclaration": 1492, "src": "964:7:7" }, "referencedDeclaration": 1492, "src": "964:7:7", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter" } }, "visibility": "internal" } ], "src": "963:25:7" }, "returnParameters": { "id": 1509, "nodeType": "ParameterList", "parameters": [], "src": "998:0:7" }, "scope": 1560, "src": "945:123:7", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal" }, { "body": { "id": 1545, "nodeType": "Block", "src": "1127:176:7", "statements": [ { "assignments": [ 1525 ], "declarations": [ { "constant": false, "id": 1525, "mutability": "mutable", "name": "value", "nameLocation": "1145:5:7", "nodeType": "VariableDeclaration", "scope": 1545, "src": "1137:13:7", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 1524, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1137:7:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "visibility": "internal" } ], "id": 1528, "initialValue": { "expression": { "id": 1526, "name": "counter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1521, "src": "1153:7:7", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter storage pointer" } }, "id": 1527, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberLocation": "1161:6:7", "memberName": "_value", "nodeType": "MemberAccess", "referencedDeclaration": 1491, "src": "1153:14:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "VariableDeclarationStatement", "src": "1137:30:7" }, { "expression": { "arguments": [ { "commonType": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "id": 1532, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { "id": 1530, "name": "value", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1525, "src": "1185:5:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": { "hexValue": "30", "id": 1531, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1193:1:7", "typeDescriptions": { "typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0" }, "value": "0" }, "src": "1185:9:7", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, { "hexValue": "436f756e7465723a2064656372656d656e74206f766572666c6f77", "id": 1533, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "1196:29:7", "typeDescriptions": { "typeIdentifier": "t_stringliteral_1dfd0d5389474d871b8e8929aab9d4def041f55f90f625754fb5f9a9ba08af6f", "typeString": "literal_string \"Counter: decrement overflow\"" }, "value": "Counter: decrement overflow" } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_bool", "typeString": "bool" }, { "typeIdentifier": "t_stringliteral_1dfd0d5389474d871b8e8929aab9d4def041f55f90f625754fb5f9a9ba08af6f", "typeString": "literal_string \"Counter: decrement overflow\"" } ], "id": 1529, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [ 4294967278, 4294967278 ], "referencedDeclaration": 4294967278, "src": "1177:7:7", "typeDescriptions": { "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", "typeString": "function (bool,string memory) pure" } }, "id": 1534, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "nameLocations": [], "names": [], "nodeType": "FunctionCall", "src": "1177:49:7", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, "id": 1535, "nodeType": "ExpressionStatement", "src": "1177:49:7" }, { "id": 1544, "nodeType": "UncheckedBlock", "src": "1236:61:7", "statements": [ { "expression": { "id": 1542, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": { "expression": { "id": 1536, "name": "counter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1521, "src": "1260:7:7", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter storage pointer" } }, "id": 1538, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "1268:6:7", "memberName": "_value", "nodeType": "MemberAccess", "referencedDeclaration": 1491, "src": "1260:14:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "Assignment", "operator": "=", "rightHandSide": { "commonType": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "id": 1541, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { "id": 1539, "name": "value", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1525, "src": "1277:5:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": { "hexValue": "31", "id": 1540, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1285:1:7", "typeDescriptions": { "typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1" }, "value": "1" }, "src": "1277:9:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "src": "1260:26:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "id": 1543, "nodeType": "ExpressionStatement", "src": "1260:26:7" } ] } ] }, "id": 1546, "implemented": true, "kind": "function", "modifiers": [], "name": "decrement", "nameLocation": "1083:9:7", "nodeType": "FunctionDefinition", "parameters": { "id": 1522, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 1521, "mutability": "mutable", "name": "counter", "nameLocation": "1109:7:7", "nodeType": "VariableDeclaration", "scope": 1546, "src": "1093:23:7", "stateVariable": false, "storageLocation": "storage", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter" }, "typeName": { "id": 1520, "nodeType": "UserDefinedTypeName", "pathNode": { "id": 1519, "name": "Counter", "nameLocations": [ "1093:7:7" ], "nodeType": "IdentifierPath", "referencedDeclaration": 1492, "src": "1093:7:7" }, "referencedDeclaration": 1492, "src": "1093:7:7", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter" } }, "visibility": "internal" } ], "src": "1092:25:7" }, "returnParameters": { "id": 1523, "nodeType": "ParameterList", "parameters": [], "src": "1127:0:7" }, "scope": 1560, "src": "1074:229:7", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal" }, { "body": { "id": 1558, "nodeType": "Block", "src": "1358:35:7", "statements": [ { "expression": { "id": 1556, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": { "expression": { "id": 1552, "name": "counter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1549, "src": "1368:7:7", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter storage pointer" } }, "id": 1554, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberLocation": "1376:6:7", "memberName": "_value", "nodeType": "MemberAccess", "referencedDeclaration": 1491, "src": "1368:14:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "Assignment", "operator": "=", "rightHandSide": { "hexValue": "30", "id": 1555, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1385:1:7", "typeDescriptions": { "typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0" }, "value": "0" }, "src": "1368:18:7", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "id": 1557, "nodeType": "ExpressionStatement", "src": "1368:18:7" } ] }, "id": 1559, "implemented": true, "kind": "function", "modifiers": [], "name": "reset", "nameLocation": "1318:5:7", "nodeType": "FunctionDefinition", "parameters": { "id": 1550, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 1549, "mutability": "mutable", "name": "counter", "nameLocation": "1340:7:7", "nodeType": "VariableDeclaration", "scope": 1559, "src": "1324:23:7", "stateVariable": false, "storageLocation": "storage", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter" }, "typeName": { "id": 1548, "nodeType": "UserDefinedTypeName", "pathNode": { "id": 1547, "name": "Counter", "nameLocations": [ "1324:7:7" ], "nodeType": "IdentifierPath", "referencedDeclaration": 1492, "src": "1324:7:7" }, "referencedDeclaration": 1492, "src": "1324:7:7", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$1492_storage_ptr", "typeString": "struct Counters.Counter" } }, "visibility": "internal" } ], "src": "1323:25:7" }, "returnParameters": { "id": 1551, "nodeType": "ParameterList", "parameters": [], "src": "1358:0:7" }, "scope": 1560, "src": "1309:84:7", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal" } ], "scope": 1561, "src": "424:971:7", "usedErrors": [] } ], "src": "87:1309:7" }, "compiler": { "name": "solc", "version": "0.8.19+commit.7dd6d404.Emscripten.clang" }, "networks": {}, "schemaVersion": "3.4.13", "updatedAt": "2023-06-04T09:28:33.986Z", "devdoc": { "author": "Matt Condon (@shrugs)", "details": "Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number of elements in a mapping, issuing ERC721 ids, or counting request ids. Include with `using Counters for Counters.Counter;`", "kind": "dev", "methods": {}, "title": "Counters", "version": 1 }, "userdoc": { "kind": "user", "methods": {}, "version": 1 } }