···108108- `updateWrappedDID` / `updateWrappedDIDByHash` — change the wrapped DID
109109- `updateController` / `updateControllerByHash` — transfer control to a new address
110110111111-If the cow has not been registered on-chain yet, `updateWrappedDID` and `updateController` will register it automatically in the same transaction.
111111+If the did:cow ID has not been registered on-chain yet, `updateWrappedDID` and `updateController` will register it automatically in the same transaction.
112112113113### 6.4 Deactivate
114114115115-Call `deactivate(initial_controller_address, initial_wrapped_did)` from the current controller to permanently deactivate a did:cow ID. If the cow has not been registered on-chain yet, it will be registered automatically in the same transaction.
115115+Call `deactivate(initial_controller_address, initial_wrapped_did)` from the current controller to permanently deactivate a did:cow ID. If the did:cow ID has not been registered on-chain yet, it will be registered automatically in the same transaction.
116116117117After deactivation, `resolveCow` returns an empty string and the DID cannot be reactivated.
118118···166166Deployed on Sepolia testnet: [`0x8bd78c8CdCcF951169bbF964A0aCC241Be63B05f`](https://sepolia.etherscan.io/address/0x8bd78c8CdCcF951169bbF964A0aCC241Be63B05f)
167167168168**Contract functions (`CowRegistry.sol`):**
169169-- `calculateCowHash(controller, wrappedDID)` — derive the registry key for a cow
169169+- `calculateCowHash(controller, wrappedDID)` — derive the registry key for a did:cow ID
170170- `resolveCow(controller, wrappedDID)` — return current controller and wrapped DID without needing to pre-compute the hash
171171- `initializeCow(controller, wrappedDID)` — optionally pre-register before first update
172172- `updateWrappedDID(controller, wrappedDID, newWrappedDID)` — update wrapped DID, registering if needed