// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.8.0; contract BirthChain { /********* Constructor to assign Government as admin *********/ address gov; constructor() { gov = msg.sender; } /********* Structures *********/ struct HospitalModel{ string name; string location; string contact; address pubAdd; } struct MuncipalityModel{ string location; string contact; uint pincode; address pubAdd; } struct BirthCertificateModel{ string name; string fathersName; string mothersName; string dob; string time; string email; string location; address hospitalAddr; address muncipalityAddr; bool status; } /********* Mappings *********/ mapping (uint=>HospitalModel) public hospital; mapping (uint=>MuncipalityModel) public muncipality; mapping (uint=>BirthCertificateModel) bc; mapping (address=>bool) isHospital; mapping (address=>bool) isMuncipality; mapping (bytes32=>uint) verifyedBc; /********* IDs *********/ uint hID = 256; uint mID = 512; uint bCID = 1024; /********* Events *********/ event AddHospital(uint256 hosp_ID); event AddMuncipality(uint256 muncipality_ID); event AddBirth(uint256 birth_ID); event ApproveBC(uint256 birth_ID, string message); /********* Modifiers *********/ modifier onlyGov(){ require(gov == msg.sender,"only Gov"); _; } modifier onlyHospital(address addr){ require(isHospital[addr] == true,"only Hospital"); _; } modifier onlyMuncipality(address addr){ require(isMuncipality[addr] == true,"only Muncipality"); _; } modifier isHospitalCheck(address _pubAdd){ require(isHospital[_pubAdd] == false,"Hospital Already Registered"); _; } modifier isMuncipalityCheck(address _pubAdd){ require(isMuncipality[_pubAdd] == false,"Muncipality Already Registered"); _; } /********* To register hospital by Government *********/ function setHospital( string memory _name, string memory _location, string memory _contact, address _pubAdd) public onlyGov isHospitalCheck(_pubAdd) { hospital[hID] = HospitalModel( _name, _contact, _location, _pubAdd); isHospital[_pubAdd] = true; emit AddHospital(hID); hID++; } /********* To register muncipality by Government *********/ function setMuncipality( string memory _location, string memory _contact, uint _pincode, address _pubAdd) public onlyGov isMuncipalityCheck(_pubAdd) { muncipality[mID] = MuncipalityModel( _contact, _location, _pincode, _pubAdd); isMuncipality[_pubAdd] = true; emit AddMuncipality(mID); mID++; } /********* To register new birth by only Hospitals *********/ function newBirth( string memory _name, string memory _fatherName, string memory _motherName, string memory _dob, string memory _time, string memory _email, string memory _location, address _muncipalityAddr ) public onlyHospital(msg.sender) { bc[bCID]= BirthCertificateModel( _name, _fatherName, _motherName, _dob, _time, _email, _location, msg.sender, _muncipalityAddr, false ); bytes memory hashingData = abi.encodePacked(_name,_fatherName,_motherName,_dob); bytes32 hash = keccak256(hashingData); require(verifyedBc[hash]==0, 'Duplicate data already exists'); verifyedBc[hash]=bCID; emit AddBirth(bCID); bCID++; } /********* To approve verification of birth certificate by Muncipalities *********/ function approveBc(uint _bcId) public onlyMuncipality(msg.sender) { require(bc[_bcId].muncipalityAddr == msg.sender,"BirthCertificate Id Shoud be Valid"); require(bc[_bcId].status==false,"Already Approved"); bc[_bcId].status=true; emit ApproveBC(_bcId, "The birth certificate has been emailed to the parent"); } /********* To get the birth certificate details *********/ function birthCertificate( string memory _name, string memory _fatherName, string memory _motherName, string memory _dob ) public view returns( string memory name, string memory fathersName, string memory mothersName, string memory dob, string memory time, string memory email, string memory location, address hospitalAddr, address muncipalityAddr, bool status) { bytes memory hashingData = abi.encodePacked(_name,_fatherName,_motherName,_dob); bytes32 hash = keccak256(hashingData); uint id = verifyedBc[hash]; require(id!=0, 'Wrong Data'); return ( bc[id].name, bc[id].fathersName, bc[id].mothersName, bc[id].dob, bc[id].time, bc[id].email, bc[id].location, bc[id].hospitalAddr, bc[id].muncipalityAddr, bc[id].status); } }
0.6.8