{
  "contractName": "IdentityAdminRole",
  "abi": [
    {
      "inputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "IdentityAdminAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "IdentityAdminRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "isOwner",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "isIdentityAdmin",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "addIdentityAdmin",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "removeIdentityAdmin",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "renounceIdentityAdmin",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"IdentityAdminAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"IdentityAdminRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"addIdentityAdmin\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isIdentityAdmin\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"removeIdentityAdmin\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"renounceIdentityAdmin\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{\"addIdentityAdmin(address)\":{\"details\":\"Adds a identity admin account. Is only callable by owner.\",\"params\":{\"account\":\"Address to be added\"},\"return\":\"true if successful\"},\"isIdentityAdmin(address)\":{\"details\":\"Checks if account is identity admin\",\"params\":{\"account\":\"Account to check\"},\"return\":\"Boolean indicating if account is identity admin\"},\"isOwner()\":{\"return\":\"true if `msg.sender` is the owner of the contract.\"},\"owner()\":{\"return\":\"the address of the owner.\"},\"removeIdentityAdmin(address)\":{\"details\":\"Removes a identity admin account. Is only callable by owner.\",\"params\":{\"account\":\"Address to be removed\"},\"return\":\"true if successful\"},\"renounceIdentityAdmin()\":{\"details\":\"Allows an admin to renounce their role\"},\"renounceOwnership()\":{\"details\":\"Allows the current owner to relinquish control of the contract.\"},\"transferOwnership(address)\":{\"details\":\"Allows the current owner to transfer control of the contract to a newOwner.\",\"params\":{\"newOwner\":\"The address to transfer ownership to.\"}}},\"title\":\"Contract managing the identity admin role\"},\"userdoc\":{\"methods\":{\"renounceOwnership()\":{\"notice\":\"Renouncing to ownership will leave the contract without an owner. It will not be possible to call the functions with the `onlyOwner` modifier anymore.\"}}}},\"settings\":{\"compilationTarget\":{\"/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/contracts/identity/IdentityAdminRole.sol\":\"IdentityAdminRole\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/contracts/identity/IdentityAdminRole.sol\":{\"keccak256\":\"0x8e82c45eefe0da77d017144dfad12602c68124297035937901cdd08ce48c57ff\",\"urls\":[\"bzz-raw://e20e606342b3b35f41a081294cf3f716fe7e27e81d3090daa37c5208f4ef4bc3\",\"dweb:/ipfs/QmVEhHpiwVsksnPyHkfNa5LpTBLxoP9kj5NRZUBv456ewK\"]},\"openzeppelin-solidity/contracts/access/Roles.sol\":{\"keccak256\":\"0x659ba0f9a3392cd50a8a5fafaf5dfd8c6a0878f6a4613bceff4e90dceddcd865\",\"urls\":[\"bzz-raw://4ca6617349a9b36fd82e9442a8e445ce9021a174e4399d1457ddc894ee3f5df3\",\"dweb:/ipfs/QmcmyB4cNazZ1sw963Afaijt67M9bDgwmGXCgQajGTD4tm\"]},\"openzeppelin-solidity/contracts/ownership/Ownable.sol\":{\"keccak256\":\"0x980de387a1a020a498f53d00f89fecebb12c949a17e8f160093c0303ede2b786\",\"urls\":[\"bzz-raw://f07a2c393caa85f62f0aaa461e3edd50aa59371d4209778ba0558d7f8b4b856c\",\"dweb:/ipfs/QmeN3ZiYGSjCnQFeYaJNgoXjF9eDue1g3e9pqManRkeBtV\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "pragma solidity >0.5.4;\r\n\r\nimport \"openzeppelin-solidity/contracts/access/Roles.sol\";\r\nimport \"openzeppelin-solidity/contracts/ownership/Ownable.sol\";\r\n\r\n/**\r\n * @title Contract managing the identity admin role\r\n */\r\ncontract IdentityAdminRole is Ownable {\r\n    using Roles for Roles.Role;\r\n\r\n    event IdentityAdminAdded(address indexed account);\r\n    event IdentityAdminRemoved(address indexed account);\r\n\r\n    Roles.Role private IdentityAdmins;\r\n\r\n    /* @dev constructor. Adds caller as an admin\r\n     */\r\n    constructor() internal {\r\n        _addIdentityAdmin(msg.sender);\r\n    }\r\n\r\n    /* @dev Modifier to check if caller is an admin\r\n     */\r\n    modifier onlyIdentityAdmin() {\r\n        require(isIdentityAdmin(msg.sender), \"not IdentityAdmin\");\r\n        _;\r\n    }\r\n\r\n    /**\r\n     * @dev Checks if account is identity admin\r\n     * @param account Account to check\r\n     * @return Boolean indicating if account is identity admin\r\n     */\r\n    function isIdentityAdmin(address account) public view returns (bool) {\r\n        return IdentityAdmins.has(account);\r\n    }\r\n\r\n    /**\r\n     * @dev Adds a identity admin account. Is only callable by owner.\r\n     * @param account Address to be added\r\n     * @return true if successful\r\n     */\r\n    function addIdentityAdmin(address account) public onlyOwner returns (bool) {\r\n        _addIdentityAdmin(account);\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev Removes a identity admin account. Is only callable by owner.\r\n     * @param account Address to be removed\r\n     * @return true if successful\r\n     */\r\n    function removeIdentityAdmin(address account) public onlyOwner returns (bool) {\r\n        _removeIdentityAdmin(account);\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev Allows an admin to renounce their role\r\n     */\r\n    function renounceIdentityAdmin() public {\r\n        _removeIdentityAdmin(msg.sender);\r\n    }\r\n\r\n    /**\r\n     * @dev Internal implementation of addIdentityAdmin\r\n     */\r\n    function _addIdentityAdmin(address account) internal {\r\n        IdentityAdmins.add(account);\r\n        emit IdentityAdminAdded(account);\r\n    }\r\n\r\n    /**\r\n     * @dev Internal implementation of removeIdentityAdmin\r\n     */\r\n    function _removeIdentityAdmin(address account) internal {\r\n        IdentityAdmins.remove(account);\r\n        emit IdentityAdminRemoved(account);\r\n    }\r\n}\r\n",
  "sourcePath": "/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/contracts/identity/IdentityAdminRole.sol",
  "ast": {
    "absolutePath": "/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/contracts/identity/IdentityAdminRole.sol",
    "exportedSymbols": {
      "IdentityAdminRole": [
        5574
      ]
    },
    "id": 5575,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5449,
        "literals": [
          "solidity",
          ">",
          "0.5",
          ".4"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:27"
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/access/Roles.sol",
        "file": "openzeppelin-solidity/contracts/access/Roles.sol",
        "id": 5450,
        "nodeType": "ImportDirective",
        "scope": 5575,
        "sourceUnit": 16578,
        "src": "27:58:27",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "file": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "id": 5451,
        "nodeType": "ImportDirective",
        "scope": 5575,
        "sourceUnit": 17254,
        "src": "87:63:27",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 5452,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 17253,
              "src": "247:7:27",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$17253",
                "typeString": "contract Ownable"
              }
            },
            "id": 5453,
            "nodeType": "InheritanceSpecifier",
            "src": "247:7:27"
          }
        ],
        "contractDependencies": [
          17253
        ],
        "contractKind": "contract",
        "documentation": "@title Contract managing the identity admin role",
        "fullyImplemented": true,
        "id": 5574,
        "linearizedBaseContracts": [
          5574,
          17253
        ],
        "name": "IdentityAdminRole",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 5456,
            "libraryName": {
              "contractScope": null,
              "id": 5454,
              "name": "Roles",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 16577,
              "src": "268:5:27",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Roles_$16577",
                "typeString": "library Roles"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "262:27:27",
            "typeName": {
              "contractScope": null,
              "id": 5455,
              "name": "Roles.Role",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 16490,
              "src": "278:10:27",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Role_$16490_storage_ptr",
                "typeString": "struct Roles.Role"
              }
            }
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 5460,
            "name": "IdentityAdminAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5459,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5458,
                  "indexed": true,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5460,
                  "src": "322:23:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5457,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "322:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "321:25:27"
            },
            "src": "297:50:27"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 5464,
            "name": "IdentityAdminRemoved",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5463,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5462,
                  "indexed": true,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5464,
                  "src": "380:23:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5461,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "380:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "379:25:27"
            },
            "src": "353:52:27"
          },
          {
            "constant": false,
            "id": 5466,
            "name": "IdentityAdmins",
            "nodeType": "VariableDeclaration",
            "scope": 5574,
            "src": "413:33:27",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_struct$_Role_$16490_storage",
              "typeString": "struct Roles.Role"
            },
            "typeName": {
              "contractScope": null,
              "id": 5465,
              "name": "Roles.Role",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 16490,
              "src": "413:10:27",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Role_$16490_storage_ptr",
                "typeString": "struct Roles.Role"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 5474,
              "nodeType": "Block",
              "src": "537:48:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 5470,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18007,
                          "src": "566:3:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5471,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "566:10:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 5469,
                      "name": "_addIdentityAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5557,
                      "src": "548:17:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5472,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "548:29:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5473,
                  "nodeType": "ExpressionStatement",
                  "src": "548:29:27"
                }
              ]
            },
            "documentation": null,
            "id": 5475,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5467,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "525:2:27"
            },
            "returnParameters": {
              "id": 5468,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "537:0:27"
            },
            "scope": 5574,
            "src": "514:71:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5486,
              "nodeType": "Block",
              "src": "684:88:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 5479,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18007,
                              "src": "719:3:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 5480,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "719:10:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 5478,
                          "name": "isIdentityAdmin",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5500,
                          "src": "703:15:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 5481,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "703:27:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6e6f74204964656e7469747941646d696e",
                        "id": 5482,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "732:19:27",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_70ecc8614ad05c5de74bd38197a8e4225214d22f113f180762dc587547b4d306",
                          "typeString": "literal_string \"not IdentityAdmin\""
                        },
                        "value": "not IdentityAdmin"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_70ecc8614ad05c5de74bd38197a8e4225214d22f113f180762dc587547b4d306",
                          "typeString": "literal_string \"not IdentityAdmin\""
                        }
                      ],
                      "id": 5477,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18010,
                        18011
                      ],
                      "referencedDeclaration": 18011,
                      "src": "695:7:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5483,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "695:57:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5484,
                  "nodeType": "ExpressionStatement",
                  "src": "695:57:27"
                },
                {
                  "id": 5485,
                  "nodeType": "PlaceholderStatement",
                  "src": "763:1:27"
                }
              ]
            },
            "documentation": null,
            "id": 5487,
            "name": "onlyIdentityAdmin",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 5476,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "681:2:27"
            },
            "src": "655:117:27",
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5499,
              "nodeType": "Block",
              "src": "1020:53:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5496,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5489,
                        "src": "1057:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5494,
                        "name": "IdentityAdmins",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5466,
                        "src": "1038:14:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$16490_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 5495,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "has",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 16576,
                      "src": "1038:18:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$16490_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_Role_$16490_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address) view returns (bool)"
                      }
                    },
                    "id": 5497,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1038:27:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 5493,
                  "id": 5498,
                  "nodeType": "Return",
                  "src": "1031:34:27"
                }
              ]
            },
            "documentation": "@dev Checks if account is identity admin\n@param account Account to check\n@return Boolean indicating if account is identity admin",
            "id": 5500,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5490,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5489,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5500,
                  "src": "976:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5488,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "976:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "975:17:27"
            },
            "returnParameters": {
              "id": 5493,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5492,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5500,
                  "src": "1014:4:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5491,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1014:4:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1013:6:27"
            },
            "scope": 5574,
            "src": "951:122:27",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5515,
              "nodeType": "Block",
              "src": "1323:67:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5510,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5502,
                        "src": "1352:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5509,
                      "name": "_addIdentityAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5557,
                      "src": "1334:17:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5511,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1334:26:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5512,
                  "nodeType": "ExpressionStatement",
                  "src": "1334:26:27"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 5513,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1378:4:27",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 5508,
                  "id": 5514,
                  "nodeType": "Return",
                  "src": "1371:11:27"
                }
              ]
            },
            "documentation": "@dev Adds a identity admin account. Is only callable by owner.\n@param account Address to be added\n@return true if successful",
            "id": 5516,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 5505,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 5504,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 17187,
                  "src": "1298:9:27",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1298:9:27"
              }
            ],
            "name": "addIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5503,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5502,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5516,
                  "src": "1274:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5501,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1274:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1273:17:27"
            },
            "returnParameters": {
              "id": 5508,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5507,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5516,
                  "src": "1317:4:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5506,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1317:4:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1316:6:27"
            },
            "scope": 5574,
            "src": "1248:142:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5531,
              "nodeType": "Block",
              "src": "1648:70:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5526,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5518,
                        "src": "1680:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5525,
                      "name": "_removeIdentityAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5573,
                      "src": "1659:20:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5527,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1659:29:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5528,
                  "nodeType": "ExpressionStatement",
                  "src": "1659:29:27"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 5529,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1706:4:27",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 5524,
                  "id": 5530,
                  "nodeType": "Return",
                  "src": "1699:11:27"
                }
              ]
            },
            "documentation": "@dev Removes a identity admin account. Is only callable by owner.\n@param account Address to be removed\n@return true if successful",
            "id": 5532,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 5521,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 5520,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 17187,
                  "src": "1623:9:27",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1623:9:27"
              }
            ],
            "name": "removeIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5519,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5518,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5532,
                  "src": "1599:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5517,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1599:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1598:17:27"
            },
            "returnParameters": {
              "id": 5524,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5523,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5532,
                  "src": "1642:4:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5522,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1642:4:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1641:6:27"
            },
            "scope": 5574,
            "src": "1570:148:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5540,
              "nodeType": "Block",
              "src": "1836:51:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 5536,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18007,
                          "src": "1868:3:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5537,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1868:10:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 5535,
                      "name": "_removeIdentityAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5573,
                      "src": "1847:20:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5538,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1847:32:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5539,
                  "nodeType": "ExpressionStatement",
                  "src": "1847:32:27"
                }
              ]
            },
            "documentation": "@dev Allows an admin to renounce their role",
            "id": 5541,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "renounceIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5533,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1826:2:27"
            },
            "returnParameters": {
              "id": 5534,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1836:0:27"
            },
            "scope": 5574,
            "src": "1796:91:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5556,
              "nodeType": "Block",
              "src": "2023:89:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5549,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5543,
                        "src": "2053:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5546,
                        "name": "IdentityAdmins",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5466,
                        "src": "2034:14:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$16490_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 5548,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 16522,
                      "src": "2034:18:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$16490_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$16490_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 5550,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2034:27:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5551,
                  "nodeType": "ExpressionStatement",
                  "src": "2034:27:27"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5553,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5543,
                        "src": "2096:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5552,
                      "name": "IdentityAdminAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5460,
                      "src": "2077:18:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5554,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2077:27:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5555,
                  "nodeType": "EmitStatement",
                  "src": "2072:32:27"
                }
              ]
            },
            "documentation": "@dev Internal implementation of addIdentityAdmin",
            "id": 5557,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_addIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5544,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5543,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5557,
                  "src": "1997:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5542,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1997:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1996:17:27"
            },
            "returnParameters": {
              "id": 5545,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2023:0:27"
            },
            "scope": 5574,
            "src": "1970:142:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5572,
              "nodeType": "Block",
              "src": "2254:94:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5565,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5559,
                        "src": "2287:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5562,
                        "name": "IdentityAdmins",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5466,
                        "src": "2265:14:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$16490_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 5564,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "remove",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 16553,
                      "src": "2265:21:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$16490_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$16490_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 5566,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2265:30:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5567,
                  "nodeType": "ExpressionStatement",
                  "src": "2265:30:27"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5569,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5559,
                        "src": "2332:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5568,
                      "name": "IdentityAdminRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5464,
                      "src": "2311:20:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5570,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2311:29:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5571,
                  "nodeType": "EmitStatement",
                  "src": "2306:34:27"
                }
              ]
            },
            "documentation": "@dev Internal implementation of removeIdentityAdmin",
            "id": 5573,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_removeIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5560,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5559,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5573,
                  "src": "2228:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5558,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2228:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2227:17:27"
            },
            "returnParameters": {
              "id": 5561,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2254:0:27"
            },
            "scope": 5574,
            "src": "2198:150:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 5575,
        "src": "217:2134:27"
      }
    ],
    "src": "0:2353:27"
  },
  "legacyAST": {
    "absolutePath": "/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/contracts/identity/IdentityAdminRole.sol",
    "exportedSymbols": {
      "IdentityAdminRole": [
        5574
      ]
    },
    "id": 5575,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5449,
        "literals": [
          "solidity",
          ">",
          "0.5",
          ".4"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:27"
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/access/Roles.sol",
        "file": "openzeppelin-solidity/contracts/access/Roles.sol",
        "id": 5450,
        "nodeType": "ImportDirective",
        "scope": 5575,
        "sourceUnit": 16578,
        "src": "27:58:27",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "file": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "id": 5451,
        "nodeType": "ImportDirective",
        "scope": 5575,
        "sourceUnit": 17254,
        "src": "87:63:27",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 5452,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 17253,
              "src": "247:7:27",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$17253",
                "typeString": "contract Ownable"
              }
            },
            "id": 5453,
            "nodeType": "InheritanceSpecifier",
            "src": "247:7:27"
          }
        ],
        "contractDependencies": [
          17253
        ],
        "contractKind": "contract",
        "documentation": "@title Contract managing the identity admin role",
        "fullyImplemented": true,
        "id": 5574,
        "linearizedBaseContracts": [
          5574,
          17253
        ],
        "name": "IdentityAdminRole",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 5456,
            "libraryName": {
              "contractScope": null,
              "id": 5454,
              "name": "Roles",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 16577,
              "src": "268:5:27",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Roles_$16577",
                "typeString": "library Roles"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "262:27:27",
            "typeName": {
              "contractScope": null,
              "id": 5455,
              "name": "Roles.Role",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 16490,
              "src": "278:10:27",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Role_$16490_storage_ptr",
                "typeString": "struct Roles.Role"
              }
            }
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 5460,
            "name": "IdentityAdminAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5459,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5458,
                  "indexed": true,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5460,
                  "src": "322:23:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5457,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "322:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "321:25:27"
            },
            "src": "297:50:27"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 5464,
            "name": "IdentityAdminRemoved",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5463,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5462,
                  "indexed": true,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5464,
                  "src": "380:23:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5461,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "380:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "379:25:27"
            },
            "src": "353:52:27"
          },
          {
            "constant": false,
            "id": 5466,
            "name": "IdentityAdmins",
            "nodeType": "VariableDeclaration",
            "scope": 5574,
            "src": "413:33:27",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_struct$_Role_$16490_storage",
              "typeString": "struct Roles.Role"
            },
            "typeName": {
              "contractScope": null,
              "id": 5465,
              "name": "Roles.Role",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 16490,
              "src": "413:10:27",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Role_$16490_storage_ptr",
                "typeString": "struct Roles.Role"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 5474,
              "nodeType": "Block",
              "src": "537:48:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 5470,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18007,
                          "src": "566:3:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5471,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "566:10:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 5469,
                      "name": "_addIdentityAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5557,
                      "src": "548:17:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5472,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "548:29:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5473,
                  "nodeType": "ExpressionStatement",
                  "src": "548:29:27"
                }
              ]
            },
            "documentation": null,
            "id": 5475,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5467,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "525:2:27"
            },
            "returnParameters": {
              "id": 5468,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "537:0:27"
            },
            "scope": 5574,
            "src": "514:71:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5486,
              "nodeType": "Block",
              "src": "684:88:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 5479,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18007,
                              "src": "719:3:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 5480,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "719:10:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 5478,
                          "name": "isIdentityAdmin",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5500,
                          "src": "703:15:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 5481,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "703:27:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6e6f74204964656e7469747941646d696e",
                        "id": 5482,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "732:19:27",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_70ecc8614ad05c5de74bd38197a8e4225214d22f113f180762dc587547b4d306",
                          "typeString": "literal_string \"not IdentityAdmin\""
                        },
                        "value": "not IdentityAdmin"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_70ecc8614ad05c5de74bd38197a8e4225214d22f113f180762dc587547b4d306",
                          "typeString": "literal_string \"not IdentityAdmin\""
                        }
                      ],
                      "id": 5477,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18010,
                        18011
                      ],
                      "referencedDeclaration": 18011,
                      "src": "695:7:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5483,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "695:57:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5484,
                  "nodeType": "ExpressionStatement",
                  "src": "695:57:27"
                },
                {
                  "id": 5485,
                  "nodeType": "PlaceholderStatement",
                  "src": "763:1:27"
                }
              ]
            },
            "documentation": null,
            "id": 5487,
            "name": "onlyIdentityAdmin",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 5476,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "681:2:27"
            },
            "src": "655:117:27",
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5499,
              "nodeType": "Block",
              "src": "1020:53:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5496,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5489,
                        "src": "1057:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5494,
                        "name": "IdentityAdmins",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5466,
                        "src": "1038:14:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$16490_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 5495,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "has",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 16576,
                      "src": "1038:18:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$16490_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_Role_$16490_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address) view returns (bool)"
                      }
                    },
                    "id": 5497,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1038:27:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 5493,
                  "id": 5498,
                  "nodeType": "Return",
                  "src": "1031:34:27"
                }
              ]
            },
            "documentation": "@dev Checks if account is identity admin\n@param account Account to check\n@return Boolean indicating if account is identity admin",
            "id": 5500,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5490,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5489,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5500,
                  "src": "976:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5488,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "976:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "975:17:27"
            },
            "returnParameters": {
              "id": 5493,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5492,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5500,
                  "src": "1014:4:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5491,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1014:4:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1013:6:27"
            },
            "scope": 5574,
            "src": "951:122:27",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5515,
              "nodeType": "Block",
              "src": "1323:67:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5510,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5502,
                        "src": "1352:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5509,
                      "name": "_addIdentityAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5557,
                      "src": "1334:17:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5511,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1334:26:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5512,
                  "nodeType": "ExpressionStatement",
                  "src": "1334:26:27"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 5513,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1378:4:27",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 5508,
                  "id": 5514,
                  "nodeType": "Return",
                  "src": "1371:11:27"
                }
              ]
            },
            "documentation": "@dev Adds a identity admin account. Is only callable by owner.\n@param account Address to be added\n@return true if successful",
            "id": 5516,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 5505,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 5504,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 17187,
                  "src": "1298:9:27",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1298:9:27"
              }
            ],
            "name": "addIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5503,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5502,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5516,
                  "src": "1274:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5501,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1274:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1273:17:27"
            },
            "returnParameters": {
              "id": 5508,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5507,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5516,
                  "src": "1317:4:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5506,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1317:4:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1316:6:27"
            },
            "scope": 5574,
            "src": "1248:142:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5531,
              "nodeType": "Block",
              "src": "1648:70:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5526,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5518,
                        "src": "1680:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5525,
                      "name": "_removeIdentityAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5573,
                      "src": "1659:20:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5527,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1659:29:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5528,
                  "nodeType": "ExpressionStatement",
                  "src": "1659:29:27"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 5529,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1706:4:27",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 5524,
                  "id": 5530,
                  "nodeType": "Return",
                  "src": "1699:11:27"
                }
              ]
            },
            "documentation": "@dev Removes a identity admin account. Is only callable by owner.\n@param account Address to be removed\n@return true if successful",
            "id": 5532,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 5521,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 5520,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 17187,
                  "src": "1623:9:27",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1623:9:27"
              }
            ],
            "name": "removeIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5519,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5518,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5532,
                  "src": "1599:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5517,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1599:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1598:17:27"
            },
            "returnParameters": {
              "id": 5524,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5523,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5532,
                  "src": "1642:4:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5522,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1642:4:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1641:6:27"
            },
            "scope": 5574,
            "src": "1570:148:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5540,
              "nodeType": "Block",
              "src": "1836:51:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 5536,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18007,
                          "src": "1868:3:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5537,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1868:10:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 5535,
                      "name": "_removeIdentityAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5573,
                      "src": "1847:20:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5538,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1847:32:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5539,
                  "nodeType": "ExpressionStatement",
                  "src": "1847:32:27"
                }
              ]
            },
            "documentation": "@dev Allows an admin to renounce their role",
            "id": 5541,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "renounceIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5533,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1826:2:27"
            },
            "returnParameters": {
              "id": 5534,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1836:0:27"
            },
            "scope": 5574,
            "src": "1796:91:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5556,
              "nodeType": "Block",
              "src": "2023:89:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5549,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5543,
                        "src": "2053:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5546,
                        "name": "IdentityAdmins",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5466,
                        "src": "2034:14:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$16490_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 5548,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 16522,
                      "src": "2034:18:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$16490_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$16490_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 5550,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2034:27:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5551,
                  "nodeType": "ExpressionStatement",
                  "src": "2034:27:27"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5553,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5543,
                        "src": "2096:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5552,
                      "name": "IdentityAdminAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5460,
                      "src": "2077:18:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5554,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2077:27:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5555,
                  "nodeType": "EmitStatement",
                  "src": "2072:32:27"
                }
              ]
            },
            "documentation": "@dev Internal implementation of addIdentityAdmin",
            "id": 5557,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_addIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5544,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5543,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5557,
                  "src": "1997:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5542,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1997:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1996:17:27"
            },
            "returnParameters": {
              "id": 5545,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2023:0:27"
            },
            "scope": 5574,
            "src": "1970:142:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5572,
              "nodeType": "Block",
              "src": "2254:94:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5565,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5559,
                        "src": "2287:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5562,
                        "name": "IdentityAdmins",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5466,
                        "src": "2265:14:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$16490_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 5564,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "remove",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 16553,
                      "src": "2265:21:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$16490_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$16490_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 5566,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2265:30:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5567,
                  "nodeType": "ExpressionStatement",
                  "src": "2265:30:27"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5569,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5559,
                        "src": "2332:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5568,
                      "name": "IdentityAdminRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5464,
                      "src": "2311:20:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5570,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2311:29:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5571,
                  "nodeType": "EmitStatement",
                  "src": "2306:34:27"
                }
              ]
            },
            "documentation": "@dev Internal implementation of removeIdentityAdmin",
            "id": 5573,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_removeIdentityAdmin",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5560,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5559,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 5573,
                  "src": "2228:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5558,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2228:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2227:17:27"
            },
            "returnParameters": {
              "id": 5561,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2254:0:27"
            },
            "scope": 5574,
            "src": "2198:150:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 5575,
        "src": "217:2134:27"
      }
    ],
    "src": "0:2353:27"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.16+commit.9c3226ce.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.2.3",
  "updatedAt": "2022-10-27T11:34:11.212Z",
  "devdoc": {
    "methods": {
      "addIdentityAdmin(address)": {
        "details": "Adds a identity admin account. Is only callable by owner.",
        "params": {
          "account": "Address to be added"
        },
        "return": "true if successful"
      },
      "isIdentityAdmin(address)": {
        "details": "Checks if account is identity admin",
        "params": {
          "account": "Account to check"
        },
        "return": "Boolean indicating if account is identity admin"
      },
      "isOwner()": {
        "return": "true if `msg.sender` is the owner of the contract."
      },
      "owner()": {
        "return": "the address of the owner."
      },
      "removeIdentityAdmin(address)": {
        "details": "Removes a identity admin account. Is only callable by owner.",
        "params": {
          "account": "Address to be removed"
        },
        "return": "true if successful"
      },
      "renounceIdentityAdmin()": {
        "details": "Allows an admin to renounce their role"
      },
      "renounceOwnership()": {
        "details": "Allows the current owner to relinquish control of the contract."
      },
      "transferOwnership(address)": {
        "details": "Allows the current owner to transfer control of the contract to a newOwner.",
        "params": {
          "newOwner": "The address to transfer ownership to."
        }
      }
    },
    "title": "Contract managing the identity admin role"
  },
  "userdoc": {
    "methods": {
      "renounceOwnership()": {
        "notice": "Renouncing to ownership will leave the contract without an owner. It will not be possible to call the functions with the `onlyOwner` modifier anymore."
      }
    }
  }
}