52 lines
1.5 KiB
Ruby
52 lines
1.5 KiB
Ruby
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
|