···164164165165Deployed on Sepolia testnet: [`0x8560798CD78D09143D0194249503ebe25706ed96`](https://sepolia.etherscan.io/address/0x8560798CD78D09143D0194249503ebe25706ed96)
166166167167-**Contract functions (`CowRegistry.sol`):**
167167+**Contract functions ([`src/CowRegistry.sol`](src/CowRegistry.sol)):**
168168- `calculateHash(controller, wrappedDID)` — derive the registry key for a did:cow ID
169169- `resolve(controller, wrappedDID)` — return current controller and wrapped DID without needing to pre-compute the hash
170170- `initialize(controller, wrappedDID)` — optionally pre-register before first update
···175175- `deactivate(controller, wrappedDID)` — permanently deactivate, registering if needed
176176- `deactivateByHash(cowHash)` — permanently deactivate by pre-computed hash
177177178178-**CLI tool (`cli/cow.py`):**
178178+**CLI tool ([`cli/cow.py`](cli/cow.py)):**
179179- `resolve <did>` — fetch the resolved DID document
180180- `describe <did>` — show on-chain state (controller, wrapped DID, registration status)
181181- `initialize <did>` — register on-chain without making any updates (useful to take advantage of low-gas periods)