{
  "contractName": "AccessControl",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "assetId",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes4",
          "name": "methodSignature",
          "type": "bytes4"
        }
      ],
      "name": "GrantedAccess",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "assetId",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes4",
          "name": "methodSignature",
          "type": "bytes4"
        }
      ],
      "name": "RevokedAccess",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "assetId",
          "type": "bytes32"
        },
        {
          "internalType": "bytes4",
          "name": "methodSignature",
          "type": "bytes4"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantAccess",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "assetId",
          "type": "bytes32"
        },
        {
          "internalType": "bytes4",
          "name": "methodSignature",
          "type": "bytes4"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeAccess",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "assetId",
          "type": "bytes32"
        },
        {
          "internalType": "bytes4",
          "name": "methodSignature",
          "type": "bytes4"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasAccess",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "assetId",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRootAccess",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.6.11+commit.5ef660b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"assetId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes4\",\"name\":\"methodSignature\",\"type\":\"bytes4\"}],\"name\":\"GrantedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"assetId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes4\",\"name\":\"methodSignature\",\"type\":\"bytes4\"}],\"name\":\"RevokedAccess\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"assetId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes4\",\"name\":\"methodSignature\",\"type\":\"bytes4\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantAccess\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"assetId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes4\",\"name\":\"methodSignature\",\"type\":\"bytes4\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasAccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"assetId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRootAccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"assetId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes4\",\"name\":\"methodSignature\",\"type\":\"bytes4\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeAccess\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"grantAccess(bytes32,bytes4,address)\":{\"details\":\"Can only be called by an authorized account.\",\"params\":{\"account\":\"address of the account to grant access to\",\"assetId\":\"id of the asset\",\"methodSignature\":\"function / method signature (4 byte keccak256 hash of the method selector)\"}},\"hasAccess(bytes32,bytes4,address)\":{\"params\":{\"account\":\"address of the account for which to check access\",\"assetId\":\"id of the asset\",\"methodSignature\":\"function / method signature (4 byte keccak256 hash of the method selector)\"},\"returns\":{\"_0\":\"true if allowed access\"}},\"hasRootAccess(bytes32,address)\":{\"params\":{\"account\":\"address of the account for which to check root acccess\",\"assetId\":\"id of the asset\"},\"returns\":{\"_0\":\"true if has root access\"}},\"revokeAccess(bytes32,bytes4,address)\":{\"details\":\"Can only be called by an authorized account.\",\"params\":{\"account\":\"address of the account to revoke access for\",\"assetId\":\"id of the asset\",\"methodSignature\":\"function / method signature (4 byte keccak256 hash of the method selector)\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"grantAccess(bytes32,bytes4,address)\":{\"notice\":\"Grant access to an account to call a specific method on a specific asset.\"},\"hasAccess(bytes32,bytes4,address)\":{\"notice\":\"Check whether an account is allowed to call a specific method on a specific asset.\"},\"hasRootAccess(bytes32,address)\":{\"notice\":\"Check whether an account has root access for a specific asset.\"},\"revokeAccess(bytes32,bytes4,address)\":{\"notice\":\"Revoke access for an account to call a specific method on a specific asset.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/AccessControl/AccessControl.sol\":\"AccessControl\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/AccessControl/AccessControl.sol\":{\"keccak256\":\"0x7cb99654f112c88d67ac567b688f2d38e54bf2d4eeb5c3df12bac7d68c85c6e8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://836ccdb22ebced3535672e70a0c41803b3064872ab18bfeeafff6c4437f128c2\",\"dweb:/ipfs/QmV3RuN1vmHoiZUFymS6FHeEHkcZy1yZyR13sfMwEDyjbr\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/AccessControl/IAccessControl.sol\":{\"keccak256\":\"0xbbe1aada0583637e5ae8b0a09ae59d629c1da70bde5a3f291f5f0ed42440d091\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://36ab01d00a9ebd59822247cdc7bee3c70af062e2c9408e8f80e1656fc9d2761c\",\"dweb:/ipfs/QmSQzma4M2TDZup2dERJi368F8z9UQQ1zyUsq8e41hgg2F\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/BaseRegistryStorage.sol\":{\"keccak256\":\"0x872f4fd27fe80b6b3826bdaeaacdb77fb529d34235735f82e1413a5fe655f68b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c24b8fa53dfb2a11c67053c4b00de83307e45c83229e4b44f71d21eb9b0e5abd\",\"dweb:/ipfs/QmetZ6ptmsueoaCxjBMqpaZYdHgpjqPhjZurKbG2ZudbqY\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/Schedule/ScheduleEncoder.sol\":{\"keccak256\":\"0x887c1085da0a8f7b055ae73bc3337228d70cef2296521103abb5fcb53315313e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://cb408a6f3e5f9394eacaeeaeb2d38db05f994b952cfaa6ca896c0af978cf27d7\",\"dweb:/ipfs/QmeDp1TWA1rGijSgQUPwCJoc933gPD8FVTkDTupppxuZhS\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/State/StateEncoder.sol\":{\"keccak256\":\"0x2668d331c79ff3eb189a5fd813fdc77ff9adb82c8c6323f3b09fd72e47674492\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://01ecc394db0ce16d5e415b55dd0bf78d7de70197ed3a60602b11a814451fd5ff\",\"dweb:/ipfs/QmfVdpeeuFXSjnUSMiwp9pS3gAhKE72zwBFdBy29DDLBH4\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/Conversions.sol\":{\"keccak256\":\"0x4482adab804008a2774b11036cc9ff6f42aa7f248d6b8ca922082bf090a736e5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e774c979286649c16d92eb4672c30c06fcbe7ddc053eee70088c4b28fc27e48c\",\"dweb:/ipfs/QmXqfezUnKVaKzA7Qs9BFC9yRKFTMwwxa778ofikE2hC1H\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/SharedTypes.sol\":{\"keccak256\":\"0x5a918fdefe9bd357255bffcf75d325f0d23ccf7074533f8d6a80a62bfd60893e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5c5fc68f47deab5b0cc572a8a1f7dba997e5a8bb13292ce3e4ee29540a3b1fd7\",\"dweb:/ipfs/QmeqcqcDYsgvbBH8XrHzURMuz9jQLEf4F2i5M59wYMCxgt\"]},\"@atpar/actus-solidity/contracts/Core/ACTUSConstants.sol\":{\"keccak256\":\"0xd7588866afdab6298dd5b64c5fe0ca63230236538d711932e7a5a17928d1226b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2a0678d5f895239119f463a3ae8a58c5c27b872c91db1cd4253ce5866481c6cd\",\"dweb:/ipfs/QmPXsMXFf1Qar8JCnKTL6Nizf63sZEQQt7XosrdeEnG2CE\"]},\"@atpar/actus-solidity/contracts/Core/ACTUSTypes.sol\":{\"keccak256\":\"0x4374a4c79ef02bb008994431870badedd532d09639fef8d7378039faee88d4dd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c0d32929c237f8d04ff4117611292f874bb1dd785b8ec94c04389d608c11481c\",\"dweb:/ipfs/QmVu3awVGWDvqMCjPhmzcCQCRg4VNr5XxcDRWDECTr17TV\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b506103f8806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80631717e867146100515780631b1268151461006657806339262e871461008f578063e8f7ca3e146100a2575b600080fd5b61006461005f3660046102ee565b6100b5565b005b6100796100743660046102ee565b610171565b604051610086919061033b565b60405180910390f35b61006461009d3660046102ee565b6101e8565b6100796100b03660046102bf565b61028b565b6100cc836000356001600160e01b03191633610171565b6100f15760405162461bcd60e51b81526004016100e89061035b565b60405180910390fd5b6000838152602081815260408083206001600160e01b031986168452600c0182528083206001600160a01b038516808552925291829020805460ff19166001179055905184907face25d271ad11ee299595b3021629bae0349e370d7c2eb7c2dced6e4edb4786590610164908690610346565b60405180910390a3505050565b6000838152602081815260408083206001600160e01b031986168452600c0182528083206001600160a01b038516845290915281205460ff16806101e05750600084815260208181526040808320838052600c0182528083206001600160a01b038616845290915290205460ff165b949350505050565b6101ff836000356001600160e01b03191633610171565b61021b5760405162461bcd60e51b81526004016100e89061035b565b6000838152602081815260408083206001600160e01b031986168452600c0182528083206001600160a01b038516808552925291829020805460ff19169055905184907f42b1b0e7392ad606bb4f5b003296aba62f16e43aa9372f1f40c1522fa2655ffa90610164908690610346565b600091825260208281526040808420848052600c0182528084206001600160a01b0393909316845291905290205460ff1690565b600080604083850312156102d1578182fd5b8235915060208301356102e3816103aa565b809150509250929050565b600080600060608486031215610302578081fd5b8335925060208401356001600160e01b031981168114610320578182fd5b91506040840135610330816103aa565b809150509250925092565b901515815260200190565b6001600160e01b031991909116815260200190565b6020808252602f908201527f416363657373436f6e74726f6c2e7265766f6b654163636573733a20554e415560408201526e2a2427a924ad22a22fa9a2a72222a960891b606082015260800190565b6001600160a01b03811681146103bf57600080fd5b5056fea2646970667358221220d6cf43910d03304565874db867eac379f05810040949e8b33f725d36850cf51d64736f6c634300060b0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80631717e867146100515780631b1268151461006657806339262e871461008f578063e8f7ca3e146100a2575b600080fd5b61006461005f3660046102ee565b6100b5565b005b6100796100743660046102ee565b610171565b604051610086919061033b565b60405180910390f35b61006461009d3660046102ee565b6101e8565b6100796100b03660046102bf565b61028b565b6100cc836000356001600160e01b03191633610171565b6100f15760405162461bcd60e51b81526004016100e89061035b565b60405180910390fd5b6000838152602081815260408083206001600160e01b031986168452600c0182528083206001600160a01b038516808552925291829020805460ff19166001179055905184907face25d271ad11ee299595b3021629bae0349e370d7c2eb7c2dced6e4edb4786590610164908690610346565b60405180910390a3505050565b6000838152602081815260408083206001600160e01b031986168452600c0182528083206001600160a01b038516845290915281205460ff16806101e05750600084815260208181526040808320838052600c0182528083206001600160a01b038616845290915290205460ff165b949350505050565b6101ff836000356001600160e01b03191633610171565b61021b5760405162461bcd60e51b81526004016100e89061035b565b6000838152602081815260408083206001600160e01b031986168452600c0182528083206001600160a01b038516808552925291829020805460ff19169055905184907f42b1b0e7392ad606bb4f5b003296aba62f16e43aa9372f1f40c1522fa2655ffa90610164908690610346565b600091825260208281526040808420848052600c0182528084206001600160a01b0393909316845291905290205460ff1690565b600080604083850312156102d1578182fd5b8235915060208301356102e3816103aa565b809150509250929050565b600080600060608486031215610302578081fd5b8335925060208401356001600160e01b031981168114610320578182fd5b91506040840135610330816103aa565b809150509250925092565b901515815260200190565b6001600160e01b031991909116815260200190565b6020808252602f908201527f416363657373436f6e74726f6c2e7265766f6b654163636573733a20554e415560408201526e2a2427a924ad22a22fa9a2a72222a960891b606082015260800190565b6001600160a01b03811681146103bf57600080fd5b5056fea2646970667358221220d6cf43910d03304565874db867eac379f05810040949e8b33f725d36850cf51d64736f6c634300060b0033",
  "immutableReferences": {},
  "sourceMap": "171:3746:6:-:0;;;;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "171:3746:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1194:397;;;;;;:::i;:::-;;:::i;:::-;;2741:280;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1970:399;;;;;;:::i;:::-;;:::i;3276:186::-;;;;;;:::i;:::-;;:::i;1194:397::-;1342:39;1352:7;1361;;-1:-1:-1;;;;;;1361:7:6;1370:10;1342:9;:39::i;:::-;1321:133;;;;-1:-1:-1;;;1321:133:6;;;;;;;:::i;:::-;;;;;;;;;1465:6;:15;;;;;;;;;;;-1:-1:-1;;;;;;1465:39:6;;;;:22;;:39;;;;;-1:-1:-1;;;;;1465:48:6;;;;;;;;;;;:55;;-1:-1:-1;;1465:55:6;1516:4;1465:55;;;1536:48;;1472:7;;1536:48;;;;1488:15;;1536:48;:::i;:::-;;;;;;;;1194:397;;;:::o;2741:280::-;2867:4;2908:15;;;;;;;;;;;-1:-1:-1;;;;;;2908:39:6;;;;:22;;:39;;;;;-1:-1:-1;;;;;2908:48:6;;;;;;;;;;;;;:96;;-1:-1:-1;2960:6:6;:15;;;;;;;;;;;:35;;;:22;;:35;;;;;-1:-1:-1;;;;;2960:44:6;;;;;;;;;;;;2908:96;2887:127;2741:280;-1:-1:-1;;;;2741:280:6:o;1970:399::-;2119:39;2129:7;2138;;-1:-1:-1;;;;;;2138:7:6;2147:10;2119:9;:39::i;:::-;2098:133;;;;-1:-1:-1;;;2098:133:6;;;;;;;:::i;:::-;2293:5;2242:15;;;;;;;;;;;-1:-1:-1;;;;;;2242:39:6;;;;:22;;:39;;;;;-1:-1:-1;;;;;2242:48:6;;;;;;;;;;;:56;;-1:-1:-1;;2242:56:6;;;2314:48;;2249:7;;2314:48;;;;2265:15;;2314:48;:::i;3276:186::-;3382:4;3410:15;;;;;;;;;;;:35;;;:22;;:35;;;;;-1:-1:-1;;;;;3410:44:6;;;;;;;;;;;;;;;3276:186::o;414:366:-1:-;;;535:2;523:9;514:7;510:23;506:32;503:2;;;-1:-1;;541:12;503:2;222:6;209:20;593:63;;693:2;736:9;732:22;72:20;97:33;124:5;97:33;:::i;:::-;701:63;;;;497:283;;;;;:::o;787:489::-;;;;924:2;912:9;903:7;899:23;895:32;892:2;;;-1:-1;;930:12;892:2;209:20;;;-1:-1;1082:2;1120:22;;345:20;-1:-1;;;;;;3271:78;;3795:34;;3785:2;;-1:-1;;3833:12;3785:2;1090:62;-1:-1;1189:2;1228:22;;72:20;97:33;72:20;97:33;:::i;:::-;1197:63;;;;886:390;;;;;:::o;1904:210::-;3105:13;;3098:21;1348:34;;2025:2;2010:18;;1996:118::o;2121:218::-;-1:-1;;;;;;3271:78;;;;1463:36;;2246:2;2231:18;;2217:122::o;2346:416::-;2546:2;2560:47;;;1736:2;2531:18;;;2873:19;1772:34;2913:14;;;1752:55;-1:-1;;;1827:12;;;1820:39;1878:12;;;2517:245::o;3489:117::-;-1:-1;;;;;3423:54;;3548:35;;3538:2;;3597:1;;3587:12;3538:2;3532:74;:::o",
  "source": "// \"SPDX-License-Identifier: Apache-2.0\"\npragma solidity ^0.6.11;\npragma experimental ABIEncoderV2;\n\nimport \"../BaseRegistryStorage.sol\";\nimport \"./IAccessControl.sol\";\n\n\ncontract AccessControl is BaseRegistryStorage, IAccessControl {\n\n    event GrantedAccess(bytes32 indexed assetId, address indexed account, bytes4 methodSignature);\n    event RevokedAccess(bytes32 indexed assetId, address indexed account, bytes4 methodSignature);\n\n\n    // Method signature == bytes4(0) := Access to all methods defined in the Asset Registry contract\n    bytes4 constant ROOT_ACCESS = 0;\n\n\n    modifier isAuthorized(bytes32 assetId) {\n        require(\n            msg.sender == assets[assetId].actor || hasAccess(assetId, msg.sig, msg.sender),\n            \"AccessControl.isAuthorized: UNAUTHORIZED_SENDER\"\n        );\n        _;\n    }\n\n    /**\n     * @notice Grant access to an account to call a specific method on a specific asset.\n     * @dev Can only be called by an authorized account.\n     * @param assetId id of the asset\n     * @param methodSignature function / method signature (4 byte keccak256 hash of the method selector)\n     * @param account address of the account to grant access to\n     */\n    function grantAccess(bytes32 assetId, bytes4 methodSignature, address account)\n        external\n        override\n    {\n        require(\n            hasAccess(assetId, msg.sig, msg.sender),\n            \"AccessControl.revokeAccess: UNAUTHORIZED_SENDER\"\n        );\n\n        assets[assetId].access[methodSignature][account] = true;\n\n        emit GrantedAccess(assetId, account, methodSignature);\n    }\n\n    /**\n     * @notice Revoke access for an account to call a specific method on a specific asset.\n     * @dev Can only be called by an authorized account.\n     * @param assetId id of the asset\n     * @param methodSignature function / method signature (4 byte keccak256 hash of the method selector)\n     * @param account address of the account to revoke access for\n     */\n    function revokeAccess(bytes32 assetId, bytes4 methodSignature, address account)\n        external\n        override\n    {\n        require(\n            hasAccess(assetId, msg.sig, msg.sender),\n            \"AccessControl.revokeAccess: UNAUTHORIZED_SENDER\"\n        );\n\n        assets[assetId].access[methodSignature][account] = false;\n\n        emit RevokedAccess(assetId, account, methodSignature);\n    }\n\n    /**\n     * @notice Check whether an account is allowed to call a specific method on a specific asset.\n     * @param assetId id of the asset\n     * @param methodSignature function / method signature (4 byte keccak256 hash of the method selector)\n     * @param account address of the account for which to check access\n     * @return true if allowed access\n     */\n    function hasAccess(bytes32 assetId, bytes4 methodSignature, address account)\n        public\n        override\n        returns (bool)\n    {\n        return (\n            assets[assetId].access[methodSignature][account] || assets[assetId].access[ROOT_ACCESS][account]\n        );\n    }\n\n    /**\n     * @notice Check whether an account has root access for a specific asset.\n     * @param assetId id of the asset\n     * @param account address of the account for which to check root acccess\n     * @return  true if has root access\n     */\n    function hasRootAccess(bytes32 assetId, address account)\n        public\n        override\n        returns (bool)\n    {\n        return (assets[assetId].access[ROOT_ACCESS][account]);\n    }\n\n    /**\n     * @notice Grant access to an account to call all methods on a specific asset\n     * (giving the account root access to an asset).\n     * @param assetId id of the asset\n     * @param account address of the account to set as the root\n     */\n    function setDefaultRoot(bytes32 assetId, address account) internal {\n        assets[assetId].access[ROOT_ACCESS][account] = true;\n        emit GrantedAccess(assetId, account, ROOT_ACCESS);\n    }\n}\n",
  "sourcePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/AccessControl/AccessControl.sol",
  "ast": {
    "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/AccessControl/AccessControl.sol",
    "exportedSymbols": {
      "AccessControl": [
        4083
      ]
    },
    "id": 4084,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3870,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".11"
        ],
        "nodeType": "PragmaDirective",
        "src": "41:24:6"
      },
      {
        "id": 3871,
        "literals": [
          "experimental",
          "ABIEncoderV2"
        ],
        "nodeType": "PragmaDirective",
        "src": "66:33:6"
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/BaseRegistryStorage.sol",
        "file": "../BaseRegistryStorage.sol",
        "id": 3872,
        "nodeType": "ImportDirective",
        "scope": 4084,
        "sourceUnit": 4479,
        "src": "101:36:6",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/AccessControl/IAccessControl.sol",
        "file": "./IAccessControl.sol",
        "id": 3873,
        "nodeType": "ImportDirective",
        "scope": 4084,
        "sourceUnit": 4126,
        "src": "138:30:6",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 3874,
              "name": "BaseRegistryStorage",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 4478,
              "src": "197:19:6",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_BaseRegistryStorage_$4478",
                "typeString": "contract BaseRegistryStorage"
              }
            },
            "id": 3875,
            "nodeType": "InheritanceSpecifier",
            "src": "197:19:6"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 3876,
              "name": "IAccessControl",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 4125,
              "src": "218:14:6",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IAccessControl_$4125",
                "typeString": "contract IAccessControl"
              }
            },
            "id": 3877,
            "nodeType": "InheritanceSpecifier",
            "src": "218:14:6"
          }
        ],
        "contractDependencies": [
          4125,
          4478
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 4083,
        "linearizedBaseContracts": [
          4083,
          4125,
          4478
        ],
        "name": "AccessControl",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": null,
            "id": 3885,
            "name": "GrantedAccess",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3884,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3879,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3885,
                  "src": "260:23:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3878,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "260:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3881,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3885,
                  "src": "285:23:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3880,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "285:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3883,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "methodSignature",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3885,
                  "src": "310:22:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 3882,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "310:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "259:74:6"
            },
            "src": "240:94:6"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3893,
            "name": "RevokedAccess",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3892,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3887,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3893,
                  "src": "359:23:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3886,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "359:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3889,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3893,
                  "src": "384:23:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3888,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "384:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3891,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "methodSignature",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3893,
                  "src": "409:22:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 3890,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "409:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "358:74:6"
            },
            "src": "339:94:6"
          },
          {
            "constant": true,
            "id": 3896,
            "mutability": "constant",
            "name": "ROOT_ACCESS",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 4083,
            "src": "541:31:6",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes4",
              "typeString": "bytes4"
            },
            "typeName": {
              "id": 3894,
              "name": "bytes4",
              "nodeType": "ElementaryTypeName",
              "src": "541:6:6",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes4",
                "typeString": "bytes4"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 3895,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "571:1:6",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3920,
              "nodeType": "Block",
              "src": "619:200:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 3915,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 3907,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3901,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "650:3:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3902,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "650:10:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 3903,
                                "name": "assets",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4477,
                                "src": "664:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                  "typeString": "mapping(bytes32 => struct Asset storage ref)"
                                }
                              },
                              "id": 3905,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3904,
                                "name": "assetId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3898,
                                "src": "671:7:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "664:15:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Asset_$4466_storage",
                                "typeString": "struct Asset storage ref"
                              }
                            },
                            "id": 3906,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "actor",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4439,
                            "src": "664:21:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "650:35:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3909,
                              "name": "assetId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3898,
                              "src": "699:7:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3910,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "708:3:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3911,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sig",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "708:7:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3912,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "717:3:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3913,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "717:10:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 3908,
                            "name": "hasAccess",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4034,
                            "src": "689:9:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes4_$_t_address_$returns$_t_bool_$",
                              "typeString": "function (bytes32,bytes4,address) returns (bool)"
                            }
                          },
                          "id": 3914,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "689:39:6",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "650:78:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c2e6973417574686f72697a65643a20554e415554484f52495a45445f53454e444552",
                        "id": 3916,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "742:49:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_5f7b2399c4eb8ffd97f008c0b2d3a2555ab409652249edcf425c49b3f270cdec",
                          "typeString": "literal_string \"AccessControl.isAuthorized: UNAUTHORIZED_SENDER\""
                        },
                        "value": "AccessControl.isAuthorized: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_5f7b2399c4eb8ffd97f008c0b2d3a2555ab409652249edcf425c49b3f270cdec",
                          "typeString": "literal_string \"AccessControl.isAuthorized: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 3900,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "629:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3917,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "629:172:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3918,
                  "nodeType": "ExpressionStatement",
                  "src": "629:172:6"
                },
                {
                  "id": 3919,
                  "nodeType": "PlaceholderStatement",
                  "src": "811:1:6"
                }
              ]
            },
            "documentation": null,
            "id": 3921,
            "name": "isAuthorized",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 3899,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3898,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3921,
                  "src": "602:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3897,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "602:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "601:17:6"
            },
            "src": "580:239:6",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              4095
            ],
            "body": {
              "id": 3960,
              "nodeType": "Block",
              "src": "1311:280:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 3934,
                            "name": "assetId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3924,
                            "src": "1352:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3935,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "1361:3:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3936,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sig",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1361:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3937,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "1370:3:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3938,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1370:10:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            },
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 3933,
                          "name": "hasAccess",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4034,
                          "src": "1342:9:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes4_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,bytes4,address) returns (bool)"
                          }
                        },
                        "id": 3939,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1342:39:6",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c2e7265766f6b654163636573733a20554e415554484f52495a45445f53454e444552",
                        "id": 3940,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1395:49:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_df6b6db5e9008dc4322f2359a37db8c8ad0191359c9867648a4e30a307c1cc30",
                          "typeString": "literal_string \"AccessControl.revokeAccess: UNAUTHORIZED_SENDER\""
                        },
                        "value": "AccessControl.revokeAccess: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_df6b6db5e9008dc4322f2359a37db8c8ad0191359c9867648a4e30a307c1cc30",
                          "typeString": "literal_string \"AccessControl.revokeAccess: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 3932,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1321:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3941,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1321:133:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3942,
                  "nodeType": "ExpressionStatement",
                  "src": "1321:133:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3952,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3943,
                              "name": "assets",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4477,
                              "src": "1465:6:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                "typeString": "mapping(bytes32 => struct Asset storage ref)"
                              }
                            },
                            "id": 3945,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3944,
                              "name": "assetId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3924,
                              "src": "1472:7:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "1465:15:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Asset_$4466_storage",
                              "typeString": "struct Asset storage ref"
                            }
                          },
                          "id": 3946,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "access",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 4453,
                          "src": "1465:22:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                            "typeString": "mapping(bytes4 => mapping(address => bool))"
                          }
                        },
                        "id": 3948,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3947,
                          "name": "methodSignature",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3926,
                          "src": "1488:15:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "1465:39:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 3950,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 3949,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3928,
                        "src": "1505:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1465:48:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 3951,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1516:4:6",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "1465:55:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 3953,
                  "nodeType": "ExpressionStatement",
                  "src": "1465:55:6"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3955,
                        "name": "assetId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3924,
                        "src": "1550:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3956,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3928,
                        "src": "1559:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3957,
                        "name": "methodSignature",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3926,
                        "src": "1568:15:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      ],
                      "id": 3954,
                      "name": "GrantedAccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3885,
                      "src": "1536:13:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_bytes4_$returns$__$",
                        "typeString": "function (bytes32,address,bytes4)"
                      }
                    },
                    "id": 3958,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1536:48:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3959,
                  "nodeType": "EmitStatement",
                  "src": "1531:53:6"
                }
              ]
            },
            "documentation": {
              "id": 3922,
              "nodeType": "StructuredDocumentation",
              "src": "825:364:6",
              "text": " @notice Grant access to an account to call a specific method on a specific asset.\n @dev Can only be called by an authorized account.\n @param assetId id of the asset\n @param methodSignature function / method signature (4 byte keccak256 hash of the method selector)\n @param account address of the account to grant access to"
            },
            "functionSelector": "1717e867",
            "id": 3961,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "grantAccess",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 3930,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1298:8:6"
            },
            "parameters": {
              "id": 3929,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3924,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3961,
                  "src": "1215:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3923,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1215:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3926,
                  "mutability": "mutable",
                  "name": "methodSignature",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3961,
                  "src": "1232:22:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 3925,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "1232:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3928,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3961,
                  "src": "1256:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3927,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1256:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1214:58:6"
            },
            "returnParameters": {
              "id": 3931,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1311:0:6"
            },
            "scope": 4083,
            "src": "1194:397:6",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              4104
            ],
            "body": {
              "id": 4000,
              "nodeType": "Block",
              "src": "2088:281:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 3974,
                            "name": "assetId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3964,
                            "src": "2129:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3975,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "2138:3:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3976,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sig",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "2138:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3977,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "2147:3:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3978,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "2147:10:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            },
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 3973,
                          "name": "hasAccess",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4034,
                          "src": "2119:9:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes4_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,bytes4,address) returns (bool)"
                          }
                        },
                        "id": 3979,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2119:39:6",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c2e7265766f6b654163636573733a20554e415554484f52495a45445f53454e444552",
                        "id": 3980,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2172:49:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_df6b6db5e9008dc4322f2359a37db8c8ad0191359c9867648a4e30a307c1cc30",
                          "typeString": "literal_string \"AccessControl.revokeAccess: UNAUTHORIZED_SENDER\""
                        },
                        "value": "AccessControl.revokeAccess: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_df6b6db5e9008dc4322f2359a37db8c8ad0191359c9867648a4e30a307c1cc30",
                          "typeString": "literal_string \"AccessControl.revokeAccess: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 3972,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2098:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3981,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2098:133:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3982,
                  "nodeType": "ExpressionStatement",
                  "src": "2098:133:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3992,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3983,
                              "name": "assets",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4477,
                              "src": "2242:6:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                "typeString": "mapping(bytes32 => struct Asset storage ref)"
                              }
                            },
                            "id": 3985,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3984,
                              "name": "assetId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3964,
                              "src": "2249:7:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2242:15:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Asset_$4466_storage",
                              "typeString": "struct Asset storage ref"
                            }
                          },
                          "id": 3986,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "access",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 4453,
                          "src": "2242:22:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                            "typeString": "mapping(bytes4 => mapping(address => bool))"
                          }
                        },
                        "id": 3988,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3987,
                          "name": "methodSignature",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3966,
                          "src": "2265:15:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "2242:39:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 3990,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 3989,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3968,
                        "src": "2282:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2242:48:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 3991,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2293:5:6",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "2242:56:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 3993,
                  "nodeType": "ExpressionStatement",
                  "src": "2242:56:6"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3995,
                        "name": "assetId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3964,
                        "src": "2328:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3996,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3968,
                        "src": "2337:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3997,
                        "name": "methodSignature",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3966,
                        "src": "2346:15:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      ],
                      "id": 3994,
                      "name": "RevokedAccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3893,
                      "src": "2314:13:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_bytes4_$returns$__$",
                        "typeString": "function (bytes32,address,bytes4)"
                      }
                    },
                    "id": 3998,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2314:48:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3999,
                  "nodeType": "EmitStatement",
                  "src": "2309:53:6"
                }
              ]
            },
            "documentation": {
              "id": 3962,
              "nodeType": "StructuredDocumentation",
              "src": "1597:368:6",
              "text": " @notice Revoke access for an account to call a specific method on a specific asset.\n @dev Can only be called by an authorized account.\n @param assetId id of the asset\n @param methodSignature function / method signature (4 byte keccak256 hash of the method selector)\n @param account address of the account to revoke access for"
            },
            "functionSelector": "39262e87",
            "id": 4001,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "revokeAccess",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 3970,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2075:8:6"
            },
            "parameters": {
              "id": 3969,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3964,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4001,
                  "src": "1992:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3963,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1992:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3966,
                  "mutability": "mutable",
                  "name": "methodSignature",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4001,
                  "src": "2009:22:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 3965,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "2009:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3968,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4001,
                  "src": "2033:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3967,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2033:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1991:58:6"
            },
            "returnParameters": {
              "id": 3971,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2088:0:6"
            },
            "scope": 4083,
            "src": "1970:399:6",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              4115
            ],
            "body": {
              "id": 4033,
              "nodeType": "Block",
              "src": "2877:144:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 4030,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 4014,
                                  "name": "assets",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4477,
                                  "src": "2908:6:6",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                    "typeString": "mapping(bytes32 => struct Asset storage ref)"
                                  }
                                },
                                "id": 4016,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4015,
                                  "name": "assetId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4004,
                                  "src": "2915:7:6",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "2908:15:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Asset_$4466_storage",
                                  "typeString": "struct Asset storage ref"
                                }
                              },
                              "id": 4017,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "access",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4453,
                              "src": "2908:22:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                                "typeString": "mapping(bytes4 => mapping(address => bool))"
                              }
                            },
                            "id": 4019,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4018,
                              "name": "methodSignature",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4006,
                              "src": "2931:15:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2908:39:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 4021,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4020,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4008,
                            "src": "2948:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2908:48:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 4022,
                                  "name": "assets",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4477,
                                  "src": "2960:6:6",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                    "typeString": "mapping(bytes32 => struct Asset storage ref)"
                                  }
                                },
                                "id": 4024,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4023,
                                  "name": "assetId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4004,
                                  "src": "2967:7:6",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "2960:15:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Asset_$4466_storage",
                                  "typeString": "struct Asset storage ref"
                                }
                              },
                              "id": 4025,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "access",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4453,
                              "src": "2960:22:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                                "typeString": "mapping(bytes4 => mapping(address => bool))"
                              }
                            },
                            "id": 4027,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4026,
                              "name": "ROOT_ACCESS",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3896,
                              "src": "2983:11:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2960:35:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 4029,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4028,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4008,
                            "src": "2996:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2960:44:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "2908:96:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "id": 4031,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "2894:120:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 4013,
                  "id": 4032,
                  "nodeType": "Return",
                  "src": "2887:127:6"
                }
              ]
            },
            "documentation": {
              "id": 4002,
              "nodeType": "StructuredDocumentation",
              "src": "2375:361:6",
              "text": " @notice Check whether an account is allowed to call a specific method on a specific asset.\n @param assetId id of the asset\n @param methodSignature function / method signature (4 byte keccak256 hash of the method selector)\n @param account address of the account for which to check access\n @return true if allowed access"
            },
            "functionSelector": "1b126815",
            "id": 4034,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "hasAccess",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 4010,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2841:8:6"
            },
            "parameters": {
              "id": 4009,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4004,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4034,
                  "src": "2760:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 4003,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2760:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4006,
                  "mutability": "mutable",
                  "name": "methodSignature",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4034,
                  "src": "2777:22:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 4005,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "2777:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4008,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4034,
                  "src": "2801:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4007,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2801:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2759:58:6"
            },
            "returnParameters": {
              "id": 4013,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4012,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4034,
                  "src": "2867:4:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 4011,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2867:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2866:6:6"
            },
            "scope": 4083,
            "src": "2741:280:6",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              4124
            ],
            "body": {
              "id": 4055,
              "nodeType": "Block",
              "src": "3392:70:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 4045,
                                "name": "assets",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4477,
                                "src": "3410:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                  "typeString": "mapping(bytes32 => struct Asset storage ref)"
                                }
                              },
                              "id": 4047,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4046,
                                "name": "assetId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4037,
                                "src": "3417:7:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "3410:15:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Asset_$4466_storage",
                                "typeString": "struct Asset storage ref"
                              }
                            },
                            "id": 4048,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "access",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4453,
                            "src": "3410:22:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                              "typeString": "mapping(bytes4 => mapping(address => bool))"
                            }
                          },
                          "id": 4050,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4049,
                            "name": "ROOT_ACCESS",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3896,
                            "src": "3433:11:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3410:35:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                            "typeString": "mapping(address => bool)"
                          }
                        },
                        "id": 4052,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 4051,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4039,
                          "src": "3446:7:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3410:44:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "id": 4053,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "3409:46:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 4044,
                  "id": 4054,
                  "nodeType": "Return",
                  "src": "3402:53:6"
                }
              ]
            },
            "documentation": {
              "id": 4035,
              "nodeType": "StructuredDocumentation",
              "src": "3027:244:6",
              "text": " @notice Check whether an account has root access for a specific asset.\n @param assetId id of the asset\n @param account address of the account for which to check root acccess\n @return  true if has root access"
            },
            "functionSelector": "e8f7ca3e",
            "id": 4056,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "hasRootAccess",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 4041,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3356:8:6"
            },
            "parameters": {
              "id": 4040,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4037,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4056,
                  "src": "3299:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 4036,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3299:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4039,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4056,
                  "src": "3316:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4038,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3316:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3298:34:6"
            },
            "returnParameters": {
              "id": 4044,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4043,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4056,
                  "src": "3382:4:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 4042,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3382:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3381:6:6"
            },
            "scope": 4083,
            "src": "3276:186:6",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 4081,
              "nodeType": "Block",
              "src": "3788:127:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4073,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 4064,
                              "name": "assets",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4477,
                              "src": "3798:6:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                "typeString": "mapping(bytes32 => struct Asset storage ref)"
                              }
                            },
                            "id": 4066,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4065,
                              "name": "assetId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4059,
                              "src": "3805:7:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "3798:15:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Asset_$4466_storage",
                              "typeString": "struct Asset storage ref"
                            }
                          },
                          "id": 4067,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "access",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 4453,
                          "src": "3798:22:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                            "typeString": "mapping(bytes4 => mapping(address => bool))"
                          }
                        },
                        "id": 4069,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 4068,
                          "name": "ROOT_ACCESS",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3896,
                          "src": "3821:11:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3798:35:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 4071,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 4070,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4061,
                        "src": "3834:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "3798:44:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 4072,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "3845:4:6",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "3798:51:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 4074,
                  "nodeType": "ExpressionStatement",
                  "src": "3798:51:6"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4076,
                        "name": "assetId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4059,
                        "src": "3878:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4077,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4061,
                        "src": "3887:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4078,
                        "name": "ROOT_ACCESS",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3896,
                        "src": "3896:11:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      ],
                      "id": 4075,
                      "name": "GrantedAccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3885,
                      "src": "3864:13:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_bytes4_$returns$__$",
                        "typeString": "function (bytes32,address,bytes4)"
                      }
                    },
                    "id": 4079,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3864:44:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4080,
                  "nodeType": "EmitStatement",
                  "src": "3859:49:6"
                }
              ]
            },
            "documentation": {
              "id": 4057,
              "nodeType": "StructuredDocumentation",
              "src": "3468:248:6",
              "text": " @notice Grant access to an account to call all methods on a specific asset\n (giving the account root access to an asset).\n @param assetId id of the asset\n @param account address of the account to set as the root"
            },
            "id": 4082,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setDefaultRoot",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 4062,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4059,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4082,
                  "src": "3745:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 4058,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3745:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4061,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4082,
                  "src": "3762:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4060,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3762:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3744:34:6"
            },
            "returnParameters": {
              "id": 4063,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3788:0:6"
            },
            "scope": 4083,
            "src": "3721:194:6",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 4084,
        "src": "171:3746:6"
      }
    ],
    "src": "41:3877:6"
  },
  "legacyAST": {
    "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/AccessControl/AccessControl.sol",
    "exportedSymbols": {
      "AccessControl": [
        4083
      ]
    },
    "id": 4084,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3870,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".11"
        ],
        "nodeType": "PragmaDirective",
        "src": "41:24:6"
      },
      {
        "id": 3871,
        "literals": [
          "experimental",
          "ABIEncoderV2"
        ],
        "nodeType": "PragmaDirective",
        "src": "66:33:6"
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/BaseRegistryStorage.sol",
        "file": "../BaseRegistryStorage.sol",
        "id": 3872,
        "nodeType": "ImportDirective",
        "scope": 4084,
        "sourceUnit": 4479,
        "src": "101:36:6",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/Core/Base/AssetRegistry/AccessControl/IAccessControl.sol",
        "file": "./IAccessControl.sol",
        "id": 3873,
        "nodeType": "ImportDirective",
        "scope": 4084,
        "sourceUnit": 4126,
        "src": "138:30:6",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 3874,
              "name": "BaseRegistryStorage",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 4478,
              "src": "197:19:6",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_BaseRegistryStorage_$4478",
                "typeString": "contract BaseRegistryStorage"
              }
            },
            "id": 3875,
            "nodeType": "InheritanceSpecifier",
            "src": "197:19:6"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 3876,
              "name": "IAccessControl",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 4125,
              "src": "218:14:6",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IAccessControl_$4125",
                "typeString": "contract IAccessControl"
              }
            },
            "id": 3877,
            "nodeType": "InheritanceSpecifier",
            "src": "218:14:6"
          }
        ],
        "contractDependencies": [
          4125,
          4478
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 4083,
        "linearizedBaseContracts": [
          4083,
          4125,
          4478
        ],
        "name": "AccessControl",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": null,
            "id": 3885,
            "name": "GrantedAccess",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3884,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3879,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3885,
                  "src": "260:23:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3878,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "260:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3881,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3885,
                  "src": "285:23:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3880,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "285:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3883,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "methodSignature",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3885,
                  "src": "310:22:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 3882,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "310:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "259:74:6"
            },
            "src": "240:94:6"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3893,
            "name": "RevokedAccess",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3892,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3887,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3893,
                  "src": "359:23:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3886,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "359:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3889,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3893,
                  "src": "384:23:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3888,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "384:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3891,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "methodSignature",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3893,
                  "src": "409:22:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 3890,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "409:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "358:74:6"
            },
            "src": "339:94:6"
          },
          {
            "constant": true,
            "id": 3896,
            "mutability": "constant",
            "name": "ROOT_ACCESS",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 4083,
            "src": "541:31:6",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes4",
              "typeString": "bytes4"
            },
            "typeName": {
              "id": 3894,
              "name": "bytes4",
              "nodeType": "ElementaryTypeName",
              "src": "541:6:6",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes4",
                "typeString": "bytes4"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 3895,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "571:1:6",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3920,
              "nodeType": "Block",
              "src": "619:200:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 3915,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 3907,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3901,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "650:3:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3902,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "650:10:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 3903,
                                "name": "assets",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4477,
                                "src": "664:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                  "typeString": "mapping(bytes32 => struct Asset storage ref)"
                                }
                              },
                              "id": 3905,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 3904,
                                "name": "assetId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3898,
                                "src": "671:7:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "664:15:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Asset_$4466_storage",
                                "typeString": "struct Asset storage ref"
                              }
                            },
                            "id": 3906,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "actor",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4439,
                            "src": "664:21:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "650:35:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3909,
                              "name": "assetId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3898,
                              "src": "699:7:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3910,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "708:3:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3911,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sig",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "708:7:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3912,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "717:3:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3913,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "717:10:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 3908,
                            "name": "hasAccess",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4034,
                            "src": "689:9:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes4_$_t_address_$returns$_t_bool_$",
                              "typeString": "function (bytes32,bytes4,address) returns (bool)"
                            }
                          },
                          "id": 3914,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "689:39:6",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "650:78:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c2e6973417574686f72697a65643a20554e415554484f52495a45445f53454e444552",
                        "id": 3916,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "742:49:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_5f7b2399c4eb8ffd97f008c0b2d3a2555ab409652249edcf425c49b3f270cdec",
                          "typeString": "literal_string \"AccessControl.isAuthorized: UNAUTHORIZED_SENDER\""
                        },
                        "value": "AccessControl.isAuthorized: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_5f7b2399c4eb8ffd97f008c0b2d3a2555ab409652249edcf425c49b3f270cdec",
                          "typeString": "literal_string \"AccessControl.isAuthorized: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 3900,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "629:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3917,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "629:172:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3918,
                  "nodeType": "ExpressionStatement",
                  "src": "629:172:6"
                },
                {
                  "id": 3919,
                  "nodeType": "PlaceholderStatement",
                  "src": "811:1:6"
                }
              ]
            },
            "documentation": null,
            "id": 3921,
            "name": "isAuthorized",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 3899,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3898,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3921,
                  "src": "602:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3897,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "602:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "601:17:6"
            },
            "src": "580:239:6",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              4095
            ],
            "body": {
              "id": 3960,
              "nodeType": "Block",
              "src": "1311:280:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 3934,
                            "name": "assetId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3924,
                            "src": "1352:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3935,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "1361:3:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3936,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sig",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1361:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3937,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "1370:3:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3938,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1370:10:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            },
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 3933,
                          "name": "hasAccess",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4034,
                          "src": "1342:9:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes4_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,bytes4,address) returns (bool)"
                          }
                        },
                        "id": 3939,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1342:39:6",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c2e7265766f6b654163636573733a20554e415554484f52495a45445f53454e444552",
                        "id": 3940,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1395:49:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_df6b6db5e9008dc4322f2359a37db8c8ad0191359c9867648a4e30a307c1cc30",
                          "typeString": "literal_string \"AccessControl.revokeAccess: UNAUTHORIZED_SENDER\""
                        },
                        "value": "AccessControl.revokeAccess: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_df6b6db5e9008dc4322f2359a37db8c8ad0191359c9867648a4e30a307c1cc30",
                          "typeString": "literal_string \"AccessControl.revokeAccess: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 3932,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1321:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3941,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1321:133:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3942,
                  "nodeType": "ExpressionStatement",
                  "src": "1321:133:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3952,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3943,
                              "name": "assets",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4477,
                              "src": "1465:6:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                "typeString": "mapping(bytes32 => struct Asset storage ref)"
                              }
                            },
                            "id": 3945,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3944,
                              "name": "assetId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3924,
                              "src": "1472:7:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "1465:15:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Asset_$4466_storage",
                              "typeString": "struct Asset storage ref"
                            }
                          },
                          "id": 3946,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "access",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 4453,
                          "src": "1465:22:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                            "typeString": "mapping(bytes4 => mapping(address => bool))"
                          }
                        },
                        "id": 3948,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3947,
                          "name": "methodSignature",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3926,
                          "src": "1488:15:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "1465:39:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 3950,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 3949,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3928,
                        "src": "1505:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1465:48:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 3951,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1516:4:6",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "1465:55:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 3953,
                  "nodeType": "ExpressionStatement",
                  "src": "1465:55:6"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3955,
                        "name": "assetId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3924,
                        "src": "1550:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3956,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3928,
                        "src": "1559:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3957,
                        "name": "methodSignature",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3926,
                        "src": "1568:15:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      ],
                      "id": 3954,
                      "name": "GrantedAccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3885,
                      "src": "1536:13:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_bytes4_$returns$__$",
                        "typeString": "function (bytes32,address,bytes4)"
                      }
                    },
                    "id": 3958,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1536:48:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3959,
                  "nodeType": "EmitStatement",
                  "src": "1531:53:6"
                }
              ]
            },
            "documentation": {
              "id": 3922,
              "nodeType": "StructuredDocumentation",
              "src": "825:364:6",
              "text": " @notice Grant access to an account to call a specific method on a specific asset.\n @dev Can only be called by an authorized account.\n @param assetId id of the asset\n @param methodSignature function / method signature (4 byte keccak256 hash of the method selector)\n @param account address of the account to grant access to"
            },
            "functionSelector": "1717e867",
            "id": 3961,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "grantAccess",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 3930,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1298:8:6"
            },
            "parameters": {
              "id": 3929,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3924,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3961,
                  "src": "1215:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3923,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1215:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3926,
                  "mutability": "mutable",
                  "name": "methodSignature",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3961,
                  "src": "1232:22:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 3925,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "1232:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3928,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3961,
                  "src": "1256:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3927,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1256:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1214:58:6"
            },
            "returnParameters": {
              "id": 3931,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1311:0:6"
            },
            "scope": 4083,
            "src": "1194:397:6",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              4104
            ],
            "body": {
              "id": 4000,
              "nodeType": "Block",
              "src": "2088:281:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 3974,
                            "name": "assetId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3964,
                            "src": "2129:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3975,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "2138:3:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3976,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sig",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "2138:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3977,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "2147:3:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 3978,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "2147:10:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            },
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 3973,
                          "name": "hasAccess",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4034,
                          "src": "2119:9:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes4_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,bytes4,address) returns (bool)"
                          }
                        },
                        "id": 3979,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2119:39:6",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c2e7265766f6b654163636573733a20554e415554484f52495a45445f53454e444552",
                        "id": 3980,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2172:49:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_df6b6db5e9008dc4322f2359a37db8c8ad0191359c9867648a4e30a307c1cc30",
                          "typeString": "literal_string \"AccessControl.revokeAccess: UNAUTHORIZED_SENDER\""
                        },
                        "value": "AccessControl.revokeAccess: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_df6b6db5e9008dc4322f2359a37db8c8ad0191359c9867648a4e30a307c1cc30",
                          "typeString": "literal_string \"AccessControl.revokeAccess: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 3972,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2098:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 3981,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2098:133:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3982,
                  "nodeType": "ExpressionStatement",
                  "src": "2098:133:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 3992,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3983,
                              "name": "assets",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4477,
                              "src": "2242:6:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                "typeString": "mapping(bytes32 => struct Asset storage ref)"
                              }
                            },
                            "id": 3985,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3984,
                              "name": "assetId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3964,
                              "src": "2249:7:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2242:15:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Asset_$4466_storage",
                              "typeString": "struct Asset storage ref"
                            }
                          },
                          "id": 3986,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "access",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 4453,
                          "src": "2242:22:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                            "typeString": "mapping(bytes4 => mapping(address => bool))"
                          }
                        },
                        "id": 3988,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3987,
                          "name": "methodSignature",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3966,
                          "src": "2265:15:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "2242:39:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 3990,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 3989,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3968,
                        "src": "2282:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2242:48:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 3991,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2293:5:6",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "2242:56:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 3993,
                  "nodeType": "ExpressionStatement",
                  "src": "2242:56:6"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3995,
                        "name": "assetId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3964,
                        "src": "2328:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3996,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3968,
                        "src": "2337:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3997,
                        "name": "methodSignature",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3966,
                        "src": "2346:15:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      ],
                      "id": 3994,
                      "name": "RevokedAccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3893,
                      "src": "2314:13:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_bytes4_$returns$__$",
                        "typeString": "function (bytes32,address,bytes4)"
                      }
                    },
                    "id": 3998,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2314:48:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3999,
                  "nodeType": "EmitStatement",
                  "src": "2309:53:6"
                }
              ]
            },
            "documentation": {
              "id": 3962,
              "nodeType": "StructuredDocumentation",
              "src": "1597:368:6",
              "text": " @notice Revoke access for an account to call a specific method on a specific asset.\n @dev Can only be called by an authorized account.\n @param assetId id of the asset\n @param methodSignature function / method signature (4 byte keccak256 hash of the method selector)\n @param account address of the account to revoke access for"
            },
            "functionSelector": "39262e87",
            "id": 4001,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "revokeAccess",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 3970,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2075:8:6"
            },
            "parameters": {
              "id": 3969,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3964,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4001,
                  "src": "1992:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 3963,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1992:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3966,
                  "mutability": "mutable",
                  "name": "methodSignature",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4001,
                  "src": "2009:22:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 3965,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "2009:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3968,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4001,
                  "src": "2033:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3967,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2033:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1991:58:6"
            },
            "returnParameters": {
              "id": 3971,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2088:0:6"
            },
            "scope": 4083,
            "src": "1970:399:6",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              4115
            ],
            "body": {
              "id": 4033,
              "nodeType": "Block",
              "src": "2877:144:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 4030,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 4014,
                                  "name": "assets",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4477,
                                  "src": "2908:6:6",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                    "typeString": "mapping(bytes32 => struct Asset storage ref)"
                                  }
                                },
                                "id": 4016,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4015,
                                  "name": "assetId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4004,
                                  "src": "2915:7:6",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "2908:15:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Asset_$4466_storage",
                                  "typeString": "struct Asset storage ref"
                                }
                              },
                              "id": 4017,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "access",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4453,
                              "src": "2908:22:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                                "typeString": "mapping(bytes4 => mapping(address => bool))"
                              }
                            },
                            "id": 4019,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4018,
                              "name": "methodSignature",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4006,
                              "src": "2931:15:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2908:39:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 4021,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4020,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4008,
                            "src": "2948:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2908:48:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 4022,
                                  "name": "assets",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4477,
                                  "src": "2960:6:6",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                    "typeString": "mapping(bytes32 => struct Asset storage ref)"
                                  }
                                },
                                "id": 4024,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4023,
                                  "name": "assetId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4004,
                                  "src": "2967:7:6",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "2960:15:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Asset_$4466_storage",
                                  "typeString": "struct Asset storage ref"
                                }
                              },
                              "id": 4025,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "access",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4453,
                              "src": "2960:22:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                                "typeString": "mapping(bytes4 => mapping(address => bool))"
                              }
                            },
                            "id": 4027,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4026,
                              "name": "ROOT_ACCESS",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3896,
                              "src": "2983:11:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2960:35:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 4029,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4028,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4008,
                            "src": "2996:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2960:44:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "2908:96:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "id": 4031,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "2894:120:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 4013,
                  "id": 4032,
                  "nodeType": "Return",
                  "src": "2887:127:6"
                }
              ]
            },
            "documentation": {
              "id": 4002,
              "nodeType": "StructuredDocumentation",
              "src": "2375:361:6",
              "text": " @notice Check whether an account is allowed to call a specific method on a specific asset.\n @param assetId id of the asset\n @param methodSignature function / method signature (4 byte keccak256 hash of the method selector)\n @param account address of the account for which to check access\n @return true if allowed access"
            },
            "functionSelector": "1b126815",
            "id": 4034,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "hasAccess",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 4010,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2841:8:6"
            },
            "parameters": {
              "id": 4009,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4004,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4034,
                  "src": "2760:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 4003,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2760:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4006,
                  "mutability": "mutable",
                  "name": "methodSignature",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4034,
                  "src": "2777:22:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 4005,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "2777:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4008,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4034,
                  "src": "2801:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4007,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2801:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2759:58:6"
            },
            "returnParameters": {
              "id": 4013,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4012,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4034,
                  "src": "2867:4:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 4011,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2867:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2866:6:6"
            },
            "scope": 4083,
            "src": "2741:280:6",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              4124
            ],
            "body": {
              "id": 4055,
              "nodeType": "Block",
              "src": "3392:70:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 4045,
                                "name": "assets",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4477,
                                "src": "3410:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                  "typeString": "mapping(bytes32 => struct Asset storage ref)"
                                }
                              },
                              "id": 4047,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 4046,
                                "name": "assetId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4037,
                                "src": "3417:7:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "3410:15:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Asset_$4466_storage",
                                "typeString": "struct Asset storage ref"
                              }
                            },
                            "id": 4048,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "access",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4453,
                            "src": "3410:22:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                              "typeString": "mapping(bytes4 => mapping(address => bool))"
                            }
                          },
                          "id": 4050,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4049,
                            "name": "ROOT_ACCESS",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3896,
                            "src": "3433:11:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3410:35:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                            "typeString": "mapping(address => bool)"
                          }
                        },
                        "id": 4052,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 4051,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4039,
                          "src": "3446:7:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3410:44:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "id": 4053,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "3409:46:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 4044,
                  "id": 4054,
                  "nodeType": "Return",
                  "src": "3402:53:6"
                }
              ]
            },
            "documentation": {
              "id": 4035,
              "nodeType": "StructuredDocumentation",
              "src": "3027:244:6",
              "text": " @notice Check whether an account has root access for a specific asset.\n @param assetId id of the asset\n @param account address of the account for which to check root acccess\n @return  true if has root access"
            },
            "functionSelector": "e8f7ca3e",
            "id": 4056,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "hasRootAccess",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 4041,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3356:8:6"
            },
            "parameters": {
              "id": 4040,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4037,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4056,
                  "src": "3299:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 4036,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3299:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4039,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4056,
                  "src": "3316:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4038,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3316:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3298:34:6"
            },
            "returnParameters": {
              "id": 4044,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4043,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4056,
                  "src": "3382:4:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 4042,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3382:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3381:6:6"
            },
            "scope": 4083,
            "src": "3276:186:6",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 4081,
              "nodeType": "Block",
              "src": "3788:127:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4073,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 4064,
                              "name": "assets",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4477,
                              "src": "3798:6:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Asset_$4466_storage_$",
                                "typeString": "mapping(bytes32 => struct Asset storage ref)"
                              }
                            },
                            "id": 4066,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4065,
                              "name": "assetId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4059,
                              "src": "3805:7:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "3798:15:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Asset_$4466_storage",
                              "typeString": "struct Asset storage ref"
                            }
                          },
                          "id": 4067,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "access",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 4453,
                          "src": "3798:22:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_bytes4_$_t_mapping$_t_address_$_t_bool_$_$",
                            "typeString": "mapping(bytes4 => mapping(address => bool))"
                          }
                        },
                        "id": 4069,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 4068,
                          "name": "ROOT_ACCESS",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3896,
                          "src": "3821:11:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3798:35:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 4071,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 4070,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4061,
                        "src": "3834:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "3798:44:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 4072,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "3845:4:6",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "3798:51:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 4074,
                  "nodeType": "ExpressionStatement",
                  "src": "3798:51:6"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4076,
                        "name": "assetId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4059,
                        "src": "3878:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4077,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4061,
                        "src": "3887:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 4078,
                        "name": "ROOT_ACCESS",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3896,
                        "src": "3896:11:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      ],
                      "id": 4075,
                      "name": "GrantedAccess",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3885,
                      "src": "3864:13:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_bytes4_$returns$__$",
                        "typeString": "function (bytes32,address,bytes4)"
                      }
                    },
                    "id": 4079,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3864:44:6",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4080,
                  "nodeType": "EmitStatement",
                  "src": "3859:49:6"
                }
              ]
            },
            "documentation": {
              "id": 4057,
              "nodeType": "StructuredDocumentation",
              "src": "3468:248:6",
              "text": " @notice Grant access to an account to call all methods on a specific asset\n (giving the account root access to an asset).\n @param assetId id of the asset\n @param account address of the account to set as the root"
            },
            "id": 4082,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setDefaultRoot",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 4062,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4059,
                  "mutability": "mutable",
                  "name": "assetId",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4082,
                  "src": "3745:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 4058,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3745:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4061,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4082,
                  "src": "3762:15:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4060,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3762:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3744:34:6"
            },
            "returnParameters": {
              "id": 4063,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3788:0:6"
            },
            "scope": 4083,
            "src": "3721:194:6",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 4084,
        "src": "171:3746:6"
      }
    ],
    "src": "41:3877:6"
  },
  "compiler": {
    "name": "solc",
    "version": "0.6.11+commit.5ef660b1.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.2.0",
  "updatedAt": "2020-08-12T09:47:17.667Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "grantAccess(bytes32,bytes4,address)": {
        "details": "Can only be called by an authorized account.",
        "params": {
          "account": "address of the account to grant access to",
          "assetId": "id of the asset",
          "methodSignature": "function / method signature (4 byte keccak256 hash of the method selector)"
        }
      },
      "hasAccess(bytes32,bytes4,address)": {
        "params": {
          "account": "address of the account for which to check access",
          "assetId": "id of the asset",
          "methodSignature": "function / method signature (4 byte keccak256 hash of the method selector)"
        },
        "returns": {
          "_0": "true if allowed access"
        }
      },
      "hasRootAccess(bytes32,address)": {
        "params": {
          "account": "address of the account for which to check root acccess",
          "assetId": "id of the asset"
        },
        "returns": {
          "_0": "true if has root access"
        }
      },
      "revokeAccess(bytes32,bytes4,address)": {
        "details": "Can only be called by an authorized account.",
        "params": {
          "account": "address of the account to revoke access for",
          "assetId": "id of the asset",
          "methodSignature": "function / method signature (4 byte keccak256 hash of the method selector)"
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "grantAccess(bytes32,bytes4,address)": {
        "notice": "Grant access to an account to call a specific method on a specific asset."
      },
      "hasAccess(bytes32,bytes4,address)": {
        "notice": "Check whether an account is allowed to call a specific method on a specific asset."
      },
      "hasRootAccess(bytes32,address)": {
        "notice": "Check whether an account has root access for a specific asset."
      },
      "revokeAccess(bytes32,bytes4,address)": {
        "notice": "Revoke access for an account to call a specific method on a specific asset."
      }
    },
    "version": 1
  }
}