{ "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." } }