Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- cityCare
- Optimization enabled
- true
- Compiler version
- v0.8.0+commit.c7dfd78e
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2024-09-12T09:50:00.931359Z
Contract source code
pragma solidity ^0.8.0; contract cityCare { struct HealthRecord { string recordHash; string metadata; uint256 timestamp; bool active; } struct Citizen { string did; mapping(address => bool) authorizedProviders; mapping(uint256 => HealthRecord) healthRecords; uint256 recordCount; bool registered; } address public cityAdmin; mapping(address => bool) public registeredProviders; mapping(address => Citizen) private citizens; event CitizenRegistered(address indexed citizenAddress, string did); event ProviderRegistered(address indexed providerAddress); event HealthRecordAdded(address indexed citizenAddress, uint256 indexed recordId, string recordHash); event AccessGranted(address indexed citizenAddress, address indexed providerAddress); event AccessRevoked(address indexed citizenAddress, address indexed providerAddress); modifier onlyCityAdmin() { require(msg.sender == cityAdmin, "Only city admin can call this function"); _; } modifier onlyRegisteredCitizen() { require(citizens[msg.sender].registered, "Only registered citizens can call this function"); _; } modifier onlyAuthorizedProvider(address _citizenAddress) { require(registeredProviders[msg.sender], "Provider is not registered"); require(citizens[_citizenAddress].authorizedProviders[msg.sender], "Provider is not authorized for this citizen"); _; } constructor() { cityAdmin = msg.sender; } function registerCitizen(string memory _did) public { require(!citizens[msg.sender].registered, "Citizen already registered"); citizens[msg.sender].did = _did; citizens[msg.sender].registered = true; emit CitizenRegistered(msg.sender, _did); } function registerProvider(address _providerAddress) public onlyCityAdmin { require(!registeredProviders[_providerAddress], "Provider already registered"); registeredProviders[_providerAddress] = true; emit ProviderRegistered(_providerAddress); } function addHealthRecord(address _citizenAddress, string memory _recordHash, string memory _metadata) public onlyAuthorizedProvider(_citizenAddress) { uint256 newRecordId = citizens[_citizenAddress].recordCount + 1; citizens[_citizenAddress].healthRecords[newRecordId] = HealthRecord(_recordHash, _metadata, block.timestamp, true); citizens[_citizenAddress].recordCount = newRecordId; emit HealthRecordAdded(_citizenAddress, newRecordId, _recordHash); } function grantAccess(address _providerAddress) public onlyRegisteredCitizen { require(registeredProviders[_providerAddress], "Provider is not registered"); citizens[msg.sender].authorizedProviders[_providerAddress] = true; emit AccessGranted(msg.sender, _providerAddress); } function revokeAccess(address _providerAddress) public onlyRegisteredCitizen { citizens[msg.sender].authorizedProviders[_providerAddress] = false; emit AccessRevoked(msg.sender, _providerAddress); } function getHealthRecord(uint256 _recordId) public view returns (string memory, string memory, uint256, bool) { require(citizens[msg.sender].registered, "Only registered citizens can access their records"); HealthRecord memory record = citizens[msg.sender].healthRecords[_recordId]; require(record.timestamp != 0, "Record does not exist"); return (record.recordHash, record.metadata, record.timestamp, record.active); } function isProviderAuthorized(address _citizenAddress, address _providerAddress) public view returns (bool) { return citizens[_citizenAddress].authorizedProviders[_providerAddress]; } function getCitizenDID(address _citizenAddress) public view returns (string memory) { require(citizens[_citizenAddress].registered, "Citizen not registered"); return citizens[_citizenAddress].did; } function getRecordCount(address _citizenAddress) public view returns (uint256) { require(citizens[_citizenAddress].registered, "Citizen not registered"); return citizens[_citizenAddress].recordCount; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"AccessGranted","inputs":[{"type":"address","name":"citizenAddress","internalType":"address","indexed":true},{"type":"address","name":"providerAddress","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"AccessRevoked","inputs":[{"type":"address","name":"citizenAddress","internalType":"address","indexed":true},{"type":"address","name":"providerAddress","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"CitizenRegistered","inputs":[{"type":"address","name":"citizenAddress","internalType":"address","indexed":true},{"type":"string","name":"did","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"HealthRecordAdded","inputs":[{"type":"address","name":"citizenAddress","internalType":"address","indexed":true},{"type":"uint256","name":"recordId","internalType":"uint256","indexed":true},{"type":"string","name":"recordHash","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"ProviderRegistered","inputs":[{"type":"address","name":"providerAddress","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addHealthRecord","inputs":[{"type":"address","name":"_citizenAddress","internalType":"address"},{"type":"string","name":"_recordHash","internalType":"string"},{"type":"string","name":"_metadata","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"cityAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getCitizenDID","inputs":[{"type":"address","name":"_citizenAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"},{"type":"string","name":"","internalType":"string"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bool","name":"","internalType":"bool"}],"name":"getHealthRecord","inputs":[{"type":"uint256","name":"_recordId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getRecordCount","inputs":[{"type":"address","name":"_citizenAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantAccess","inputs":[{"type":"address","name":"_providerAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isProviderAuthorized","inputs":[{"type":"address","name":"_citizenAddress","internalType":"address"},{"type":"address","name":"_providerAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerCitizen","inputs":[{"type":"string","name":"_did","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerProvider","inputs":[{"type":"address","name":"_providerAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"registeredProviders","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeAccess","inputs":[{"type":"address","name":"_providerAddress","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50600080546001600160a01b03191633179055610f81806100326000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063839e876211610071578063839e87621461012557806385e6853114610148578063be7fe8eb1461015b578063d955896114610170578063e13a548114610190578063e7747ccb146101b0576100a9565b80630297f0b3146100ae5780630ae5e739146100c35780630e260016146100d657806358214308146100e95780637b3cb0fb14610112575b600080fd5b6100c16100bc366004610b8a565b6101c3565b005b6100c16100d1366004610ac6565b610278565b6100c16100e4366004610ac6565b610341565b6100fc6100f7366004610ac6565b6103f3565b6040516101099190610ecd565b60405180910390f35b6100c1610120366004610b19565b610451565b610138610133366004610bc5565b6105ec565b6040516101099493929190610c5a565b6100c1610156366004610ac6565b6107cb565b610163610859565b6040516101099190610c28565b61018361017e366004610ae7565b610868565b6040516101099190610c3c565b6101a361019e366004610ac6565b61089a565b6040516101099190610c47565b6101836101be366004610ac6565b610980565b3360009081526002602052604090206004015460ff16156101ff5760405162461bcd60e51b81526004016101f690610e96565b60405180910390fd5b336000908152600260209081526040909120825161021f92840190610995565b503360008181526002602052604090819020600401805460ff19166001179055517f106c826edcad7be8b769067aebb234b0e19866d19c9ebe48e6f61e994b9e03aa9061026d908490610c47565b60405180910390a250565b3360009081526002602052604090206004015460ff166102aa5760405162461bcd60e51b81526004016101f690610dfc565b6001600160a01b03811660009081526001602052604090205460ff166102e25760405162461bcd60e51b81526004016101f690610d2f565b3360008181526002602090815260408083206001600160a01b0386168085526001918201909352818420805460ff19169091179055519092917f9f520b3bfc56d06f7065d10b4683b3f57ac8895d5026cd176dee95ce1454cb8d91a350565b6000546001600160a01b0316331461036b5760405162461bcd60e51b81526004016101f690610ce9565b6001600160a01b03811660009081526001602052604090205460ff16156103a45760405162461bcd60e51b81526004016101f690610d66565b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f70abce74777b3838ae60a33a6b9a87d9d25532668fe4fea548554c55868579c09190a250565b6001600160a01b03811660009081526002602052604081206004015460ff1661042e5760405162461bcd60e51b81526004016101f690610d9d565b506001600160a01b0381166000908152600260205260409020600301545b919050565b33600090815260016020526040902054839060ff166104825760405162461bcd60e51b81526004016101f690610d2f565b6001600160a01b038116600090815260026020908152604080832033845260010190915290205460ff166104c85760405162461bcd60e51b81526004016101f690610e4b565b6001600160a01b0384166000908152600260205260408120600301546104ef906001610ed6565b6040805160808101825286815260208082018790524282840152600160608301526001600160a01b0389166000908152600280835284822086835201825292909220815180519495509193909261054a928492910190610995565b5060208281015180516105639260018501920190610995565b506040828101516002838101919091556060909301516003928301805460ff19169115159190911790556001600160a01b038816600081815260209490945292819020909101839055518291907f8e61836003ef85a6f6079b89f71485393cb5ea1aa40db017506fe9ca9e923400906105dd908890610c47565b60405180910390a35050505050565b336000908152600260205260408120600401546060918291819060ff166106255760405162461bcd60e51b81526004016101f690610c98565b336000908152600260208181526040808420898552909201905280822081516080810190925280548290829061065a90610efa565b80601f016020809104026020016040519081016040528092919081815260200182805461068690610efa565b80156106d35780601f106106a8576101008083540402835291602001916106d3565b820191906000526020600020905b8154815290600101906020018083116106b657829003601f168201915b505050505081526020016001820180546106ec90610efa565b80601f016020809104026020016040519081016040528092919081815260200182805461071890610efa565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b50505091835250506002820154602082015260039091015460ff1615156040918201528101519091506107aa5760405162461bcd60e51b81526004016101f690610dcd565b80516020820151604083015160609093015191989097509195509350915050565b3360009081526002602052604090206004015460ff166107fd5760405162461bcd60e51b81526004016101f690610dfc565b3360008181526002602090815260408083206001600160a01b0386168085526001909101909252808320805460ff19169055519092917f825c8be24eb0df19500f63e86c29e7d0d951e73056b889b891d85e40938d9b6e91a350565b6000546001600160a01b031681565b6001600160a01b0391821660009081526002602090815260408083209390941682526001909201909152205460ff1690565b6001600160a01b03811660009081526002602052604090206004015460609060ff166108d85760405162461bcd60e51b81526004016101f690610d9d565b6001600160a01b038216600090815260026020526040902080546108fb90610efa565b80601f016020809104026020016040519081016040528092919081815260200182805461092790610efa565b80156109745780601f1061094957610100808354040283529160200191610974565b820191906000526020600020905b81548152906001019060200180831161095757829003601f168201915b50505050509050919050565b60016020526000908152604090205460ff1681565b8280546109a190610efa565b90600052602060002090601f0160209004810192826109c35760008555610a09565b82601f106109dc57805160ff1916838001178555610a09565b82800160010185558215610a09579182015b82811115610a095782518255916020019190600101906109ee565b50610a15929150610a19565b5090565b5b80821115610a155760008155600101610a1a565b80356001600160a01b038116811461044c57600080fd5b600082601f830112610a55578081fd5b813567ffffffffffffffff80821115610a7057610a70610f35565b604051601f8301601f191681016020018281118282101715610a9457610a94610f35565b604052828152848301602001861015610aab578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215610ad7578081fd5b610ae082610a2e565b9392505050565b60008060408385031215610af9578081fd5b610b0283610a2e565b9150610b1060208401610a2e565b90509250929050565b600080600060608486031215610b2d578081fd5b610b3684610a2e565b9250602084013567ffffffffffffffff80821115610b52578283fd5b610b5e87838801610a45565b93506040860135915080821115610b73578283fd5b50610b8086828701610a45565b9150509250925092565b600060208284031215610b9b578081fd5b813567ffffffffffffffff811115610bb1578182fd5b610bbd84828501610a45565b949350505050565b600060208284031215610bd6578081fd5b5035919050565b60008151808452815b81811015610c0257602081850181015186830182015201610be6565b81811115610c135782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b901515815260200190565b600060208252610ae06020830184610bdd565b600060808252610c6d6080830187610bdd565b8281036020840152610c7f8187610bdd565b6040840195909552505090151560609091015292915050565b60208082526031908201527f4f6e6c79207265676973746572656420636974697a656e732063616e20616363604082015270657373207468656972207265636f72647360781b606082015260800190565b60208082526026908201527f4f6e6c7920636974792061646d696e2063616e2063616c6c20746869732066756040820152653731ba34b7b760d11b606082015260800190565b6020808252601a908201527f50726f7669646572206973206e6f742072656769737465726564000000000000604082015260600190565b6020808252601b908201527f50726f766964657220616c726561647920726567697374657265640000000000604082015260600190565b60208082526016908201527510da5d1a5e995b881b9bdd081c9959da5cdd195c995960521b604082015260600190565b602080825260159082015274149958dbdc9908191bd95cc81b9bdd08195e1a5cdd605a1b604082015260600190565b6020808252602f908201527f4f6e6c79207265676973746572656420636974697a656e732063616e2063616c60408201526e36103a3434b990333ab731ba34b7b760891b606082015260800190565b6020808252602b908201527f50726f7669646572206973206e6f7420617574686f72697a656420666f72207460408201526a3434b99031b4ba34bd32b760a91b606082015260800190565b6020808252601a908201527f436974697a656e20616c72656164792072656769737465726564000000000000604082015260600190565b90815260200190565b60008219821115610ef557634e487b7160e01b81526011600452602481fd5b500190565b600281046001821680610f0e57607f821691505b60208210811415610f2f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fdfea264697066735822122078e9a05daae2096c2fa8f148b5eac86ef8780740122157a40ceba327e7d662d864736f6c63430008000033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063839e876211610071578063839e87621461012557806385e6853114610148578063be7fe8eb1461015b578063d955896114610170578063e13a548114610190578063e7747ccb146101b0576100a9565b80630297f0b3146100ae5780630ae5e739146100c35780630e260016146100d657806358214308146100e95780637b3cb0fb14610112575b600080fd5b6100c16100bc366004610b8a565b6101c3565b005b6100c16100d1366004610ac6565b610278565b6100c16100e4366004610ac6565b610341565b6100fc6100f7366004610ac6565b6103f3565b6040516101099190610ecd565b60405180910390f35b6100c1610120366004610b19565b610451565b610138610133366004610bc5565b6105ec565b6040516101099493929190610c5a565b6100c1610156366004610ac6565b6107cb565b610163610859565b6040516101099190610c28565b61018361017e366004610ae7565b610868565b6040516101099190610c3c565b6101a361019e366004610ac6565b61089a565b6040516101099190610c47565b6101836101be366004610ac6565b610980565b3360009081526002602052604090206004015460ff16156101ff5760405162461bcd60e51b81526004016101f690610e96565b60405180910390fd5b336000908152600260209081526040909120825161021f92840190610995565b503360008181526002602052604090819020600401805460ff19166001179055517f106c826edcad7be8b769067aebb234b0e19866d19c9ebe48e6f61e994b9e03aa9061026d908490610c47565b60405180910390a250565b3360009081526002602052604090206004015460ff166102aa5760405162461bcd60e51b81526004016101f690610dfc565b6001600160a01b03811660009081526001602052604090205460ff166102e25760405162461bcd60e51b81526004016101f690610d2f565b3360008181526002602090815260408083206001600160a01b0386168085526001918201909352818420805460ff19169091179055519092917f9f520b3bfc56d06f7065d10b4683b3f57ac8895d5026cd176dee95ce1454cb8d91a350565b6000546001600160a01b0316331461036b5760405162461bcd60e51b81526004016101f690610ce9565b6001600160a01b03811660009081526001602052604090205460ff16156103a45760405162461bcd60e51b81526004016101f690610d66565b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f70abce74777b3838ae60a33a6b9a87d9d25532668fe4fea548554c55868579c09190a250565b6001600160a01b03811660009081526002602052604081206004015460ff1661042e5760405162461bcd60e51b81526004016101f690610d9d565b506001600160a01b0381166000908152600260205260409020600301545b919050565b33600090815260016020526040902054839060ff166104825760405162461bcd60e51b81526004016101f690610d2f565b6001600160a01b038116600090815260026020908152604080832033845260010190915290205460ff166104c85760405162461bcd60e51b81526004016101f690610e4b565b6001600160a01b0384166000908152600260205260408120600301546104ef906001610ed6565b6040805160808101825286815260208082018790524282840152600160608301526001600160a01b0389166000908152600280835284822086835201825292909220815180519495509193909261054a928492910190610995565b5060208281015180516105639260018501920190610995565b506040828101516002838101919091556060909301516003928301805460ff19169115159190911790556001600160a01b038816600081815260209490945292819020909101839055518291907f8e61836003ef85a6f6079b89f71485393cb5ea1aa40db017506fe9ca9e923400906105dd908890610c47565b60405180910390a35050505050565b336000908152600260205260408120600401546060918291819060ff166106255760405162461bcd60e51b81526004016101f690610c98565b336000908152600260208181526040808420898552909201905280822081516080810190925280548290829061065a90610efa565b80601f016020809104026020016040519081016040528092919081815260200182805461068690610efa565b80156106d35780601f106106a8576101008083540402835291602001916106d3565b820191906000526020600020905b8154815290600101906020018083116106b657829003601f168201915b505050505081526020016001820180546106ec90610efa565b80601f016020809104026020016040519081016040528092919081815260200182805461071890610efa565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b50505091835250506002820154602082015260039091015460ff1615156040918201528101519091506107aa5760405162461bcd60e51b81526004016101f690610dcd565b80516020820151604083015160609093015191989097509195509350915050565b3360009081526002602052604090206004015460ff166107fd5760405162461bcd60e51b81526004016101f690610dfc565b3360008181526002602090815260408083206001600160a01b0386168085526001909101909252808320805460ff19169055519092917f825c8be24eb0df19500f63e86c29e7d0d951e73056b889b891d85e40938d9b6e91a350565b6000546001600160a01b031681565b6001600160a01b0391821660009081526002602090815260408083209390941682526001909201909152205460ff1690565b6001600160a01b03811660009081526002602052604090206004015460609060ff166108d85760405162461bcd60e51b81526004016101f690610d9d565b6001600160a01b038216600090815260026020526040902080546108fb90610efa565b80601f016020809104026020016040519081016040528092919081815260200182805461092790610efa565b80156109745780601f1061094957610100808354040283529160200191610974565b820191906000526020600020905b81548152906001019060200180831161095757829003601f168201915b50505050509050919050565b60016020526000908152604090205460ff1681565b8280546109a190610efa565b90600052602060002090601f0160209004810192826109c35760008555610a09565b82601f106109dc57805160ff1916838001178555610a09565b82800160010185558215610a09579182015b82811115610a095782518255916020019190600101906109ee565b50610a15929150610a19565b5090565b5b80821115610a155760008155600101610a1a565b80356001600160a01b038116811461044c57600080fd5b600082601f830112610a55578081fd5b813567ffffffffffffffff80821115610a7057610a70610f35565b604051601f8301601f191681016020018281118282101715610a9457610a94610f35565b604052828152848301602001861015610aab578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215610ad7578081fd5b610ae082610a2e565b9392505050565b60008060408385031215610af9578081fd5b610b0283610a2e565b9150610b1060208401610a2e565b90509250929050565b600080600060608486031215610b2d578081fd5b610b3684610a2e565b9250602084013567ffffffffffffffff80821115610b52578283fd5b610b5e87838801610a45565b93506040860135915080821115610b73578283fd5b50610b8086828701610a45565b9150509250925092565b600060208284031215610b9b578081fd5b813567ffffffffffffffff811115610bb1578182fd5b610bbd84828501610a45565b949350505050565b600060208284031215610bd6578081fd5b5035919050565b60008151808452815b81811015610c0257602081850181015186830182015201610be6565b81811115610c135782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b901515815260200190565b600060208252610ae06020830184610bdd565b600060808252610c6d6080830187610bdd565b8281036020840152610c7f8187610bdd565b6040840195909552505090151560609091015292915050565b60208082526031908201527f4f6e6c79207265676973746572656420636974697a656e732063616e20616363604082015270657373207468656972207265636f72647360781b606082015260800190565b60208082526026908201527f4f6e6c7920636974792061646d696e2063616e2063616c6c20746869732066756040820152653731ba34b7b760d11b606082015260800190565b6020808252601a908201527f50726f7669646572206973206e6f742072656769737465726564000000000000604082015260600190565b6020808252601b908201527f50726f766964657220616c726561647920726567697374657265640000000000604082015260600190565b60208082526016908201527510da5d1a5e995b881b9bdd081c9959da5cdd195c995960521b604082015260600190565b602080825260159082015274149958dbdc9908191bd95cc81b9bdd08195e1a5cdd605a1b604082015260600190565b6020808252602f908201527f4f6e6c79207265676973746572656420636974697a656e732063616e2063616c60408201526e36103a3434b990333ab731ba34b7b760891b606082015260800190565b6020808252602b908201527f50726f7669646572206973206e6f7420617574686f72697a656420666f72207460408201526a3434b99031b4ba34bd32b760a91b606082015260800190565b6020808252601a908201527f436974697a656e20616c72656164792072656769737465726564000000000000604082015260600190565b90815260200190565b60008219821115610ef557634e487b7160e01b81526011600452602481fd5b500190565b600281046001821680610f0e57607f821691505b60208210811415610f2f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fdfea264697066735822122078e9a05daae2096c2fa8f148b5eac86ef8780740122157a40ceba327e7d662d864736f6c63430008000033