What it does:
Allows users to securely store, manage, and monetize their personal data, granting access to third parties in exchange for tokens or payments.
Why it matters:
Gives individuals control over their personal data, enables fair compensation for data usage, eliminates intermediaries, and ensures privacy and transparency.
How it works:
Users deposit personal data metadata (encrypted or hashed) into the vault
Access permissions are granted to data consumers via smart contracts
Payments are automatically distributed to the user based on access or usage
Supports subscription-based access, one-time purchases, or usage-based fees
Integrates with Creator Subscription Wallet, AI Agent Payment Contract, or Play-to-Earn Reward Engine
Dashboards show data usage, payment history, and granted permissions
Data access can be revoked at any time while ensuring auditability
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title PersonalDataVault
* @author Nam
* @notice Manages personal data access and monetization on-chain
*/
contract PersonalDataVault is Ownable {
struct DataEntry {
string metadataHash; // IPFS or encrypted reference
address payable owner;
uint256 accessFee; // in wei
mapping(address => bool) accessGranted; // data consumer => granted
}
mapping(uint256 => DataEntry) public dataEntries;
uint256 public dataCount;
// -------------------- EVENTS --------------------
event DataRegistered(uint256 indexed dataId, address owner, uint256 accessFee);
event AccessGranted(uint256 indexed dataId, address consumer, uint256 payment);
event AccessRevoked(uint256 indexed dataId, address consumer);
// -------------------- DATA MANAGEMENT --------------------
function registerData(string calldata _metadataHash, uint256 _accessFee) external {
require(_accessFee > 0, "Fee must be >0");
dataCount += 1;
DataEntry storage d = dataEntries[dataCount];
d.metadataHash = _metadataHash;
d.owner = payable(msg.sender);
d.accessFee = _accessFee;
emit DataRegistered(dataCount, msg.sender, _accessFee);
}
function grantAccess(uint256 _dataId) external payable {
DataEntry storage d = dataEntries[_dataId];
require(msg.value == d.accessFee, "Incorrect payment");
require(!d.accessGranted[msg.sender], "Access already granted");
d.accessGranted[msg.sender] = true;
d.owner.transfer(msg.value);
emit AccessGranted(_dataId, msg.sender, msg.value);
}
function revokeAccess(uint256 _dataId, address _consumer) external {
DataEntry storage d = dataEntries[_dataId];
require(msg.sender == d.owner, "Not owner");
d.accessGranted[_consumer] = false;
emit AccessRevoked(_dataId, _consumer);
}
// -------------------- VIEW FUNCTIONS --------------------
function hasAccess(uint256 _dataId, address _user) external view returns (bool) {
return dataEntries[_dataId].accessGranted[_user];
}
function getDataMetadata(uint256 _dataId) external view returns (string memory) {
return dataEntries[_dataId].metadataHash;
}
}
Build and Grow By Nam Le Thanh