What it does:
Verifies that a pharmacy is licensed, authentic, and authorized to dispense medication by validating its credentials on-chain.
Why it matters:
Prevents counterfeit drug distribution, protects patients from fraudulent pharmacies, and creates a trusted pharmaceutical network.
How it works:
Regulatory authority authorizes pharmacy issuers
Pharmacies register with verified credentials
License data is stored as cryptographic hashes
Patients and providers can verify pharmacy status
Licenses can be renewed or revoked on-chain
All verification actions are publicly auditable
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @title PharmacyAuthenticityVerification
* @author Nam
* @notice Verifies licensed pharmacies on-chain
*/
contract PharmacyAuthenticityVerification {
// -------------------- ROLES --------------------
address public regulator;
// -------------------- STRUCTS --------------------
struct Pharmacy {
bool registered;
string licenseHash; // IPFS / encrypted license
uint256 validUntil;
bool active;
}
// -------------------- STORAGE --------------------
mapping(address => Pharmacy) public pharmacies;
// -------------------- EVENTS --------------------
event PharmacyRegistered(address indexed pharmacy);
event LicenseRenewed(address indexed pharmacy, uint256 validUntil);
event PharmacyRevoked(address indexed pharmacy);
// -------------------- MODIFIERS --------------------
modifier onlyRegulator() {
require(msg.sender == regulator, "Not regulator");
_;
}
modifier pharmacyExists(address _pharmacy) {
require(pharmacies[_pharmacy].registered, "Pharmacy not registered");
_;
}
// -------------------- CONSTRUCTOR --------------------
constructor() {
regulator = msg.sender;
}
// -------------------- REGISTRATION --------------------
/**
* @notice Register a licensed pharmacy
*/
function registerPharmacy(
address _pharmacy,
string calldata _licenseHash,
uint256 _validUntil
)
external
onlyRegulator
{
require(_pharmacy != address(0), "Invalid address");
require(_validUntil > block.timestamp, "Invalid expiry");
pharmacies[_pharmacy] = Pharmacy({
registered: true,
licenseHash: _licenseHash,
validUntil: _validUntil,
active: true
});
emit PharmacyRegistered(_pharmacy);
}
// -------------------- LICENSE MANAGEMENT --------------------
/**
* @notice Renew pharmacy license
*/
function renewLicense(
address _pharmacy,
uint256 _newValidUntil
)
external
onlyRegulator
pharmacyExists(_pharmacy)
{
require(_newValidUntil > pharmacies[_pharmacy].validUntil, "Invalid renewal");
pharmacies[_pharmacy].validUntil = _newValidUntil;
pharmacies[_pharmacy].active = true;
emit LicenseRenewed(_pharmacy, _newValidUntil);
}
/**
* @notice Revoke pharmacy authorization
*/
function revokePharmacy(address _pharmacy)
external
onlyRegulator
pharmacyExists(_pharmacy)
{
pharmacies[_pharmacy].active = false;
emit PharmacyRevoked(_pharmacy);
}
// -------------------- VERIFICATION --------------------
/**
* @notice Verify pharmacy authenticity
*/
function verifyPharmacy(address _pharmacy)
external
view
returns (
bool active,
uint256 validUntil,
string memory licenseHash
)
{
Pharmacy memory p = pharmacies[_pharmacy];
require(p.registered, "Not registered");
return (
p.active && p.validUntil >= block.timestamp,
p.validUntil,
p.licenseHash
);
}
}
Build and Grow By Nam Le Thanh