What it does:
Registers and manages verified organ donation consent on-chain, allowing authorized medical authorities to check donor status instantly during critical situations.
Why it matters:
Eliminates ambiguity, delays, and disputes around organ donation consent, ensuring patient wishes are honored while saving lives through trusted, real-time verification.
How it works:
Individuals register their organ donation consent on-chain
Donors specify which organs are eligible for donation
Consent status can be updated or revoked at any time
Authorized hospitals can verify donor consent instantly
Emergency access is restricted and fully auditable
All consent actions are immutably recorded on-chain
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @title OrganDonationRegistry
* @author Nam
* @notice On-chain registry for organ donation consent
*/
contract OrganDonationRegistry {
// -------------------- ROLES --------------------
address public admin;
mapping(address => bool) public authorizedHospitals;
// -------------------- DONOR STRUCT --------------------
struct DonorConsent {
bool registered;
bool donateHeart;
bool donateLiver;
bool donateKidney;
bool donateLungs;
uint256 lastUpdated;
}
// donor => consent
mapping(address => DonorConsent) public donorConsents;
// -------------------- EVENTS --------------------
event HospitalAuthorized(address indexed hospital);
event ConsentRegistered(address indexed donor);
event ConsentUpdated(address indexed donor);
event ConsentRevoked(address indexed donor);
// -------------------- MODIFIERS --------------------
modifier onlyAdmin() {
require(msg.sender == admin, "Not admin");
_;
}
modifier onlyHospital() {
require(authorizedHospitals[msg.sender], "Not authorized hospital");
_;
}
// -------------------- CONSTRUCTOR --------------------
constructor() {
admin = msg.sender;
}
// -------------------- HOSPITAL AUTHORIZATION --------------------
/**
* @notice Authorize a hospital
*/
function authorizeHospital(address _hospital)
external
onlyAdmin
{
require(_hospital != address(0), "Invalid hospital");
authorizedHospitals[_hospital] = true;
emit HospitalAuthorized(_hospital);
}
// -------------------- DONOR CONSENT --------------------
/**
* @notice Register organ donation consent
*/
function registerConsent(
bool _heart,
bool _liver,
bool _kidney,
bool _lungs
)
external
{
donorConsents[msg.sender] = DonorConsent({
registered: true,
donateHeart: _heart,
donateLiver: _liver,
donateKidney: _kidney,
donateLungs: _lungs,
lastUpdated: block.timestamp
});
emit ConsentRegistered(msg.sender);
}
/**
* @notice Update organ donation consent
*/
function updateConsent(
bool _heart,
bool _liver,
bool _kidney,
bool _lungs
)
external
{
require(donorConsents[msg.sender].registered, "Not registered");
donorConsents[msg.sender].donateHeart = _heart;
donorConsents[msg.sender].donateLiver = _liver;
donorConsents[msg.sender].donateKidney = _kidney;
donorConsents[msg.sender].donateLungs = _lungs;
donorConsents[msg.sender].lastUpdated = block.timestamp;
emit ConsentUpdated(msg.sender);
}
/**
* @notice Revoke donation consent
*/
function revokeConsent() external {
require(donorConsents[msg.sender].registered, "Not registered");
delete donorConsents[msg.sender];
emit ConsentRevoked(msg.sender);
}
// -------------------- VERIFICATION --------------------
/**
* @notice Verify donor consent (read-only)
*/
function verifyConsent(address _donor)
external
view
onlyHospital
returns (
bool registered,
bool heart,
bool liver,
bool kidney,
bool lungs,
uint256 lastUpdated
)
{
DonorConsent memory d = donorConsents[_donor];
return (
d.registered,
d.donateHeart,
d.donateLiver,
d.donateKidney,
d.donateLungs,
d.lastUpdated
);
}
}
Build and Grow By Nam Le Thanh