pragma solidity ^0.4.17; contract Managers{ struct Manager{ uint index; bool isHead; bool isManager; } mapping(address => Manager) managerAddresses; address[] public managerAddressesArr; modifier isHead(address sender){ require(managerAddresses[sender].isHead); _; } modifier isManager(address sender){ require(managerAddresses[sender].isManager); _; } constructor(address[] _managerAddresses) public{ for(uint i=0;i<_managerAddresses.length;i++){ managerAddresses[_managerAddresses[i]] = Manager(i,false,true); } managerAddresses[msg.sender] = Manager(managerAddressesArr.length,true,false); managerAddressesArr = _managerAddresses; managerAddressesArr.push(msg.sender); } function addNewManager(address newManagerAddr) isHead(msg.sender) public{ managerAddresses[newManagerAddr] = Manager(managerAddressesArr.length,false,true); managerAddressesArr.push(newManagerAddr); } function deleteManager(address deleteManagerAddr) isHead(msg.sender) public{ uint index = managerAddresses[deleteManagerAddr].index; for(uint i=index;i<managerAddressesArr.length -1;i++){ managerAddressesArr[i] = managerAddressesArr[i+1]; if(managerAddressesArr[i+1] == msg.sender){ managerAddresses[managerAddressesArr[i+1]] = Manager(i,true,false); }else{ managerAddresses[managerAddressesArr[i+1]] = Manager(i,false,true); } } delete managerAddressesArr[managerAddressesArr.length -1]; managerAddressesArr.length -=1; delete managerAddresses[deleteManagerAddr]; } function destory() public{ selfdestruct(msg.sender); } } contract UploadFactory is Managers{ address[] public deployedUploads; mapping (address => uint) deployedUploadsIndex; function createNewUpload(string _ownerName,string _ownerIDHash,string _feeHash,string _fardHash,string _eStampHash,uint[] _latitude,uint[] _longtitude) public isManager(msg.sender) { address newUpload = new Upload(managerAddressesArr,_ownerName,_ownerIDHash,_feeHash,_fardHash,_eStampHash); Upload(newUpload).setCords(_latitude,_longtitude); deployedUploads.push(newUpload); deployedUploadsIndex[newUpload] = deployedUploads.length - 1; } function removeUpload(address addr) isManager(msg.sender) public{ uint index = deployedUploadsIndex[addr]; for (uint i=index;i<deployedUploads.length - 1;i++){ deployedUploads[i] = deployedUploads[i+1]; } delete deployedUploads[deployedUploads.length - 1]; deployedUploads.length-=1; Upload(addr).destroy(this); } function getAllUploads() isManager(msg.sender) public view returns (address[]){ return deployedUploads; } function destory() isHead(msg.sender) public{ selfdestruct(msg.sender); } } contract Upload is Managers{ address public submitter; mapping(address => bool) managerAddresses; string ownerName; string ownerIDHash; string feeHash; string fardHash; string eStampHash; uint[] latitude; uint[] longitude; bool public completed = false; modifier assignSubmitter(){ submitter = tx.origin; _; } modifier resetCompleted(){ completed = false; _; } constructor(address[] _managerAddressesArr,string _ownerName,string _ownerIDHash,string _feeHash, string _fardHash,string _eStampHash) public { for(uint i = 0;i<_managerAddressesArr.length;i++){ managerAddresses[_managerAddressesArr[i]] = true; } ownerName = _ownerName; ownerIDHash = _ownerIDHash; feeHash = _feeHash; fardHash = _fardHash; eStampHash = _eStampHash; submitter = tx.origin; } function setCords(uint[] _latitude,uint[] _longtitude) isManager(tx.origin) assignSubmitter resetCompleted public{ latitude = _latitude; longitude = _longtitude; } function editOwnerName(string _ownerName) isManager(tx.origin) assignSubmitter resetCompleted public{ ownerName = _ownerName; } function editUploadedHashes(string _ownerIDHash,string _feeHash,string _fardHash,string _eStampHash) isManager(tx.origin) assignSubmitter resetCompleted public{ ownerIDHash = _ownerIDHash; feeHash = _feeHash; fardHash = _fardHash; eStampHash = _eStampHash; } function completeUpload() isManager(tx.origin) assignSubmitter public{ completed = true; } function getUploadedCords() public view returns(uint[],uint[]){ return (latitude,longitude); } function getUploadedData() public view returns(string,string,string,string,string,bool){ return ( ownerName,ownerIDHash,feeHash,fardHash,eStampHash,completed ); } function destroy(address addr) isManager(tx.origin) public{ selfdestruct(addr); } }
0.4.18