diff --git a/macos/Goblin.app/Contents/Resources/AppIcon.icns b/macos/Goblin.app/Contents/Resources/AppIcon.icns index edd9b8d..108fb20 100644 Binary files a/macos/Goblin.app/Contents/Resources/AppIcon.icns and b/macos/Goblin.app/Contents/Resources/AppIcon.icns differ diff --git a/src/nostr/client.rs b/src/nostr/client.rs index 8dcbe63..50e03c3 100644 --- a/src/nostr/client.rs +++ b/src/nostr/client.rs @@ -1235,6 +1235,11 @@ async fn handle_wrap(svc: &Arc, wallet: &Wallet, client: &Client, // counterparty inside, so a stranger can't void someone else's request. if let Some(void_slate_id) = protocol::extract_control(&rumor.tags) { handle_request_void(svc, wallet, &void_slate_id, &sender_hex); + // A decline/cancel is still an interaction with a known counterparty — + // (re)resolve their @name so it never drops to a bare npub just because the + // request didn't go through. Cheap, authoritative (reverse lookup), and a + // no-op for anonymous keys. + svc.resolve_contact_identity(&sender_hex); // Record the void keyed by (slate, sender) so a payment S1 that arrives // AFTER its void (relays reorder; NIP-59 randomizes timestamps) is dropped. // Binding to the sender stops a stranger pre-voiding someone else's slate.