···11-// SPDX-License-Identifier: UNLICENSED
22-pragma solidity ^0.8.13;
33-44-import {Script} from "forge-std/Script.sol";
55-import {Counter} from "../src/Counter.sol";
66-77-contract CounterScript is Script {
88- Counter public counter;
99-1010- function setUp() public {}
1111-1212- function run() public {
1313- vm.startBroadcast();
1414-1515- counter = new Counter();
1616-1717- vm.stopBroadcast();
1818- }
1919-}
+30-40
src/CowRegistry.sol
···5566 struct Cow {
77 address controller;
88- bytes12 prefix; // set to "did::" to deactivate
98 string wrappedDID;
109 }
1010+1111+ string constant DEACTIVATED = "did::";
11121213 mapping(bytes32 => Cow) public cows;
13141414- event CowInitialized(bytes32 indexed cowHash, address controller, bytes12 prefix, string wrappedDID);
1515+ event CowInitialized(bytes32 indexed cowHash, address controller, string wrappedDID);
1516 event CowDeactivated(bytes32 indexed cowHash);
1617 event ControllerUpdated(bytes32 indexed cowHash, address controller);
1717- event WrappedDIDUpdated(bytes32 indexed cowHash, bytes12 prefix, string wrappedDID);
1818+ event WrappedDIDUpdated(bytes32 indexed cowHash, string wrappedDID);
18191919- function updateWrappedDIDByHash(
2020- bytes32 cowHash,
2121- bytes12 prefix,
2222- string memory wrappedDID
2323- ) public {
2424- require(cows[cowHash].prefix != bytes12("did::"));
2020+ function _isDeactivated(bytes32 cowHash) internal view returns (bool) {
2121+ return keccak256(bytes(cows[cowHash].wrappedDID)) == keccak256(bytes(DEACTIVATED));
2222+ }
2323+2424+ function updateWrappedDIDByHash(bytes32 cowHash, string memory wrappedDID) public {
2525+ require(!_isDeactivated(cowHash));
2526 require(msg.sender == cows[cowHash].controller);
2727+ require(keccak256(bytes(wrappedDID)) != keccak256(bytes(DEACTIVATED)), "Use deactivate() to deactivate");
26282727- require(prefix != bytes12("did::"), "Use deactivate() to deactivate");
2828-2929- cows[cowHash].prefix = prefix;
3029 cows[cowHash].wrappedDID = wrappedDID;
3131- emit WrappedDIDUpdated(cowHash, prefix, wrappedDID);
3030+ emit WrappedDIDUpdated(cowHash, wrappedDID);
3231 }
33323434- function updateControllerByHash(
3535- bytes32 cowHash,
3636- address controller
3737- ) public {
3838- require(cows[cowHash].prefix != bytes12("did::"));
3333+ function updateControllerByHash(bytes32 cowHash, address controller) public {
3434+ require(!_isDeactivated(cowHash));
3935 require(msg.sender == cows[cowHash].controller);
40364137 cows[cowHash].controller = controller;
4238 emit ControllerUpdated(cowHash, controller);
4339 }
44404545- function calculateCowHash(address controller, bytes12 prefix, string memory wrappedDID) public pure returns (bytes32) {
4646- return keccak256(abi.encodePacked(controller, prefix, wrappedDID));
4141+ function calculateCowHash(address controller, string memory wrappedDID) public pure returns (bytes32) {
4242+ return keccak256(abi.encodePacked(controller, wrappedDID));
4743 }
48444949- // Return a cow hash for the settings, storing the cow if it was not already there
5050- function _ensureCowInitialized(address controller, bytes12 prefix, string memory wrappedDID) internal returns (bytes32 cowHash) {
5151- cowHash = calculateCowHash(controller, prefix, wrappedDID);
5252- if (cows[cowHash].prefix == bytes12(0)) { // unregistered
5353- cows[cowHash] = Cow(
5454- controller,
5555- prefix,
5656- wrappedDID
5757- );
5858- emit CowInitialized(cowHash, controller, prefix, wrappedDID);
4545+ function _ensureCowInitialized(address controller, string memory wrappedDID) internal returns (bytes32 cowHash) {
4646+ cowHash = calculateCowHash(controller, wrappedDID);
4747+ if (bytes(cows[cowHash].wrappedDID).length == 0) {
4848+ cows[cowHash] = Cow(controller, wrappedDID);
4949+ emit CowInitialized(cowHash, controller, wrappedDID);
5950 }
6051 return cowHash;
6152 }
62536354 // You don't particularly need to call this, you can leave it until you make an update
6464- function initializeCow(address controller, bytes12 prefix, string memory wrappedDID) external {
6565- _ensureCowInitialized(controller, prefix, wrappedDID);
5555+ function initializeCow(address controller, string memory wrappedDID) external {
5656+ _ensureCowInitialized(controller, wrappedDID);
6657 }
67586868- function updateWrappedDID(address controller, bytes12 prefix, string memory wrappedDID, bytes12 newPrefix, string memory newWrappedDID) public {
6969- bytes32 cowHash = _ensureCowInitialized(controller, prefix, wrappedDID);
7070- updateWrappedDIDByHash(cowHash, newPrefix, newWrappedDID);
5959+ function updateWrappedDID(address controller, string memory wrappedDID, string memory newWrappedDID) public {
6060+ bytes32 cowHash = _ensureCowInitialized(controller, wrappedDID);
6161+ updateWrappedDIDByHash(cowHash, newWrappedDID);
7162 }
72637373- function updateController(address controller, bytes12 prefix, string memory wrappedDID, address newController) public {
7474- bytes32 cowHash = _ensureCowInitialized(controller, prefix, wrappedDID);
6464+ function updateController(address controller, string memory wrappedDID, address newController) public {
6565+ bytes32 cowHash = _ensureCowInitialized(controller, wrappedDID);
7566 updateControllerByHash(cowHash, newController);
7667 }
77687869 function deactivate(bytes32 cowHash) external {
7979- require(cows[cowHash].prefix != bytes12("did::"));
7070+ require(!_isDeactivated(cowHash));
8071 require(msg.sender == cows[cowHash].controller);
81728282- cows[cowHash].prefix = bytes12("did::");
7373+ cows[cowHash].wrappedDID = DEACTIVATED;
8374 cows[cowHash].controller = address(0);
84758576 emit CowDeactivated(cowHash);
8677 }
8787-8878}