···177177- `deactivateByHash(cowHash)` — permanently deactivate by pre-computed hash
178178179179**CLI tool (`cli/cow.py`):**
180180-- `resolve <did>` — resolve to current state and fetch wrapped DID document
180180+- `resolve <did>` — fetch the wrapped DID document
181181+- `describe <did>` — show on-chain state (controller, wrapped DID, registration status)
182182+- `initialize <did>` — register on-chain without making any updates (useful to take advantage of low-gas periods)
181183- `update-wrapped <did> <newWrappedDID>` — update the wrapped DID
182184- `update-controller <did> <newController>` — transfer control
183185- `deactivate <did>` — permanently deactivate
+55-20
cli/cow.py
···168168169169@cli.command()
170170@click.argument("did")
171171-@click.option("--no-doc", is_flag=True, help="Skip fetching the wrapped DID document.")
172172-def resolve(did, no_doc):
173173- """Resolve a did:cow DID to its current state and wrapped DID document.
171171+def resolve(did):
172172+ """Fetch the DID document for a did:cow DID.
174173175174 \b
176175 DID format: did:cow:<controller_address>:<method>:<id>
···180179 w3 = _w3()
181180 contract = _contract(w3)
182181182182+ wrapped_did, _ = contract.functions.resolveCow(
183183+ _controller_address(controller_hex),
184184+ initial_wrapped,
185185+ ).call()
186186+187187+ if wrapped_did == "":
188188+ raise click.ClickException("DID is deactivated")
189189+190190+ url, doc = _resolve_did_doc(_strip_did_prefix(wrapped_did))
191191+ click.echo(f"resolved from: {url}")
192192+ click.echo(json.dumps(doc, indent=2))
193193+194194+195195+@cli.command()
196196+@click.argument("did")
197197+def describe(did):
198198+ """Show the on-chain state of a did:cow DID without fetching the wrapped DID document."""
199199+ controller_hex, initial_wrapped = _parse_cow_did(did)
200200+ w3 = _w3()
201201+ contract = _contract(w3)
202202+183203 wrapped_did, controller = contract.functions.resolveCow(
184204 _controller_address(controller_hex),
185205 initial_wrapped,
···189209 click.echo("status: deactivated")
190210 return
191211192192- initial_full = f"did:{initial_wrapped}"
193193- on_chain = wrapped_did != initial_full or controller != _controller_address(controller_hex)
194194- if not on_chain:
195195- click.echo("status: not yet registered on-chain")
196196- click.echo(f"wrapped: {wrapped_did} (from DID)")
197197- click.echo(f"controller: {controller} (initial)")
198198- else:
199199- click.echo("status: active")
200200- click.echo(f"wrapped: {wrapped_did}")
201201- click.echo(f"controller: {controller}")
212212+ cow_hash = contract.functions.calculateCowHash(
213213+ _controller_address(controller_hex),
214214+ initial_wrapped,
215215+ ).call()
216216+ registered = bytes(contract.functions.cows(cow_hash).call()[1]).decode() != ""
202217203203- current_wrapped = _strip_did_prefix(wrapped_did)
204204-205205- if not no_doc:
206206- click.echo("")
207207- url, doc = _resolve_did_doc(current_wrapped)
208208- click.echo(f"resolved from: {url}")
209209- click.echo(json.dumps(doc, indent=2))
218218+ click.echo(f"status: {'active' if registered else 'not registered on-chain'}")
219219+ click.echo(f"wrapped: {wrapped_did}")
220220+ click.echo(f"controller: {controller}")
210221211222212223@cli.command("update-wrapped")
···260271261272 _send(w3, account, tx)
262273 click.echo(f"controller: {Web3.to_checksum_address(new_controller)}")
274274+275275+276276+@cli.command()
277277+@click.argument("did")
278278+def initialize(did):
279279+ """Register a did:cow on-chain without making any updates.
280280+281281+ \b
282282+ Useful for locking in registration during low-gas periods before any
283283+ updates are needed. Has no effect if already registered.
284284+ """
285285+ controller_hex, initial_wrapped = _parse_cow_did(did)
286286+287287+ w3 = _w3()
288288+ contract = _contract(w3)
289289+ account = _account(w3)
290290+291291+ tx = contract.functions.initializeCow(
292292+ _controller_address(controller_hex),
293293+ initial_wrapped,
294294+ ).build_transaction({"from": account.address})
295295+296296+ _send(w3, account, tx)
297297+ click.echo("initialized.")
263298264299265300@cli.command()