{"contractName":"Moduleable","abi":[{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"},{"name":"","type":"uint256"}],"name":"modules","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"moduleType","type":"uint8"},{"indexed":false,"name":"moduleName","type":"bytes32"},{"indexed":false,"name":"moduleAddress","type":"address"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogModuleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"moduleType","type":"uint8"},{"indexed":false,"name":"moduleAddress","type":"address"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogModuleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"moduleIndex","type":"uint256"},{"indexed":false,"name":"moduleType","type":"uint8"},{"indexed":false,"name":"moduleAddress","type":"address"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogModuleIndexUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"constant":false,"inputs":[{"name":"_moduleAddress","type":"address"}],"name":"addModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_moduleType","type":"uint8"},{"name":"_moduleIndex","type":"uint8"}],"name":"removeModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_moduleType","type":"uint8"},{"name":"_moduleIndex","type":"uint256"}],"name":"getModuleByTypeAndIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}],"bytecode":"0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110c4806100536000396000f300608060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631b2ae899146100885780631ed86f19146100c5578063715018a614610108578063729d20e21461011f5780638da5cb5b14610199578063952e813a146101f0578063f2fde38b1461026a575b600080fd5b34801561009457600080fd5b506100c3600480360381019080803560ff169060200190929190803560ff1690602001909291905050506102ad565b005b3480156100d157600080fd5b50610106600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061084f565b005b34801561011457600080fd5b5061011d610cc2565b005b34801561012b57600080fd5b50610157600480360381019080803560ff16906020019092919080359060200190929190505050610dc4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101a557600080fd5b506101ae610e11565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101fc57600080fd5b50610228600480360381019080803560ff16906020019092919080359060200190929190505050610e36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561027657600080fd5b506102ab600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ee6565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561030a57600080fd5b600160008460ff1660ff168152602001908152602001600020805490508260ff161015156103a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d6f64756c6520696e646578206973206f7574206f662072616e67650000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008560ff1660ff1681526020019081526020016000208360ff168154811015156103e157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156104be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f4d6f64756c6520636f6e747261637420616464726573732073686f756c64206e81526020017f6f7420626520307800000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b7fe69a96f148bcf365cf82241853ecbeb32c5b01500d98bf3d93ee870cd951162c83600160008660ff1660ff1681526020019081526020016000208460ff1681548110151561050957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1642604051808460ff1660ff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a160018060008560ff1660ff16815260200190815260200160002080549050039050600081141561062a576000600160008560ff1660ff16815260200190815260200160002060008154811015156105dd57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061084a565b600160008460ff1660ff1681526020019081526020016000208181548110151561065057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008560ff1660ff1681526020019081526020016000208360ff168154811015156106a457fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160008460ff1660ff1681526020019081526020016000208181548110151561071257fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905580600160008560ff1660ff168152602001908152602001600020816107649190611047565b50808260ff16141515610849577f3bc6126d484bf1cd8fb4d6b001df8731bf5e4005b7476d31b07fd1b6caff39e68284600160008760ff1660ff1681526020019081526020016000208560ff168154811015156107bd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1642604051808560ff1681526020018460ff1660ff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060405180910390a15b5b505050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108af57600080fd5b8392508273ffffffffffffffffffffffffffffffffffffffff166315dae03e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561091657600080fd5b505af115801561092a573d6000803e3d6000fd5b505050506040513d602081101561094057600080fd5b810190808051906020019092919050505091508273ffffffffffffffffffffffffffffffffffffffff166317d7de7c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156109b757600080fd5b505af11580156109cb573d6000803e3d6000fd5b505050506040513d60208110156109e157600080fd5b8101908080519060200190929190505050905060018060008460ff1660ff16815260200190815260200160002080549050148015610a9c5750600073ffffffffffffffffffffffffffffffffffffffff16600160008460ff1660ff1681526020019081526020016000206000815481101515610a5957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15610b165783600160008460ff1660ff1681526020019081526020016000206000815481101515610ac957fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b94565b600160008360ff1660ff1681526020019081526020016000208490806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b7f81c67b957de128754e728f8b3e8cbf6483f273a9a6a59d7affe331beaf48ea1682828642604051808560ff1660ff16815260200184600019166000191681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060405180910390a17f3bc6126d484bf1cd8fb4d6b001df8731bf5e4005b7476d31b07fd1b6caff39e660018060008560ff1660ff1681526020019081526020016000208054905003838642604051808581526020018460ff1660ff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d1d57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600160205281600052604060002081815481101515610ddf57fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600160008560ff1660ff16815260200190815260200160002080549050118015610e7e5750600160008460ff1660ff1681526020019081526020016000208054905082105b15610edb57600160008460ff1660ff16815260200190815260200160002082815481101515610ea957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610ee0565b600090505b92915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f4157600080fd5b610f4a81610f4d565b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f8957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b81548183558181111561106e5781836000526020600020918201910161106d9190611073565b5b505050565b61109591905b80821115611091576000816000905550600101611079565b5090565b905600a165627a7a723058207ce869dd113857774ebda45004b20f0961d017f8ef6857ce8db106553157b6ef0029","deployedBytecode":"0x608060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631b2ae899146100885780631ed86f19146100c5578063715018a614610108578063729d20e21461011f5780638da5cb5b14610199578063952e813a146101f0578063f2fde38b1461026a575b600080fd5b34801561009457600080fd5b506100c3600480360381019080803560ff169060200190929190803560ff1690602001909291905050506102ad565b005b3480156100d157600080fd5b50610106600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061084f565b005b34801561011457600080fd5b5061011d610cc2565b005b34801561012b57600080fd5b50610157600480360381019080803560ff16906020019092919080359060200190929190505050610dc4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101a557600080fd5b506101ae610e11565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101fc57600080fd5b50610228600480360381019080803560ff16906020019092919080359060200190929190505050610e36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561027657600080fd5b506102ab600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ee6565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561030a57600080fd5b600160008460ff1660ff168152602001908152602001600020805490508260ff161015156103a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d6f64756c6520696e646578206973206f7574206f662072616e67650000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008560ff1660ff1681526020019081526020016000208360ff168154811015156103e157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156104be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f4d6f64756c6520636f6e747261637420616464726573732073686f756c64206e81526020017f6f7420626520307800000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b7fe69a96f148bcf365cf82241853ecbeb32c5b01500d98bf3d93ee870cd951162c83600160008660ff1660ff1681526020019081526020016000208460ff1681548110151561050957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1642604051808460ff1660ff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a160018060008560ff1660ff16815260200190815260200160002080549050039050600081141561062a576000600160008560ff1660ff16815260200190815260200160002060008154811015156105dd57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061084a565b600160008460ff1660ff1681526020019081526020016000208181548110151561065057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008560ff1660ff1681526020019081526020016000208360ff168154811015156106a457fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160008460ff1660ff1681526020019081526020016000208181548110151561071257fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905580600160008560ff1660ff168152602001908152602001600020816107649190611047565b50808260ff16141515610849577f3bc6126d484bf1cd8fb4d6b001df8731bf5e4005b7476d31b07fd1b6caff39e68284600160008760ff1660ff1681526020019081526020016000208560ff168154811015156107bd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1642604051808560ff1681526020018460ff1660ff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060405180910390a15b5b505050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108af57600080fd5b8392508273ffffffffffffffffffffffffffffffffffffffff166315dae03e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561091657600080fd5b505af115801561092a573d6000803e3d6000fd5b505050506040513d602081101561094057600080fd5b810190808051906020019092919050505091508273ffffffffffffffffffffffffffffffffffffffff166317d7de7c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156109b757600080fd5b505af11580156109cb573d6000803e3d6000fd5b505050506040513d60208110156109e157600080fd5b8101908080519060200190929190505050905060018060008460ff1660ff16815260200190815260200160002080549050148015610a9c5750600073ffffffffffffffffffffffffffffffffffffffff16600160008460ff1660ff1681526020019081526020016000206000815481101515610a5957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15610b165783600160008460ff1660ff1681526020019081526020016000206000815481101515610ac957fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b94565b600160008360ff1660ff1681526020019081526020016000208490806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b7f81c67b957de128754e728f8b3e8cbf6483f273a9a6a59d7affe331beaf48ea1682828642604051808560ff1660ff16815260200184600019166000191681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060405180910390a17f3bc6126d484bf1cd8fb4d6b001df8731bf5e4005b7476d31b07fd1b6caff39e660018060008560ff1660ff1681526020019081526020016000208054905003838642604051808581526020018460ff1660ff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d1d57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600160205281600052604060002081815481101515610ddf57fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600160008560ff1660ff16815260200190815260200160002080549050118015610e7e5750600160008460ff1660ff1681526020019081526020016000208054905082105b15610edb57600160008460ff1660ff16815260200190815260200160002082815481101515610ea957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610ee0565b600090505b92915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f4157600080fd5b610f4a81610f4d565b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f8957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b81548183558181111561106e5781836000526020600020918201910161106d9190611073565b5b505050565b61109591905b80821115611091576000816000905550600101611079565b5090565b905600a165627a7a723058207ce869dd113857774ebda45004b20f0961d017f8ef6857ce8db106553157b6ef0029","source":"pragma solidity 0.4.24;\n\nimport \"openzeppelin-solidity/contracts/ownership/Ownable.sol\";\nimport \"../interfaces/IModuleContract.sol\";\n\n/**\n * @title Moduleable\n * @dev Base contract which allows children to add or remove module contracts\n */\ncontract Moduleable is Ownable {\n    /*----------- Globals -----------*/\n    mapping (uint8 => address[]) public modules;\n\n    /*----------- Events -----------*/\n    event LogModuleAdded(\n      uint8 moduleType,\n      bytes32 moduleName,\n      address moduleAddress,\n      uint256 timestamp\n    );\n\n    event LogModuleRemoved(\n      uint8 moduleType,\n      address moduleAddress,\n      uint256 timestamp\n    );\n\n    event LogModuleIndexUpdate(\n      uint256 moduleIndex,\n      uint8 moduleType,\n      address moduleAddress,\n      uint256 timestamp\n    );\n\n    /*----------- Methods -----------*/\n    /**\n    * @notice Function used to attach the module to the Asset Token\n    * @param _moduleAddress Contract address of the module that needs to be attached\n    */\n    function addModule(\n        IModuleContract _moduleAddress\n    ) external onlyOwner {\n        // Add to Asset Token module map    \n        IModuleContract moduleContract = IModuleContract(_moduleAddress);\n        uint8 moduleType = moduleContract.getType();\n\n        bytes32 moduleName = moduleContract.getName();\n\n        // Resolves the case where modules were added, then all removed, and new modules added.\n        if(modules[moduleType].length == 1 && modules[moduleType][0] == address(0)) {\n            modules[moduleType][0] = _moduleAddress;\n        } else {\n            modules[moduleType].push(_moduleAddress);        \n        }\n\n        // Emit log event\n        emit LogModuleAdded(\n            moduleType,\n            moduleName,\n            _moduleAddress,\n            block.timestamp // solhint-disable-line no-block-members\n        );\n\n        // Emit Index event\n        emit LogModuleIndexUpdate(\n            modules[moduleType].length - 1,\n            moduleType,\n            _moduleAddress,\n            block.timestamp // solhint-disable-line no-block-members\n        );\n    }\n\n    /**\n    * @notice Removes a module attached to the Asset Token\n    * @param _moduleType is which type of module we are trying to remove\n    * @param _moduleIndex is the index of the module within the chosen type\n    */\n    function removeModule(\n        uint8 _moduleType,\n        uint8 _moduleIndex\n    ) external onlyOwner {\n        require(\n            _moduleIndex < modules[_moduleType].length,\n            \"Module index is out of range\"\n        );\n        require(\n            modules[_moduleType][_moduleIndex] != address(0),\n            \"Module contract address should not be 0x\"\n        );\n\n        // Emit the event before removing the index\n        emit LogModuleRemoved(\n            _moduleType,\n            modules[_moduleType][_moduleIndex],\n            block.timestamp // solhint-disable-line no-block-members\n        );\n\n        uint lastIndex = modules[_moduleType].length - 1;\n        if(lastIndex == 0) {\n            modules[_moduleType][0] = address(0);\n        } else {\n            modules[_moduleType][_moduleIndex] = modules[_moduleType][lastIndex];\n            delete modules[_moduleType][lastIndex];\n            modules[_moduleType].length = lastIndex;\n            if (_moduleIndex != lastIndex){\n                // Emit an event describing the new index of the moved module\n                emit LogModuleIndexUpdate(\n                    _moduleIndex,\n                    _moduleType,\n                    modules[_moduleType][_moduleIndex],\n                    block.timestamp // solhint-disable-line no-block-members\n                );\n            }\n        }\n\n    }\n\n    /**\n    * @notice Returns module name and address for a given type and index\n    * @param _moduleType is the type of module we are searching for\n    * @param _moduleIndex is the index of the module within the chosen type\n    * @return bytes32 is the name of the module\n    * @return address is the address of the module\n    */\n    function getModuleByTypeAndIndex(\n        uint8 _moduleType,\n        uint _moduleIndex\n    ) external view returns (address) {\n        if (modules[_moduleType].length > 0 && _moduleIndex < modules[_moduleType].length) {\n            return modules[_moduleType][_moduleIndex];\n        } else {\n            return (address(0));\n        }\n    }\n}","compiler":{"name":"solc","version":"0.4.24+commit.e67f0147.Emscripten.clang"},"networks":{},"schemaVersion":"2.0.1","updatedAt":"2018-11-12T21:33:34.247Z"}