{ "contractName": "Counters", "abi": [], "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"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\":\"london\",\"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": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209c37a22096dfabcd60bf04148ba116a5b8e68a87d89f97e1d8f0e19469871ce064736f6c634300080a0033", "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209c37a22096dfabcd60bf04148ba116a5b8e68a87d89f97e1d8f0e19469871ce064736f6c634300080a0033", "immutableReferences": {}, "generatedSources": [], "deployedGeneratedSources": [], "sourceMap": "424:971:31:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", "deployedSourceMap": "424:971:31:-: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": [ 6544 ] }, "id": 6545, "license": "MIT", "nodeType": "SourceUnit", "nodes": [ { "id": 6472, "literals": [ "solidity", "^", "0.8", ".0" ], "nodeType": "PragmaDirective", "src": "87:23:31" }, { "abstract": false, "baseContracts": [], "canonicalName": "Counters", "contractDependencies": [], "contractKind": "library", "documentation": { "id": 6473, "nodeType": "StructuredDocumentation", "src": "112:311:31", "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": 6544, "linearizedBaseContracts": [ 6544 ], "name": "Counters", "nameLocation": "432:8:31", "nodeType": "ContractDefinition", "nodes": [ { "canonicalName": "Counters.Counter", "id": 6476, "members": [ { "constant": false, "id": 6475, "mutability": "mutable", "name": "_value", "nameLocation": "794:6:31", "nodeType": "VariableDeclaration", "scope": 6476, "src": "786:14:31", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 6474, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "786:7:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "visibility": "internal" } ], "name": "Counter", "nameLocation": "454:7:31", "nodeType": "StructDefinition", "scope": 6544, "src": "447:374:31", "visibility": "public" }, { "body": { "id": 6487, "nodeType": "Block", "src": "901:38:31", "statements": [ { "expression": { "expression": { "id": 6484, "name": "counter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 6479, "src": "918:7:31", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter storage pointer" } }, "id": 6485, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberName": "_value", "nodeType": "MemberAccess", "referencedDeclaration": 6475, "src": "918:14:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "functionReturnParameters": 6483, "id": 6486, "nodeType": "Return", "src": "911:21:31" } ] }, "id": 6488, "implemented": true, "kind": "function", "modifiers": [], "name": "current", "nameLocation": "836:7:31", "nodeType": "FunctionDefinition", "parameters": { "id": 6480, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 6479, "mutability": "mutable", "name": "counter", "nameLocation": "860:7:31", "nodeType": "VariableDeclaration", "scope": 6488, "src": "844:23:31", "stateVariable": false, "storageLocation": "storage", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter" }, "typeName": { "id": 6478, "nodeType": "UserDefinedTypeName", "pathNode": { "id": 6477, "name": "Counter", "nodeType": "IdentifierPath", "referencedDeclaration": 6476, "src": "844:7:31" }, "referencedDeclaration": 6476, "src": "844:7:31", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter" } }, "visibility": "internal" } ], "src": "843:25:31" }, "returnParameters": { "id": 6483, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 6482, "mutability": "mutable", "name": "", "nameLocation": "-1:-1:-1", "nodeType": "VariableDeclaration", "scope": 6488, "src": "892:7:31", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 6481, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "892:7:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "visibility": "internal" } ], "src": "891:9:31" }, "scope": 6544, "src": "827:112:31", "stateMutability": "view", "virtual": false, "visibility": "internal" }, { "body": { "id": 6501, "nodeType": "Block", "src": "998:70:31", "statements": [ { "id": 6500, "nodeType": "UncheckedBlock", "src": "1008:54:31", "statements": [ { "expression": { "id": 6498, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": { "expression": { "id": 6494, "name": "counter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 6491, "src": "1032:7:31", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter storage pointer" } }, "id": 6496, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberName": "_value", "nodeType": "MemberAccess", "referencedDeclaration": 6475, "src": "1032:14:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "Assignment", "operator": "+=", "rightHandSide": { "hexValue": "31", "id": 6497, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1050:1:31", "typeDescriptions": { "typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1" }, "value": "1" }, "src": "1032:19:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "id": 6499, "nodeType": "ExpressionStatement", "src": "1032:19:31" } ] } ] }, "id": 6502, "implemented": true, "kind": "function", "modifiers": [], "name": "increment", "nameLocation": "954:9:31", "nodeType": "FunctionDefinition", "parameters": { "id": 6492, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 6491, "mutability": "mutable", "name": "counter", "nameLocation": "980:7:31", "nodeType": "VariableDeclaration", "scope": 6502, "src": "964:23:31", "stateVariable": false, "storageLocation": "storage", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter" }, "typeName": { "id": 6490, "nodeType": "UserDefinedTypeName", "pathNode": { "id": 6489, "name": "Counter", "nodeType": "IdentifierPath", "referencedDeclaration": 6476, "src": "964:7:31" }, "referencedDeclaration": 6476, "src": "964:7:31", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter" } }, "visibility": "internal" } ], "src": "963:25:31" }, "returnParameters": { "id": 6493, "nodeType": "ParameterList", "parameters": [], "src": "998:0:31" }, "scope": 6544, "src": "945:123:31", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal" }, { "body": { "id": 6529, "nodeType": "Block", "src": "1127:176:31", "statements": [ { "assignments": [ 6509 ], "declarations": [ { "constant": false, "id": 6509, "mutability": "mutable", "name": "value", "nameLocation": "1145:5:31", "nodeType": "VariableDeclaration", "scope": 6529, "src": "1137:13:31", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 6508, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "1137:7:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "visibility": "internal" } ], "id": 6512, "initialValue": { "expression": { "id": 6510, "name": "counter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 6505, "src": "1153:7:31", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter storage pointer" } }, "id": 6511, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberName": "_value", "nodeType": "MemberAccess", "referencedDeclaration": 6475, "src": "1153:14:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "VariableDeclarationStatement", "src": "1137:30:31" }, { "expression": { "arguments": [ { "commonType": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "id": 6516, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { "id": 6514, "name": "value", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 6509, "src": "1185:5:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "BinaryOperation", "operator": ">", "rightExpression": { "hexValue": "30", "id": 6515, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1193:1:31", "typeDescriptions": { "typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0" }, "value": "0" }, "src": "1185:9:31", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, { "hexValue": "436f756e7465723a2064656372656d656e74206f766572666c6f77", "id": 6517, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "1196:29:31", "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": 6513, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [ 4294967278, 4294967278 ], "referencedDeclaration": 4294967278, "src": "1177:7:31", "typeDescriptions": { "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", "typeString": "function (bool,string memory) pure" } }, "id": 6518, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "1177:49:31", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, "id": 6519, "nodeType": "ExpressionStatement", "src": "1177:49:31" }, { "id": 6528, "nodeType": "UncheckedBlock", "src": "1236:61:31", "statements": [ { "expression": { "id": 6526, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": { "expression": { "id": 6520, "name": "counter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 6505, "src": "1260:7:31", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter storage pointer" } }, "id": 6522, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberName": "_value", "nodeType": "MemberAccess", "referencedDeclaration": 6475, "src": "1260:14:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "Assignment", "operator": "=", "rightHandSide": { "commonType": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "id": 6525, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { "id": 6523, "name": "value", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 6509, "src": "1277:5:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "BinaryOperation", "operator": "-", "rightExpression": { "hexValue": "31", "id": 6524, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1285:1:31", "typeDescriptions": { "typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1" }, "value": "1" }, "src": "1277:9:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "src": "1260:26:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "id": 6527, "nodeType": "ExpressionStatement", "src": "1260:26:31" } ] } ] }, "id": 6530, "implemented": true, "kind": "function", "modifiers": [], "name": "decrement", "nameLocation": "1083:9:31", "nodeType": "FunctionDefinition", "parameters": { "id": 6506, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 6505, "mutability": "mutable", "name": "counter", "nameLocation": "1109:7:31", "nodeType": "VariableDeclaration", "scope": 6530, "src": "1093:23:31", "stateVariable": false, "storageLocation": "storage", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter" }, "typeName": { "id": 6504, "nodeType": "UserDefinedTypeName", "pathNode": { "id": 6503, "name": "Counter", "nodeType": "IdentifierPath", "referencedDeclaration": 6476, "src": "1093:7:31" }, "referencedDeclaration": 6476, "src": "1093:7:31", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter" } }, "visibility": "internal" } ], "src": "1092:25:31" }, "returnParameters": { "id": 6507, "nodeType": "ParameterList", "parameters": [], "src": "1127:0:31" }, "scope": 6544, "src": "1074:229:31", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal" }, { "body": { "id": 6542, "nodeType": "Block", "src": "1358:35:31", "statements": [ { "expression": { "id": 6540, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": { "expression": { "id": 6536, "name": "counter", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 6533, "src": "1368:7:31", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter storage pointer" } }, "id": 6538, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "memberName": "_value", "nodeType": "MemberAccess", "referencedDeclaration": 6475, "src": "1368:14:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "Assignment", "operator": "=", "rightHandSide": { "hexValue": "30", "id": 6539, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1385:1:31", "typeDescriptions": { "typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0" }, "value": "0" }, "src": "1368:18:31", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "id": 6541, "nodeType": "ExpressionStatement", "src": "1368:18:31" } ] }, "id": 6543, "implemented": true, "kind": "function", "modifiers": [], "name": "reset", "nameLocation": "1318:5:31", "nodeType": "FunctionDefinition", "parameters": { "id": 6534, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 6533, "mutability": "mutable", "name": "counter", "nameLocation": "1340:7:31", "nodeType": "VariableDeclaration", "scope": 6543, "src": "1324:23:31", "stateVariable": false, "storageLocation": "storage", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter" }, "typeName": { "id": 6532, "nodeType": "UserDefinedTypeName", "pathNode": { "id": 6531, "name": "Counter", "nodeType": "IdentifierPath", "referencedDeclaration": 6476, "src": "1324:7:31" }, "referencedDeclaration": 6476, "src": "1324:7:31", "typeDescriptions": { "typeIdentifier": "t_struct$_Counter_$6476_storage_ptr", "typeString": "struct Counters.Counter" } }, "visibility": "internal" } ], "src": "1323:25:31" }, "returnParameters": { "id": 6535, "nodeType": "ParameterList", "parameters": [], "src": "1358:0:31" }, "scope": 6544, "src": "1309:84:31", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal" } ], "scope": 6545, "src": "424:971:31", "usedErrors": [] } ], "src": "87:1309:31" }, "compiler": { "name": "solc", "version": "0.8.10+commit.fc410830.Emscripten.clang" }, "networks": {}, "schemaVersion": "3.4.14", "updatedAt": "2023-07-12T06:52:15.342Z", "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 } }