Profile DIDs for Learners and Educators
DID Smart Contract Using ERC-725 and ERC-735 on Ethereum & EVM Chains
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
contract DecentralizedIdentity is Ownable {
using EnumerableSet for EnumerableSet.Bytes32Set;
struct DID {
string identifier;
address owner;
bool isActive;
EnumerableSet.Bytes32Set claims;
}
mapping(address => DID) private identities;
mapping(bytes32 => string) private claimData;
event DIDCreated(address indexed user, string identifier);
event ClaimAdded(address indexed user, bytes32 claimId, string claim);
event ClaimRevoked(address indexed user, bytes32 claimId);
event DIDRevoked(address indexed user);
modifier onlyDIDOwner(address user) {
require(identities[user].owner == msg.sender, "Not DID owner");
_;
}
function createDID(string memory identifier) public {
require(bytes(identities[msg.sender].identifier).length == 0, "DID already exists");
identities[msg.sender] = DID(identifier, msg.sender, true);
emit DIDCreated(msg.sender, identifier);
}
function addClaim(bytes32 claimId, string memory claim) public onlyDIDOwner(msg.sender) {
identities[msg.sender].claims.add(claimId);
claimData[claimId] = claim;
emit ClaimAdded(msg.sender, claimId, claim);
}
function revokeClaim(bytes32 claimId) public onlyDIDOwner(msg.sender) {
require(identities[msg.sender].claims.contains(claimId), "Claim not found");
identities[msg.sender].claims.remove(claimId);
delete claimData[claimId];
emit ClaimRevoked(msg.sender, claimId);
}
function revokeDID() public onlyDIDOwner(msg.sender) {
identities[msg.sender].isActive = false;
emit DIDRevoked(msg.sender);
}
function getDID(address user) public view returns (string memory, bool) {
return (identities[user].identifier, identities[user].isActive);
}
function getClaim(bytes32 claimId) public view returns (string memory) {
return claimData[claimId];
}
}
Last updated