diff --git a/README.md b/README.md index eb89d3e..9f631b2 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Install the Android SDK / NDK, then from the repo root: ## Identity service (`goblin-nip05d`) -The optional `name` service lives in `goblin-nip05d/` (axum + SQLite) and is deployed at [goblin.st](https://goblin.st). It implements [NIP-05](https://nips.nostr.com/5) resolution, [NIP-98](https://nips.nostr.com/98)-authenticated registration/transfer/release. The wallet is fully usable — and fully anonymous — without it. Avatars aren't stored or served — clients render them from the pubkey (an npub gradient with the username's first letter, else the Grin mark). +The optional `name` service lives in `goblin-nip05d/` (axum + SQLite) and is deployed at [goblin.st](https://goblin.st). It implements [NIP-05](https://nips.nostr.com/5) resolution, [NIP-98](https://nips.nostr.com/98)-authenticated registration and release (names are never transferred — on a key rotation you release the old name and re-register, or import your existing identity). The wallet is fully usable — and fully anonymous — without it. Avatars aren't stored or served — clients render them from the pubkey (an npub gradient with the username's first letter, else the Grin mark). ## License diff --git a/src/nostr/nip05.rs b/src/nostr/nip05.rs index d8e1731..47a55cb 100644 --- a/src/nostr/nip05.rs +++ b/src/nostr/nip05.rs @@ -305,48 +305,6 @@ pub async fn register(server: &str, name: &str, keys: &Keys) -> RegisterResult { } } -/// Atomically move an owned name to a new pubkey (key rotation). -/// Signed by the OLD key; the server enforces ownership and the -/// one-name-per-pubkey rule for the target key. -pub async fn transfer( - server: &str, - name: &str, - old_keys: &Keys, - new_pubkey_hex: &str, -) -> Result<(), String> { - let server = server.trim_end_matches('/'); - let url = format!("{}/api/v1/transfer", server); - let body = serde_json::json!({ - "name": name.to_lowercase(), - "new_pubkey": new_pubkey_hex, - }) - .to_string(); - let Some(auth) = nip98_auth(old_keys, &url, "POST", Some(body.as_bytes())) else { - return Err("auth event build failed".to_string()); - }; - let headers = vec![ - ("Authorization".to_string(), auth), - ("Content-Type".to_string(), "application/json".to_string()), - ]; - let Some(resp) = nym::http_request("POST", url, Some(body), headers).await else { - return Err("network unavailable".to_string()); - }; - if resp.contains("\"transferred\":true") { - return Ok(()); - } - let err = serde_json::from_str::(&resp) - .ok() - .and_then(|d| d.get("error").and_then(|e| e.as_str()).map(String::from)) - .unwrap_or_else(|| { - if resp.trim().is_empty() { - "name server does not support transfer yet".to_string() - } else { - format!("unexpected response: {}", resp) - } - }); - Err(err) -} - /// Release a registered name (NIP-98 authed by the owner). pub async fn unregister(server: &str, name: &str, keys: &Keys) -> Result<(), String> { let server = server.trim_end_matches('/');