{
  "contractName": "Roles",
  "abi": [],
  "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library for managing addresses assigned to a Role.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Roles\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/roles/Roles.sol\":\"Roles\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"project:/contracts/roles/Roles.sol\":{\"keccak256\":\"0x9e018cafd4e2a2890d4ed32f0a4e5edf92fe95000f35b15d7932890bd0efdb95\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6c07fd269689b662d782817bc4fdfc00d33fd7e320c20916528fff7853847954\",\"dweb:/ipfs/QmUz39kdgQM8M2W2gcBZ8Vi3mzzSmXUx9NXxTJatYYQJyw\"]}},\"version\":1}",
  "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220760d1dfd623627d2afcf2f9d2746793d64fee70e47712c8a58099d26a8c0e72964736f6c63430008110033",
  "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220760d1dfd623627d2afcf2f9d2746793d64fee70e47712c8a58099d26a8c0e72964736f6c63430008110033",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "145:872:50:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;145:872:50;;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "145:872:50:-:0;;;;;;;;",
  "source": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity ^0.8.0;\n\n/**\n * @title Roles\n * @dev Library for managing addresses assigned to a Role.\n */\nlibrary Roles {\n    struct Role {\n        mapping(address => bool) bearer;\n    }\n\n    /**\n     * @dev Give an account access to this role.\n     */\n    function add(Role storage role, address account) internal {\n        require(!has(role, account), 'Roles: account already has role');\n        role.bearer[account] = true;\n    }\n\n    /**\n     * @dev Remove an account's access to this role.\n     */\n    function remove(Role storage role, address account) internal {\n        require(has(role, account), 'Roles: account does not have role');\n        role.bearer[account] = false;\n    }\n\n    /**\n     * @dev Check if an account has this role.\n     * @return bool\n     */\n    function has(Role storage role, address account) internal view returns (bool) {\n        require(account != address(0), 'Roles: account is the zero address');\n        return role.bearer[account];\n    }\n}\n",
  "sourcePath": "/home/webxpert/workspace/shipfinex/latest-repos/tokenx_smartcontract/contracts/roles/Roles.sol",
  "ast": {
    "absolutePath": "project:/contracts/roles/Roles.sol",
    "exportedSymbols": {
      "Roles": [
        11901
      ]
    },
    "id": 11902,
    "license": "GPL-3.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 11814,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "37:23:50"
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "Roles",
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": {
          "id": 11815,
          "nodeType": "StructuredDocumentation",
          "src": "62:82:50",
          "text": " @title Roles\n @dev Library for managing addresses assigned to a Role."
        },
        "fullyImplemented": true,
        "id": 11901,
        "linearizedBaseContracts": [
          11901
        ],
        "name": "Roles",
        "nameLocation": "153:5:50",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "canonicalName": "Roles.Role",
            "id": 11820,
            "members": [
              {
                "constant": false,
                "id": 11819,
                "mutability": "mutable",
                "name": "bearer",
                "nameLocation": "212:6:50",
                "nodeType": "VariableDeclaration",
                "scope": 11820,
                "src": "187:31:50",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                  "typeString": "mapping(address => bool)"
                },
                "typeName": {
                  "id": 11818,
                  "keyType": {
                    "id": 11816,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "195:7:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "Mapping",
                  "src": "187:24:50",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                    "typeString": "mapping(address => bool)"
                  },
                  "valueType": {
                    "id": 11817,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "206:4:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "Role",
            "nameLocation": "172:4:50",
            "nodeType": "StructDefinition",
            "scope": 11901,
            "src": "165:60:50",
            "visibility": "public"
          },
          {
            "body": {
              "id": 11846,
              "nodeType": "Block",
              "src": "354:117:50",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 11834,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "UnaryOperation",
                        "operator": "!",
                        "prefix": true,
                        "src": "372:19:50",
                        "subExpression": {
                          "arguments": [
                            {
                              "id": 11831,
                              "name": "role",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11824,
                              "src": "377:4:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                                "typeString": "struct Roles.Role storage pointer"
                              }
                            },
                            {
                              "id": 11832,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11826,
                              "src": "383:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                                "typeString": "struct Roles.Role storage pointer"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 11830,
                            "name": "has",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11900,
                            "src": "373:3:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$11820_storage_ptr_$_t_address_$returns$_t_bool_$",
                              "typeString": "function (struct Roles.Role storage pointer,address) view returns (bool)"
                            }
                          },
                          "id": 11833,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "373:18:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "526f6c65733a206163636f756e7420616c72656164792068617320726f6c65",
                        "id": 11835,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "393:33:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0f76c3a3e97a37fcdff532c2741c10933ebf2b769d5475388e30ae4f7155f13a",
                          "typeString": "literal_string \"Roles: account already has role\""
                        },
                        "value": "Roles: account already has role"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0f76c3a3e97a37fcdff532c2741c10933ebf2b769d5475388e30ae4f7155f13a",
                          "typeString": "literal_string \"Roles: account already has role\""
                        }
                      ],
                      "id": 11829,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "364:7:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 11836,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "364:63:50",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 11837,
                  "nodeType": "ExpressionStatement",
                  "src": "364:63:50"
                },
                {
                  "expression": {
                    "id": 11844,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "expression": {
                          "id": 11838,
                          "name": "role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11824,
                          "src": "437:4:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                            "typeString": "struct Roles.Role storage pointer"
                          }
                        },
                        "id": 11841,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "442:6:50",
                        "memberName": "bearer",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 11819,
                        "src": "437:11:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 11842,
                      "indexExpression": {
                        "id": 11840,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11826,
                        "src": "449:7:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "437:20:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "74727565",
                      "id": 11843,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "460:4:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "437:27:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 11845,
                  "nodeType": "ExpressionStatement",
                  "src": "437:27:50"
                }
              ]
            },
            "documentation": {
              "id": 11821,
              "nodeType": "StructuredDocumentation",
              "src": "231:60:50",
              "text": " @dev Give an account access to this role."
            },
            "id": 11847,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "add",
            "nameLocation": "305:3:50",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 11827,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11824,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "322:4:50",
                  "nodeType": "VariableDeclaration",
                  "scope": 11847,
                  "src": "309:17:50",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                    "typeString": "struct Roles.Role"
                  },
                  "typeName": {
                    "id": 11823,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 11822,
                      "name": "Role",
                      "nameLocations": [
                        "309:4:50"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 11820,
                      "src": "309:4:50"
                    },
                    "referencedDeclaration": 11820,
                    "src": "309:4:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                      "typeString": "struct Roles.Role"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11826,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "336:7:50",
                  "nodeType": "VariableDeclaration",
                  "scope": 11847,
                  "src": "328:15:50",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11825,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "328:7:50",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "308:36:50"
            },
            "returnParameters": {
              "id": 11828,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "354:0:50"
            },
            "scope": 11901,
            "src": "296:175:50",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 11872,
              "nodeType": "Block",
              "src": "607:119:50",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 11858,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11851,
                            "src": "629:4:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                              "typeString": "struct Roles.Role storage pointer"
                            }
                          },
                          {
                            "id": 11859,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11853,
                            "src": "635:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                              "typeString": "struct Roles.Role storage pointer"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 11857,
                          "name": "has",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11900,
                          "src": "625:3:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$11820_storage_ptr_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (struct Roles.Role storage pointer,address) view returns (bool)"
                          }
                        },
                        "id": 11860,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "625:18:50",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65",
                        "id": 11861,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "645:35:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_7bd893145ac435f339bb7c288622d270324b7033b011f693aca172f5cbc3c257",
                          "typeString": "literal_string \"Roles: account does not have role\""
                        },
                        "value": "Roles: account does not have role"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_7bd893145ac435f339bb7c288622d270324b7033b011f693aca172f5cbc3c257",
                          "typeString": "literal_string \"Roles: account does not have role\""
                        }
                      ],
                      "id": 11856,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "617:7:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 11862,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "617:64:50",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 11863,
                  "nodeType": "ExpressionStatement",
                  "src": "617:64:50"
                },
                {
                  "expression": {
                    "id": 11870,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "expression": {
                          "id": 11864,
                          "name": "role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11851,
                          "src": "691:4:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                            "typeString": "struct Roles.Role storage pointer"
                          }
                        },
                        "id": 11867,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "696:6:50",
                        "memberName": "bearer",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 11819,
                        "src": "691:11:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 11868,
                      "indexExpression": {
                        "id": 11866,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11853,
                        "src": "703:7:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "691:20:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "66616c7365",
                      "id": 11869,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "714:5:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "691:28:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 11871,
                  "nodeType": "ExpressionStatement",
                  "src": "691:28:50"
                }
              ]
            },
            "documentation": {
              "id": 11848,
              "nodeType": "StructuredDocumentation",
              "src": "477:64:50",
              "text": " @dev Remove an account's access to this role."
            },
            "id": 11873,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "remove",
            "nameLocation": "555:6:50",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 11854,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11851,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "575:4:50",
                  "nodeType": "VariableDeclaration",
                  "scope": 11873,
                  "src": "562:17:50",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                    "typeString": "struct Roles.Role"
                  },
                  "typeName": {
                    "id": 11850,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 11849,
                      "name": "Role",
                      "nameLocations": [
                        "562:4:50"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 11820,
                      "src": "562:4:50"
                    },
                    "referencedDeclaration": 11820,
                    "src": "562:4:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                      "typeString": "struct Roles.Role"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11853,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "589:7:50",
                  "nodeType": "VariableDeclaration",
                  "scope": 11873,
                  "src": "581:15:50",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11852,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "581:7:50",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "561:36:50"
            },
            "returnParameters": {
              "id": 11855,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "607:0:50"
            },
            "scope": 11901,
            "src": "546:180:50",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 11899,
              "nodeType": "Block",
              "src": "893:122:50",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 11890,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 11885,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11879,
                          "src": "911:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "30",
                              "id": 11888,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "930:1:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 11887,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "922:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 11886,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "922:7:50",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 11889,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "922:10:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "911:21:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373",
                        "id": 11891,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "934:36:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_9d214fa89563f4e6456a3929327e54500ea1cde2c0ba9fb2035ec106190d682f",
                          "typeString": "literal_string \"Roles: account is the zero address\""
                        },
                        "value": "Roles: account is the zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_9d214fa89563f4e6456a3929327e54500ea1cde2c0ba9fb2035ec106190d682f",
                          "typeString": "literal_string \"Roles: account is the zero address\""
                        }
                      ],
                      "id": 11884,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "903:7:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 11892,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "903:68:50",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 11893,
                  "nodeType": "ExpressionStatement",
                  "src": "903:68:50"
                },
                {
                  "expression": {
                    "baseExpression": {
                      "expression": {
                        "id": 11894,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11877,
                        "src": "988:4:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                          "typeString": "struct Roles.Role storage pointer"
                        }
                      },
                      "id": 11895,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "993:6:50",
                      "memberName": "bearer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 11819,
                      "src": "988:11:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 11897,
                    "indexExpression": {
                      "id": 11896,
                      "name": "account",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 11879,
                      "src": "1000:7:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "988:20:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 11883,
                  "id": 11898,
                  "nodeType": "Return",
                  "src": "981:27:50"
                }
              ]
            },
            "documentation": {
              "id": 11874,
              "nodeType": "StructuredDocumentation",
              "src": "732:78:50",
              "text": " @dev Check if an account has this role.\n @return bool"
            },
            "id": 11900,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "has",
            "nameLocation": "824:3:50",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 11880,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11877,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "841:4:50",
                  "nodeType": "VariableDeclaration",
                  "scope": 11900,
                  "src": "828:17:50",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                    "typeString": "struct Roles.Role"
                  },
                  "typeName": {
                    "id": 11876,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 11875,
                      "name": "Role",
                      "nameLocations": [
                        "828:4:50"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 11820,
                      "src": "828:4:50"
                    },
                    "referencedDeclaration": 11820,
                    "src": "828:4:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Role_$11820_storage_ptr",
                      "typeString": "struct Roles.Role"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11879,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "855:7:50",
                  "nodeType": "VariableDeclaration",
                  "scope": 11900,
                  "src": "847:15:50",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11878,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "847:7:50",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "827:36:50"
            },
            "returnParameters": {
              "id": 11883,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11882,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 11900,
                  "src": "887:4:50",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 11881,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "887:4:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "886:6:50"
            },
            "scope": 11901,
            "src": "815:200:50",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 11902,
        "src": "145:872:50",
        "usedErrors": []
      }
    ],
    "src": "37:981:50"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.17+commit.8df45f5f.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.8",
  "updatedAt": "2022-12-08T12:51:01.406Z",
  "devdoc": {
    "details": "Library for managing addresses assigned to a Role.",
    "kind": "dev",
    "methods": {},
    "title": "Roles",
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  }
}