// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.8.0; contract BirthChain { /********* Constructor to assign Government as admin *********/ address public 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 location; address hospitalAddr; address muncipalityAddr; bool status; } /********* Mappings *********/ mapping (uint=>HospitalModel) public hospital; mapping (uint=>MuncipalityModel) public muncipality; mapping (uint=>BirthCertificateModel) public bc; mapping (address=>bool) public isHospital; mapping (address=>bool) public isMuncipality; mapping (bytes32=>uint) verifyedBc; /********* IDs *********/ uint public hID = 256; uint public mID = 512; uint public bCID = 1024; /********* 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); hID++; isHospital[_pubAdd] = true; } /********* 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); mID++; isMuncipality[_pubAdd] = true; } /********* To register new birth by only Hospitals *********/ function newBirth( string memory _name, string memory _fatherName, string memory _motherName, string memory _dob, string memory _location, address _muncipalityAddr ) public onlyHospital(msg.sender) { bc[bCID]= BirthCertificateModel( _name, _fatherName, _motherName, _dob, _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; 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; } /********* 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 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].location, bc[id].hospitalAddr, bc[id].muncipalityAddr, bc[id].status); } }
0.7.1