{
  "contractName": "XBRMaintained",
  "abi": [
    {
      "inputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "account",
          "type": "address"
        }
      ],
      "name": "MaintainerAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "account",
          "type": "address"
        }
      ],
      "name": "MaintainerRemoved",
      "type": "event"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "account",
          "type": "address"
        }
      ],
      "name": "isMaintainer",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "account",
          "type": "address"
        }
      ],
      "name": "addMaintainer",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "renounceMaintainer",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "///////////////////////////////////////////////////////////////////////////////\n//\n//  Copyright (C) 2018-2019 Crossbar.io Technologies GmbH and contributors.\n//\n//  Licensed under the Apache License, Version 2.0 (the \"License\");\n//  you may not use this file except in compliance with the License.\n//  You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n//\n///////////////////////////////////////////////////////////////////////////////\n\npragma solidity ^0.5.2;\n\nimport \"openzeppelin-solidity/contracts/access/Roles.sol\";\n\n\n/**\n * XBR Network (and XBR Network Proxies) SCs inherit from this base contract\n * to manage network administration and maintenance via Role-based Access\n * Control (RBAC).\n * The implementation for management comes from the OpenZeppelin RBAC library.\n */\ncontract XBRMaintained {\n    /// OpenZeppelin RBAC mixin.\n    using Roles for Roles.Role;\n\n    /**\n     * Event fired when a maintainer was added.\n     *\n     * @param account The account that was added as a maintainer.\n     */\n    event MaintainerAdded(address indexed account);\n\n    /**\n     * Event fired when a maintainer was removed.\n     *\n     * @param account The account that was removed as a maintainer.\n     */\n    event MaintainerRemoved(address indexed account);\n\n    /// Current list of XBR network maintainers.\n    Roles.Role private maintainers;\n\n    /// The constructor is internal (roles are managed by the OpenZeppelin base class).\n    constructor () internal {\n        _addMaintainer(msg.sender);\n    }\n\n    /**\n     * Modifier to require maintainer-role for the sender when calling a SC.\n     */\n    modifier onlyMaintainer () {\n        require(isMaintainer(msg.sender));\n        _;\n    }\n\n    /**\n     * Check if the given address is currently a maintainer.\n     *\n     * @param account The account to check.\n     * @return `true` if the account is maintainer, otherwise `false`.\n     */\n    function isMaintainer (address account) public view returns (bool) {\n        return maintainers.has(account);\n    }\n\n    /**\n     * Add a new maintainer to the list of maintainers.\n     *\n     * @param account The account to grant maintainer rights to.\n     */\n    function addMaintainer (address account) public onlyMaintainer {\n        _addMaintainer(account);\n    }\n\n    /**\n     * Give away maintainer rights.\n     */\n    function renounceMaintainer () public {\n        _removeMaintainer(msg.sender);\n    }\n\n    function _addMaintainer (address account) internal {\n        maintainers.add(account);\n        emit MaintainerAdded(account);\n    }\n\n    function _removeMaintainer (address account) internal {\n        maintainers.remove(account);\n        emit MaintainerRemoved(account);\n    }\n}\n",
  "sourcePath": "/home/oberstet/scm/crossbario/xbr-protocol/contracts/XBRMaintained.sol",
  "ast": {
    "absolutePath": "/home/oberstet/scm/crossbario/xbr-protocol/contracts/XBRMaintained.sol",
    "exportedSymbols": {
      "XBRMaintained": [
        762
      ]
    },
    "id": 763,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 661,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".2"
        ],
        "nodeType": "PragmaDirective",
        "src": "810:23:2"
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/access/Roles.sol",
        "file": "openzeppelin-solidity/contracts/access/Roles.sol",
        "id": 662,
        "nodeType": "ImportDirective",
        "scope": 763,
        "sourceUnit": 2910,
        "src": "835:58:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": "XBR Network (and XBR Network Proxies) SCs inherit from this base contract\nto manage network administration and maintenance via Role-based Access\nControl (RBAC).\nThe implementation for management comes from the OpenZeppelin RBAC library.",
        "fullyImplemented": true,
        "id": 762,
        "linearizedBaseContracts": [
          762
        ],
        "name": "XBRMaintained",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 665,
            "libraryName": {
              "contractScope": null,
              "id": 663,
              "name": "Roles",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2909,
              "src": "1221:5:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Roles_$2909",
                "typeString": "library Roles"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "1215:27:2",
            "typeName": {
              "contractScope": null,
              "id": 664,
              "name": "Roles.Role",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2835,
              "src": "1231:10:2",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Role_$2835_storage_ptr",
                "typeString": "struct Roles.Role"
              }
            }
          },
          {
            "anonymous": false,
            "documentation": "Event fired when a maintainer was added.\n     * @param account The account that was added as a maintainer.",
            "id": 669,
            "name": "MaintainerAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 668,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 667,
                  "indexed": true,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 669,
                  "src": "1407:23:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 666,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1407:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1406:25:2"
            },
            "src": "1385:47:2"
          },
          {
            "anonymous": false,
            "documentation": "Event fired when a maintainer was removed.\n     * @param account The account that was removed as a maintainer.",
            "id": 673,
            "name": "MaintainerRemoved",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 672,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 671,
                  "indexed": true,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 673,
                  "src": "1603:23:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 670,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1603:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1602:25:2"
            },
            "src": "1579:49:2"
          },
          {
            "constant": false,
            "id": 675,
            "name": "maintainers",
            "nodeType": "VariableDeclaration",
            "scope": 762,
            "src": "1683:30:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_struct$_Role_$2835_storage",
              "typeString": "struct Roles.Role"
            },
            "typeName": {
              "contractScope": null,
              "id": 674,
              "name": "Roles.Role",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2835,
              "src": "1683:10:2",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Role_$2835_storage_ptr",
                "typeString": "struct Roles.Role"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 683,
              "nodeType": "Block",
              "src": "1832:43:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 679,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3662,
                          "src": "1857:3:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 680,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1857:10:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 678,
                      "name": "_addMaintainer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 745,
                      "src": "1842:14:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 681,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1842:26:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 682,
                  "nodeType": "ExpressionStatement",
                  "src": "1842:26:2"
                }
              ]
            },
            "documentation": "The constructor is internal (roles are managed by the OpenZeppelin base class).",
            "id": 684,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 676,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1820:2:2"
            },
            "returnParameters": {
              "id": 677,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1832:0:2"
            },
            "scope": 762,
            "src": "1808:67:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 694,
              "nodeType": "Block",
              "src": "2001:61:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 688,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3662,
                              "src": "2032:3:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 689,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "2032:10:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 687,
                          "name": "isMaintainer",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 708,
                          "src": "2019:12:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 690,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2019:24:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 686,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3665,
                        3666
                      ],
                      "referencedDeclaration": 3665,
                      "src": "2011:7:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 691,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2011:33:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 692,
                  "nodeType": "ExpressionStatement",
                  "src": "2011:33:2"
                },
                {
                  "id": 693,
                  "nodeType": "PlaceholderStatement",
                  "src": "2054:1:2"
                }
              ]
            },
            "documentation": "Modifier to require maintainer-role for the sender when calling a SC.",
            "id": 695,
            "name": "onlyMaintainer",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 685,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1998:2:2"
            },
            "src": "1974:88:2",
            "visibility": "internal"
          },
          {
            "body": {
              "id": 707,
              "nodeType": "Block",
              "src": "2334:48:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 704,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 697,
                        "src": "2367:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 702,
                        "name": "maintainers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 675,
                        "src": "2351:11:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$2835_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 703,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "has",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2908,
                      "src": "2351:15:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_Role_$2835_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address) view returns (bool)"
                      }
                    },
                    "id": 705,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2351:24:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 701,
                  "id": 706,
                  "nodeType": "Return",
                  "src": "2344:31:2"
                }
              ]
            },
            "documentation": "Check if the given address is currently a maintainer.\n     * @param account The account to check.\n@return `true` if the account is maintainer, otherwise `false`.",
            "id": 708,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isMaintainer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 698,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 697,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 708,
                  "src": "2290:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 696,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2290:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2289:17:2"
            },
            "returnParameters": {
              "id": 701,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 700,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 708,
                  "src": "2328:4:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 699,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2328:4:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2327:6:2"
            },
            "scope": 762,
            "src": "2267:115:2",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 719,
              "nodeType": "Block",
              "src": "2595:40:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 716,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 710,
                        "src": "2620:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 715,
                      "name": "_addMaintainer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 745,
                      "src": "2605:14:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 717,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2605:23:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 718,
                  "nodeType": "ExpressionStatement",
                  "src": "2605:23:2"
                }
              ]
            },
            "documentation": "Add a new maintainer to the list of maintainers.\n     * @param account The account to grant maintainer rights to.",
            "id": 720,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 713,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 712,
                  "name": "onlyMaintainer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 695,
                  "src": "2580:14:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2580:14:2"
              }
            ],
            "name": "addMaintainer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 711,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 710,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 720,
                  "src": "2556:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 709,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2556:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2555:17:2"
            },
            "returnParameters": {
              "id": 714,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2595:0:2"
            },
            "scope": 762,
            "src": "2532:103:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 728,
              "nodeType": "Block",
              "src": "2731:46:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 724,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3662,
                          "src": "2759:3:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 725,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2759:10:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 723,
                      "name": "_removeMaintainer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 761,
                      "src": "2741:17:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 726,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2741:29:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 727,
                  "nodeType": "ExpressionStatement",
                  "src": "2741:29:2"
                }
              ]
            },
            "documentation": "Give away maintainer rights.",
            "id": 729,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "renounceMaintainer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 721,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2721:2:2"
            },
            "returnParameters": {
              "id": 722,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2731:0:2"
            },
            "scope": 762,
            "src": "2693:84:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 744,
              "nodeType": "Block",
              "src": "2834:80:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 737,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 731,
                        "src": "2860:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 734,
                        "name": "maintainers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 675,
                        "src": "2844:11:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$2835_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 736,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2860,
                      "src": "2844:15:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$2835_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 738,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2844:24:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 739,
                  "nodeType": "ExpressionStatement",
                  "src": "2844:24:2"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 741,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 731,
                        "src": "2899:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 740,
                      "name": "MaintainerAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 669,
                      "src": "2883:15:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 742,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2883:24:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 743,
                  "nodeType": "EmitStatement",
                  "src": "2878:29:2"
                }
              ]
            },
            "documentation": null,
            "id": 745,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_addMaintainer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 732,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 731,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 745,
                  "src": "2808:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 730,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2808:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2807:17:2"
            },
            "returnParameters": {
              "id": 733,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2834:0:2"
            },
            "scope": 762,
            "src": "2783:131:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 760,
              "nodeType": "Block",
              "src": "2974:85:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 753,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 747,
                        "src": "3003:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 750,
                        "name": "maintainers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 675,
                        "src": "2984:11:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$2835_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 752,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "remove",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2884,
                      "src": "2984:18:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$2835_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 754,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2984:27:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 755,
                  "nodeType": "ExpressionStatement",
                  "src": "2984:27:2"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 757,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 747,
                        "src": "3044:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 756,
                      "name": "MaintainerRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 673,
                      "src": "3026:17:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 758,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3026:26:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 759,
                  "nodeType": "EmitStatement",
                  "src": "3021:31:2"
                }
              ]
            },
            "documentation": null,
            "id": 761,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_removeMaintainer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 748,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 747,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 761,
                  "src": "2948:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 746,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2948:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2947:17:2"
            },
            "returnParameters": {
              "id": 749,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2974:0:2"
            },
            "scope": 762,
            "src": "2920:139:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 763,
        "src": "1153:1908:2"
      }
    ],
    "src": "810:2252:2"
  },
  "legacyAST": {
    "absolutePath": "/home/oberstet/scm/crossbario/xbr-protocol/contracts/XBRMaintained.sol",
    "exportedSymbols": {
      "XBRMaintained": [
        762
      ]
    },
    "id": 763,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 661,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".2"
        ],
        "nodeType": "PragmaDirective",
        "src": "810:23:2"
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/access/Roles.sol",
        "file": "openzeppelin-solidity/contracts/access/Roles.sol",
        "id": 662,
        "nodeType": "ImportDirective",
        "scope": 763,
        "sourceUnit": 2910,
        "src": "835:58:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": "XBR Network (and XBR Network Proxies) SCs inherit from this base contract\nto manage network administration and maintenance via Role-based Access\nControl (RBAC).\nThe implementation for management comes from the OpenZeppelin RBAC library.",
        "fullyImplemented": true,
        "id": 762,
        "linearizedBaseContracts": [
          762
        ],
        "name": "XBRMaintained",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 665,
            "libraryName": {
              "contractScope": null,
              "id": 663,
              "name": "Roles",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2909,
              "src": "1221:5:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Roles_$2909",
                "typeString": "library Roles"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "1215:27:2",
            "typeName": {
              "contractScope": null,
              "id": 664,
              "name": "Roles.Role",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2835,
              "src": "1231:10:2",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Role_$2835_storage_ptr",
                "typeString": "struct Roles.Role"
              }
            }
          },
          {
            "anonymous": false,
            "documentation": "Event fired when a maintainer was added.\n     * @param account The account that was added as a maintainer.",
            "id": 669,
            "name": "MaintainerAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 668,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 667,
                  "indexed": true,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 669,
                  "src": "1407:23:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 666,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1407:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1406:25:2"
            },
            "src": "1385:47:2"
          },
          {
            "anonymous": false,
            "documentation": "Event fired when a maintainer was removed.\n     * @param account The account that was removed as a maintainer.",
            "id": 673,
            "name": "MaintainerRemoved",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 672,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 671,
                  "indexed": true,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 673,
                  "src": "1603:23:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 670,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1603:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1602:25:2"
            },
            "src": "1579:49:2"
          },
          {
            "constant": false,
            "id": 675,
            "name": "maintainers",
            "nodeType": "VariableDeclaration",
            "scope": 762,
            "src": "1683:30:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_struct$_Role_$2835_storage",
              "typeString": "struct Roles.Role"
            },
            "typeName": {
              "contractScope": null,
              "id": 674,
              "name": "Roles.Role",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2835,
              "src": "1683:10:2",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Role_$2835_storage_ptr",
                "typeString": "struct Roles.Role"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 683,
              "nodeType": "Block",
              "src": "1832:43:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 679,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3662,
                          "src": "1857:3:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 680,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1857:10:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 678,
                      "name": "_addMaintainer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 745,
                      "src": "1842:14:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 681,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1842:26:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 682,
                  "nodeType": "ExpressionStatement",
                  "src": "1842:26:2"
                }
              ]
            },
            "documentation": "The constructor is internal (roles are managed by the OpenZeppelin base class).",
            "id": 684,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 676,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1820:2:2"
            },
            "returnParameters": {
              "id": 677,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1832:0:2"
            },
            "scope": 762,
            "src": "1808:67:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 694,
              "nodeType": "Block",
              "src": "2001:61:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 688,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3662,
                              "src": "2032:3:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 689,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "2032:10:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 687,
                          "name": "isMaintainer",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 708,
                          "src": "2019:12:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 690,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2019:24:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 686,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3665,
                        3666
                      ],
                      "referencedDeclaration": 3665,
                      "src": "2011:7:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 691,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2011:33:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 692,
                  "nodeType": "ExpressionStatement",
                  "src": "2011:33:2"
                },
                {
                  "id": 693,
                  "nodeType": "PlaceholderStatement",
                  "src": "2054:1:2"
                }
              ]
            },
            "documentation": "Modifier to require maintainer-role for the sender when calling a SC.",
            "id": 695,
            "name": "onlyMaintainer",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 685,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1998:2:2"
            },
            "src": "1974:88:2",
            "visibility": "internal"
          },
          {
            "body": {
              "id": 707,
              "nodeType": "Block",
              "src": "2334:48:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 704,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 697,
                        "src": "2367:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 702,
                        "name": "maintainers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 675,
                        "src": "2351:11:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$2835_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 703,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "has",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2908,
                      "src": "2351:15:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_Role_$2835_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address) view returns (bool)"
                      }
                    },
                    "id": 705,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2351:24:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 701,
                  "id": 706,
                  "nodeType": "Return",
                  "src": "2344:31:2"
                }
              ]
            },
            "documentation": "Check if the given address is currently a maintainer.\n     * @param account The account to check.\n@return `true` if the account is maintainer, otherwise `false`.",
            "id": 708,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isMaintainer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 698,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 697,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 708,
                  "src": "2290:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 696,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2290:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2289:17:2"
            },
            "returnParameters": {
              "id": 701,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 700,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 708,
                  "src": "2328:4:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 699,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2328:4:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2327:6:2"
            },
            "scope": 762,
            "src": "2267:115:2",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 719,
              "nodeType": "Block",
              "src": "2595:40:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 716,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 710,
                        "src": "2620:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 715,
                      "name": "_addMaintainer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 745,
                      "src": "2605:14:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 717,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2605:23:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 718,
                  "nodeType": "ExpressionStatement",
                  "src": "2605:23:2"
                }
              ]
            },
            "documentation": "Add a new maintainer to the list of maintainers.\n     * @param account The account to grant maintainer rights to.",
            "id": 720,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 713,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 712,
                  "name": "onlyMaintainer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 695,
                  "src": "2580:14:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2580:14:2"
              }
            ],
            "name": "addMaintainer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 711,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 710,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 720,
                  "src": "2556:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 709,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2556:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2555:17:2"
            },
            "returnParameters": {
              "id": 714,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2595:0:2"
            },
            "scope": 762,
            "src": "2532:103:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 728,
              "nodeType": "Block",
              "src": "2731:46:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 724,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3662,
                          "src": "2759:3:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 725,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2759:10:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 723,
                      "name": "_removeMaintainer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 761,
                      "src": "2741:17:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 726,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2741:29:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 727,
                  "nodeType": "ExpressionStatement",
                  "src": "2741:29:2"
                }
              ]
            },
            "documentation": "Give away maintainer rights.",
            "id": 729,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "renounceMaintainer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 721,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2721:2:2"
            },
            "returnParameters": {
              "id": 722,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2731:0:2"
            },
            "scope": 762,
            "src": "2693:84:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 744,
              "nodeType": "Block",
              "src": "2834:80:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 737,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 731,
                        "src": "2860:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 734,
                        "name": "maintainers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 675,
                        "src": "2844:11:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$2835_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 736,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2860,
                      "src": "2844:15:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$2835_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 738,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2844:24:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 739,
                  "nodeType": "ExpressionStatement",
                  "src": "2844:24:2"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 741,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 731,
                        "src": "2899:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 740,
                      "name": "MaintainerAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 669,
                      "src": "2883:15:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 742,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2883:24:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 743,
                  "nodeType": "EmitStatement",
                  "src": "2878:29:2"
                }
              ]
            },
            "documentation": null,
            "id": 745,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_addMaintainer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 732,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 731,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 745,
                  "src": "2808:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 730,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2808:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2807:17:2"
            },
            "returnParameters": {
              "id": 733,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2834:0:2"
            },
            "scope": 762,
            "src": "2783:131:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 760,
              "nodeType": "Block",
              "src": "2974:85:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 753,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 747,
                        "src": "3003:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 750,
                        "name": "maintainers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 675,
                        "src": "2984:11:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$2835_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 752,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "remove",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2884,
                      "src": "2984:18:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$2835_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 754,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2984:27:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 755,
                  "nodeType": "ExpressionStatement",
                  "src": "2984:27:2"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 757,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 747,
                        "src": "3044:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 756,
                      "name": "MaintainerRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 673,
                      "src": "3026:17:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 758,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3026:26:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 759,
                  "nodeType": "EmitStatement",
                  "src": "3021:31:2"
                }
              ]
            },
            "documentation": null,
            "id": 761,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_removeMaintainer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 748,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 747,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 761,
                  "src": "2948:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 746,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2948:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2947:17:2"
            },
            "returnParameters": {
              "id": 749,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2974:0:2"
            },
            "scope": 762,
            "src": "2920:139:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 763,
        "src": "1153:1908:2"
      }
    ],
    "src": "810:2252:2"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.2+commit.1df8f40c.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.0.16",
  "updatedAt": "2019-10-23T07:58:23.254Z",
  "devdoc": {
    "methods": {
      "addMaintainer(address)": {
        "params": {
          "account": "The account to grant maintainer rights to."
        }
      },
      "isMaintainer(address)": {
        "params": {
          "account": "The account to check."
        },
        "return": "`true` if the account is maintainer, otherwise `false`."
      }
    }
  },
  "userdoc": {
    "methods": {
      "addMaintainer(address)": {
        "notice": "Add a new maintainer to the list of maintainers."
      },
      "constructor": "The constructor is internal (roles are managed by the OpenZeppelin base class).",
      "isMaintainer(address)": {
        "notice": "Check if the given address is currently a maintainer."
      },
      "renounceMaintainer()": {
        "notice": "Give away maintainer rights."
      }
    },
    "notice": "XBR Network (and XBR Network Proxies) SCs inherit from this base contract to manage network administration and maintenance via Role-based Access Control (RBAC). The implementation for management comes from the OpenZeppelin RBAC library."
  }
}