9768de2fbd
A Goblin payment locks the sender's outputs until the recipient replies (S2) and we finalize+post. If the recipient never connects to nostr, the funds stay locked until the 24h auto-expiry. This adds a manual Cancel that reclaims them on demand (after a 10-min grace, or immediately if the send never reached a relay), marks the payment Cancelled, and best-effort voids it to the recipient. - WalletTask::NostrCancelSend: authoritative tx lookup; refuses if already finalized/confirmed (race); marks meta Cancelled BEFORE cancelling the grin tx; serialized with nostr_finalize_post via a per-service lock so a cancel and a concurrent S2 finalize can't both commit. - nostr_finalize_post returns Ok(false) (skip, no retry/re-post) when the tx is cancelled or the meta is Cancelled — covers the tx-list cancel path too. - decide() already drops a late S2 on a Cancelled meta (new unit tests assert it); recipient-side void marks a received payment Cancelled for display WITHOUT deleting the output (a malicious sender could void-then-post otherwise). - Void-before-S1 ordering handled via a (slate,sender)-bound marker. - Receipt: tap-twice 'Cancel payment' with caveat + outcome notice; honest 'Waiting for X to receive…' label; first-class Cancelled status. 6 locales. - cancel_grace_secs config (default 600).