module NostrManager class VerifyZapRequest < NostrManagerService def initialize(amount:, event:, lnurl: nil) @amount, @event, @lnurl = amount, event, lnurl end # https://github.com/nostr-protocol/nips/blob/27fef638e2460139cc9078427a0aec0ce4470517/57.md#appendix-d-lnurl-server-zap-request-validation def call tags = parse_tags(@event.tags) @event.verify_signature && @event.kind == 9734 && tags.present? && valid_p_tag?(tags[:p]) && valid_e_tag?(tags[:e]) && valid_a_tag?(tags[:a]) && valid_amount_tag?(tags[:amount]) && valid_lnurl_tag?(tags[:lnurl]) end def valid_p_tag?(tag) return false unless tag.present? && tag.length == 1 key = Nostr::PublicKey.new(tag.first) rescue nil key.present? end def valid_e_tag?(tag) return true unless tag.present? # TODO validate format of event ID properly tag.length == 1 && tag.first.is_a?(String) end def valid_a_tag?(tag) return true unless tag.present? # TODO validate format of event coordinate properly tag.length == 1 && tag.first.is_a?(String) end def valid_amount_tag?(tag) return true unless tag.present? amount = tag.first amount.is_a?(String) && amount.to_i == @amount end def valid_lnurl_tag?(tag) return true unless tag.present? # TODO validate lnurl matching recipient's lnurlp tag.first.is_a?(String) end end end