Files
amethyst/commons
Claude 7985377a38 feat: private un-react via gift-wrapped deletions + force-private zaps on private notes
Gift-wrapped un-react:
- NIP17Factory.createDeletionNIP17 wraps a NIP-09 deletion to explicit
  recipients + self-copy, so the retracted rumor id never reaches public
  relays; DeletionIndex keys by (id, pubkey) and rumor pubkeys are forced
  to the seal's, so wrapped deletions are authenticated on receive
- Account.deletePrivately sends the wrapped deletion to the target
  rumor's participants (author + tagged users)
- AccountViewModel.reactToOrDelete now partitions reactions: public ones
  get a public NIP-09, rumor reactions get a wrapped one — un-react on
  private notes and NIP-17 chats works instead of no-op

Force-private zaps on private rumors:
- AccountViewModel.zap forces ZapType.PRIVATE for empty-sig targets
  (NONZAP kept: no receipt at all is even more private)
- ZapCustomDialog only offers Private/None for private targets
- Zap button re-enabled on private rumors; nutzap (public kind 9321) is
  refused with an explanatory error and the onchain rail is hidden, as
  both would e-tag the rumor id publicly
- Note: the LN provider's public 9735 receipt still carries the e-tag —
  the private zap type protects sender identity and comment, not the
  zapped id itself

Also verified: ReactionEvent consume counts empty-sig rumors (wasVerified
path) so wrapped reactions tally correctly.

https://claude.ai/code/session_01B39MQmrT3dz137nfpXABvo
2026-06-11 20:53:53 +00:00
..