UNPKG

secretstore-contracts

Version:

Secret Store permissioning and service contracts collection and toolkit.

1,126 lines 103 kB
{ "contractName": "PermissioningDynamic", "abi": [ { "constant": true, "inputs": [ { "name": "", "type": "bytes32" }, { "name": "", "type": "uint256" } ], "name": "permissions", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "docID", "type": "bytes32" } ], "name": "Permission", "type": "event" }, { "constant": true, "inputs": [ { "name": "document", "type": "bytes32" } ], "name": "users", "outputs": [ { "name": "", "type": "address[]" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "_docID", "type": "bytes32" }, { "name": "_users", "type": "address[]" } ], "name": "addPermission", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "user", "type": "address" }, { "name": "document", "type": "bytes32" } ], "name": "checkPermissions", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" } ], "bytecode": "0x608060405234801561001057600080fd5b5061046c806100206000396000f3006080604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663047be4a38114610066578063924e6afb1461009d578063b36a9a7c146100f9578063cea6ab9814610131575b600080fd5b34801561007257600080fd5b50610081600435602435610199565b60408051600160a060020a039092168252519081900360200190f35b3480156100a957600080fd5b506040805160206004602480358281013584810280870186019097528086526100f7968435963696604495919490910192918291850190849080828437509497506101d09650505050505050565b005b34801561010557600080fd5b5061011d600160a060020a03600435166024356102c6565b604080519115158252519081900360200190f35b34801561013d57600080fd5b50610149600435610330565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561018557818101518382015260200161016d565b505050509050019250505060405180910390f35b6000602052816000526040600020818154811015156101b457fe5b600091825260209091200154600160a060020a03169150829050565b6000828152602081905260409020541561027157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f446f63756d656e74206b657920494420697320616c726561647920696e20757360448201527f652e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600082815260208181526040909120825161028e9284019061039a565b506040805183815290517f1cc9fc44b401f3c62bc063fa96b96115b72c6c810c4cb13745eeb6e173d5ffe59181900360200190a15050565b6000818152602081905260408120815b81548110156103235784600160a060020a031682828154811015156102f757fe5b600091825260209091200154600160a060020a0316141561031b5760019250610328565b6001016102d6565b600092505b505092915050565b6000818152602081815260409182902080548351818402810184019094528084526060939283018282801561038e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610370575b50505050509050919050565b8280548282559060005260206000209081019282156103fc579160200282015b828111156103fc578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039091161782556020909201916001909101906103ba565b5061040892915061040c565b5090565b61043d91905b8082111561040857805473ffffffffffffffffffffffffffffffffffffffff19168155600101610412565b905600a165627a7a72305820facf01e5179d12656d4820ae2cb1612d04c09258640118c85b67c61e98f0daf00029", "deployedBytecode": "0x6080604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663047be4a38114610066578063924e6afb1461009d578063b36a9a7c146100f9578063cea6ab9814610131575b600080fd5b34801561007257600080fd5b50610081600435602435610199565b60408051600160a060020a039092168252519081900360200190f35b3480156100a957600080fd5b506040805160206004602480358281013584810280870186019097528086526100f7968435963696604495919490910192918291850190849080828437509497506101d09650505050505050565b005b34801561010557600080fd5b5061011d600160a060020a03600435166024356102c6565b604080519115158252519081900360200190f35b34801561013d57600080fd5b50610149600435610330565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561018557818101518382015260200161016d565b505050509050019250505060405180910390f35b6000602052816000526040600020818154811015156101b457fe5b600091825260209091200154600160a060020a03169150829050565b6000828152602081905260409020541561027157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f446f63756d656e74206b657920494420697320616c726561647920696e20757360448201527f652e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600082815260208181526040909120825161028e9284019061039a565b506040805183815290517f1cc9fc44b401f3c62bc063fa96b96115b72c6c810c4cb13745eeb6e173d5ffe59181900360200190a15050565b6000818152602081905260408120815b81548110156103235784600160a060020a031682828154811015156102f757fe5b600091825260209091200154600160a060020a0316141561031b5760019250610328565b6001016102d6565b600092505b505092915050565b6000818152602081815260409182902080548351818402810184019094528084526060939283018282801561038e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610370575b50505050509050919050565b8280548282559060005260206000209081019282156103fc579160200282015b828111156103fc578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039091161782556020909201916001909101906103ba565b5061040892915061040c565b5090565b61043d91905b8082111561040857805473ffffffffffffffffffffffffffffffffffffffff19168155600101610412565b905600a165627a7a72305820facf01e5179d12656d4820ae2cb1612d04c09258640118c85b67c61e98f0daf00029", "sourceMap": "157:969:8:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;157:969:8;;;;;;;", "deployedSourceMap": "157:969:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;223:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;223:48:8;;;;;;;;;;;-1:-1:-1;;;;;223:48:8;;;;;;;;;;;;;;490:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;490:322:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;490:322:8;;-1:-1:-1;490:322:8;;-1:-1:-1;;;;;;;490:322:8;;;818:306;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;818:306:8;-1:-1:-1;;;;;818:306:8;;;;;;;;;;;;;;;;;;;;;;;;;365:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;365:119:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;365:119:8;;;;;;;;;;;;;;;;;223:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;223:48:8;;-1:-1:-1;223:48:8;;-1:-1:-1;223:48:8:o;490:322::-;645:11;:19;;;;;;;;;;:26;:31;641:93;;690:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;641:93;744:11;:19;;;;;;;;;;;:28;;;;;;;;:::i;:::-;-1:-1:-1;787:18:8;;;;;;;;;;;;;;;;;490:322;;:::o;818:306::-;897:4;943:21;;;;;;;;;;897:4;974:122;995:16;;991:20;;974:122;;;1052:4;-1:-1:-1;;;;;1036:20:8;:9;1046:1;1036:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1036:12:8;:20;1032:53;;;1081:4;1074:11;;;;1032:53;1013:3;;974:122;;;1112:5;1105:12;;818:306;;;;;;;:::o;365:119::-;456:11;:21;;;;;;;;;;;;449:28;;;;;;;;;;;;;;;;;421:9;;449:28;;;456:21;449:28;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;449:28:8;;;;;;;;;;;;;;;;;;;;;;;365:119;;;:::o;157:969::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;157:969:8;-1:-1:-1;;;;;157:969:8;;;;;;;;;;;-1:-1:-1;157:969:8;;;;;;;-1:-1:-1;157:969:8;;;-1:-1:-1;157:969:8;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;157:969:8;;;;;;;;;:::o", "source": "pragma solidity ^0.4.24;\n\nimport \"../interfaces/ISecretStorePermissioning.sol\";\n\n\n// Permissioning contract to add an arbitrary number of doc keys and users\ncontract PermissioningDynamic is ISecretStorePermissioning {\n\n mapping(bytes32 => address[]) public permissions;\n\n event Permission(bytes32 docID);\n\n // Utility function to return users of a key\n function users(bytes32 document) external view returns (address[] memory) {\n return permissions[document];\n }\n\n function addPermission(bytes32 _docID, address[] memory _users) public {\n // if doc ID is already in use, we do not allow to add/modify\n if (permissions[_docID].length != 0)\n revert(\"Document key ID is already in use.\");\n permissions[_docID] = _users;\n emit Permission(_docID);\n }\n\n function checkPermissions(address user, bytes32 document) public view returns (bool) {\n address[] storage addresses = permissions[document];\n for (uint i = 0; i < addresses.length; i++) {\n if (addresses[i] == user)\n return true;\n }\n return false;\n }\n}\n", "sourcePath": "/home/aznagy/work/secretstore/secretstore-contracts/contracts/simplepermissioning/PermissioningDynamic.sol", "ast": { "absolutePath": "/home/aznagy/work/secretstore/secretstore-contracts/contracts/simplepermissioning/PermissioningDynamic.sol", "exportedSymbols": { "PermissioningDynamic": [ 2135 ] }, "id": 2136, "nodeType": "SourceUnit", "nodes": [ { "id": 2038, "literals": [ "solidity", "^", "0.4", ".24" ], "nodeType": "PragmaDirective", "src": "0:24:8" }, { "absolutePath": "/home/aznagy/work/secretstore/secretstore-contracts/contracts/interfaces/ISecretStorePermissioning.sol", "file": "../interfaces/ISecretStorePermissioning.sol", "id": 2039, "nodeType": "ImportDirective", "scope": 2136, "sourceUnit": 725, "src": "26:53:8", "symbolAliases": [], "unitAlias": "" }, { "baseContracts": [ { "arguments": null, "baseName": { "contractScope": null, "id": 2040, "name": "ISecretStorePermissioning", "nodeType": "UserDefinedTypeName", "referencedDeclaration": 724, "src": "190:25:8", "typeDescriptions": { "typeIdentifier": "t_contract$_ISecretStorePermissioning_$724", "typeString": "contract ISecretStorePermissioning" } }, "id": 2041, "nodeType": "InheritanceSpecifier", "src": "190:25:8" } ], "contractDependencies": [ 724 ], "contractKind": "contract", "documentation": null, "fullyImplemented": true, "id": 2135, "linearizedBaseContracts": [ 2135, 724 ], "name": "PermissioningDynamic", "nodeType": "ContractDefinition", "nodes": [ { "constant": false, "id": 2046, "name": "permissions", "nodeType": "VariableDeclaration", "scope": 2135, "src": "223:48:8", "stateVariable": true, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_bytes32_$_t_array$_t_address_$dyn_storage_$", "typeString": "mapping(bytes32 => address[])" }, "typeName": { "id": 2045, "keyType": { "id": 2042, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "231:7:8", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" } }, "nodeType": "Mapping", "src": "223:29:8", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_bytes32_$_t_array$_t_address_$dyn_storage_$", "typeString": "mapping(bytes32 => address[])" }, "valueType": { "baseType": { "id": 2043, "name": "address", "nodeType": "ElementaryTypeName", "src": "242:7:8", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "id": 2044, "length": null, "nodeType": "ArrayTypeName", "src": "242:9:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", "typeString": "address[]" } } }, "value": null, "visibility": "public" }, { "anonymous": false, "documentation": null, "id": 2050, "name": "Permission", "nodeType": "EventDefinition", "parameters": { "id": 2049, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 2048, "indexed": false, "name": "docID", "nodeType": "VariableDeclaration", "scope": 2050, "src": "295:13:8", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" }, "typeName": { "id": 2047, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "295:7:8", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" } }, "value": null, "visibility": "internal" } ], "src": "294:15:8" }, "src": "278:32:8" }, { "body": { "id": 2062, "nodeType": "Block", "src": "439:45:8", "statements": [ { "expression": { "argumentTypes": null, "baseExpression": { "argumentTypes": null, "id": 2058, "name": "permissions", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2046, "src": "456:11:8", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_bytes32_$_t_array$_t_address_$dyn_storage_$", "typeString": "mapping(bytes32 => address[] storage ref)" } }, "id": 2060, "indexExpression": { "argumentTypes": null, "id": 2059, "name": "document", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2052, "src": "468:8:8", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" } }, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "456:21:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage", "typeString": "address[] storage ref" } }, "functionReturnParameters": 2057, "id": 2061, "nodeType": "Return", "src": "449:28:8" } ] }, "documentation": null, "id": 2063, "implemented": true, "isConstructor": false, "isDeclaredConst": true, "modifiers": [], "name": "users", "nodeType": "FunctionDefinition", "parameters": { "id": 2053, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 2052, "name": "document", "nodeType": "VariableDeclaration", "scope": 2063, "src": "380:16:8", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" }, "typeName": { "id": 2051, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "380:7:8", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" } }, "value": null, "visibility": "internal" } ], "src": "379:18:8" }, "payable": false, "returnParameters": { "id": 2057, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 2056, "name": "", "nodeType": "VariableDeclaration", "scope": 2063, "src": "421:9:8", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[]" }, "typeName": { "baseType": { "id": 2054, "name": "address", "nodeType": "ElementaryTypeName", "src": "421:7:8", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "id": 2055, "length": null, "nodeType": "ArrayTypeName", "src": "421:9:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", "typeString": "address[]" } }, "value": null, "visibility": "internal" } ], "src": "420:18:8" }, "scope": 2135, "src": "365:119:8", "stateMutability": "view", "superFunction": null, "visibility": "external" }, { "body": { "id": 2092, "nodeType": "Block", "src": "561:251:8", "statements": [ { "condition": { "argumentTypes": null, "commonType": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "id": 2076, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { "argumentTypes": null, "expression": { "argumentTypes": null, "baseExpression": { "argumentTypes": null, "id": 2071, "name": "permissions", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2046, "src": "645:11:8", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_bytes32_$_t_array$_t_address_$dyn_storage_$", "typeString": "mapping(bytes32 => address[] storage ref)" } }, "id": 2073, "indexExpression": { "argumentTypes": null, "id": 2072, "name": "_docID", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2065, "src": "657:6:8", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" } }, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "645:19:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage", "typeString": "address[] storage ref" } }, "id": 2074, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberName": "length", "nodeType": "MemberAccess", "referencedDeclaration": null, "src": "645:26:8", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "BinaryOperation", "operator": "!=", "rightExpression": { "argumentTypes": null, "hexValue": "30", "id": 2075, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "675:1:8", "subdenomination": null, "typeDescriptions": { "typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0" }, "value": "0" }, "src": "645:31:8", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, "falseBody": null, "id": 2081, "nodeType": "IfStatement", "src": "641:93:8", "trueBody": { "expression": { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "hexValue": "446f63756d656e74206b657920494420697320616c726561647920696e207573652e", "id": 2078, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "697:36:8", "subdenomination": null, "typeDescriptions": { "typeIdentifier": "t_stringliteral_37522d61580fa2e6052a2bba5e0f4bb7649386a6d6bdc6d7285b89c18f4802df", "typeString": "literal_string \"Document key ID is already in use.\"" }, "value": "Document key ID is already in use." } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_stringliteral_37522d61580fa2e6052a2bba5e0f4bb7649386a6d6bdc6d7285b89c18f4802df", "typeString": "literal_string \"Document key ID is already in use.\"" } ], "id": 2077, "name": "revert", "nodeType": "Identifier", "overloadedDeclarations": [ 2624, 2625 ], "referencedDeclaration": 2625, "src": "690:6:8", "typeDescriptions": { "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", "typeString": "function (string memory) pure" } }, "id": 2079, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "690:44:8", "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, "id": 2080, "nodeType": "ExpressionStatement", "src": "690:44:8" } }, { "expression": { "argumentTypes": null, "id": 2086, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftHandSide": { "argumentTypes": null, "baseExpression": { "argumentTypes": null, "id": 2082, "name": "permissions", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2046, "src": "744:11:8", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_bytes32_$_t_array$_t_address_$dyn_storage_$", "typeString": "mapping(bytes32 => address[] storage ref)" } }, "id": 2084, "indexExpression": { "argumentTypes": null, "id": 2083, "name": "_docID", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2065, "src": "756:6:8", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" } }, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": true, "nodeType": "IndexAccess", "src": "744:19:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage", "typeString": "address[] storage ref" } }, "nodeType": "Assignment", "operator": "=", "rightHandSide": { "argumentTypes": null, "id": 2085, "name": "_users", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2068, "src": "766:6:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[] memory" } }, "src": "744:28:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage", "typeString": "address[] storage ref" } }, "id": 2087, "nodeType": "ExpressionStatement", "src": "744:28:8" }, { "eventCall": { "argumentTypes": null, "arguments": [ { "argumentTypes": null, "id": 2089, "name": "_docID", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2065, "src": "798:6:8", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" } } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_bytes32", "typeString": "bytes32" } ], "id": 2088, "name": "Permission", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2050, "src": "787:10:8", "typeDescriptions": { "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$returns$__$", "typeString": "function (bytes32)" } }, "id": 2090, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "787:18:8", "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, "id": 2091, "nodeType": "EmitStatement", "src": "782:23:8" } ] }, "documentation": null, "id": 2093, "implemented": true, "isConstructor": false, "isDeclaredConst": false, "modifiers": [], "name": "addPermission", "nodeType": "FunctionDefinition", "parameters": { "id": 2069, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 2065, "name": "_docID", "nodeType": "VariableDeclaration", "scope": 2093, "src": "513:14:8", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" }, "typeName": { "id": 2064, "name": "bytes32", "nodeType": "ElementaryTypeName", "src": "513:7:8", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" } }, "value": null, "visibility": "internal" }, { "constant": false, "id": 2068, "name": "_users", "nodeType": "VariableDeclaration", "scope": 2093, "src": "529:23:8", "stateVariable": false, "storageLocation": "memory", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", "typeString": "address[]" }, "typeName": { "baseType": { "id": 2066, "name": "address", "nodeType": "ElementaryTypeName", "src": "529:7:8", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "id": 2067, "length": null, "nodeType": "ArrayTypeName", "src": "529:9:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", "typeString": "address[]" } }, "value": null, "visibility": "internal" } ], "src": "512:41:8" }, "payable": false, "returnParameters": { "id": 2070, "nodeType": "ParameterList", "parameters": [], "src": "561:0:8" }, "scope": 2135, "src": "490:322:8", "stateMutability": "nonpayable", "superFunction": null, "visibility": "public" }, { "body": { "id": 2133, "nodeType": "Block", "src": "903:221:8", "statements": [ { "assignments": [ 2105 ], "declarations": [ { "constant": false, "id": 2105, "name": "addresses", "nodeType": "VariableDeclaration", "scope": 2134, "src": "913:27:8", "stateVariable": false, "storageLocation": "storage", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", "typeString": "address[]" }, "typeName": { "baseType": { "id": 2103, "name": "address", "nodeType": "ElementaryTypeName", "src": "913:7:8", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "id": 2104, "length": null, "nodeType": "ArrayTypeName", "src": "913:9:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", "typeString": "address[]" } }, "value": null, "visibility": "internal" } ], "id": 2109, "initialValue": { "argumentTypes": null, "baseExpression": { "argumentTypes": null, "id": 2106, "name": "permissions", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2046, "src": "943:11:8", "typeDescriptions": { "typeIdentifier": "t_mapping$_t_bytes32_$_t_array$_t_address_$dyn_storage_$", "typeString": "mapping(bytes32 => address[] storage ref)" } }, "id": 2108, "indexExpression": { "argumentTypes": null, "id": 2107, "name": "document", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2097, "src": "955:8:8", "typeDescriptions": { "typeIdentifier": "t_bytes32", "typeString": "bytes32" } }, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "943:21:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage", "typeString": "address[] storage ref" } }, "nodeType": "VariableDeclarationStatement", "src": "913:51:8" }, { "body": { "id": 2129, "nodeType": "Block", "src": "1018:78:8", "statements": [ { "condition": { "argumentTypes": null, "commonType": { "typeIdentifier": "t_address", "typeString": "address" }, "id": 2125, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { "argumentTypes": null, "baseExpression": { "argumentTypes": null, "id": 2121, "name": "addresses", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2105, "src": "1036:9:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", "typeString": "address[] storage pointer" } }, "id": 2123, "indexExpression": { "argumentTypes": null, "id": 2122, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2111, "src": "1046:1:8", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "nodeType": "IndexAccess", "src": "1036:12:8", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "nodeType": "BinaryOperation", "operator": "==", "rightExpression": { "argumentTypes": null, "id": 2124, "name": "user", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2095, "src": "1052:4:8", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "src": "1036:20:8", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, "falseBody": null, "id": 2128, "nodeType": "IfStatement", "src": "1032:53:8", "trueBody": { "expression": { "argumentTypes": null, "hexValue": "74727565", "id": 2126, "isConstant": false, "isLValue": false, "isPure": true, "kind": "bool", "lValueRequested": false, "nodeType": "Literal", "src": "1081:4:8", "subdenomination": null, "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" }, "value": "true" }, "functionReturnParameters": 2101, "id": 2127, "nodeType": "Return", "src": "1074:11:8" } } ] }, "condition": { "argumentTypes": null, "commonType": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "id": 2117, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "leftExpression": { "argumentTypes": null, "id": 2114, "name": "i", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2111, "src": "991:1:8", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "nodeType": "BinaryOperation", "operator": "<", "rightExpression": { "argumentTypes": null, "expression": { "argumentTypes": null, "id": 2115, "name": "addresses", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 2105, "src": "995:9:8", "typeDescriptions": { "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", "typeString": "address[] storage pointer" } }, "id": 2116, "isConstant": false, "isLValue": true, "isPure": false, "lValueRequested": false, "memberName": "length", "nodeType": "MemberAccess", "referencedDeclaration": null, "src": "995:16:8", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "src": "991:20:8", "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, "id": 2130, "initializationExpression": { "assignments": [ 2111 ], "declarations": [ { "constant": false, "id": 2111, "name": "i", "nodeType": "VariableDeclaration", "scope": 2134, "src": "979:6:8", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 2110, "name": "uint", "nodeType": "ElementaryTypeName", "src": "979:4:8", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "value": null, "visibility": "internal" } ], "id": 2113, "initialValue": { "argumentTypes": null, "hexValue": "30", "id": 2112, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "988:1:8", "subdenomination": null, "typeDescriptions": { "typeIdentifier": "t_rational_0_by_1", "typeString": "int_const 0" }, "value": "0" }, "nodeType": "VariableDeclarationStatement", "src": "979:10:8" }, "loopExpression": { "expression": { "argumentTypes": null, "id": 2119, "isConstant": false, "isLValue": false, "isPure": false, "lValueR