Add nostr pubkey

This commit is contained in:
benthecarman
2023-05-18 14:20:24 -05:00
parent 175ec4b82b
commit 96d50eedde
2 changed files with 81 additions and 1 deletions

View File

@@ -17,7 +17,8 @@ crate-type = ["cdylib", "rlib"]
[dependencies] [dependencies]
bitcoin = { version = "0.29.2", default-features = false, features = ["serde"] } bitcoin = { version = "0.29.2", default-features = false, features = ["serde"] }
bip21 = "0.2.0" bip21 = "0.2.0"
lnurl-rs = { version = "0.2.2", default-features = false } nostr = { version = "0.22.0-bitcoin-v0.29", default-features = false, features = ["nip19"] }
lnurl-rs = { version = "0.2.4", default-features = false }
lightning-invoice = { version = "0.23.0", default-features = false } lightning-invoice = { version = "0.23.0", default-features = false }
lightning = { version = "0.0.115", default-features = false } lightning = { version = "0.0.115", default-features = false }
wasm-bindgen = { version = "0.2", optional = true } wasm-bindgen = { version = "0.2", optional = true }

View File

@@ -8,6 +8,7 @@ use lightning::offers::offer::Offer;
use lightning_invoice::{Invoice, InvoiceDescription}; use lightning_invoice::{Invoice, InvoiceDescription};
use lnurl::lightning_address::LightningAddress; use lnurl::lightning_address::LightningAddress;
use lnurl::lnurl::LnUrl; use lnurl::lnurl::LnUrl;
use nostr::prelude::*;
use crate::bip21::UnifiedUri; use crate::bip21::UnifiedUri;
@@ -22,6 +23,7 @@ pub enum PaymentParams<'a> {
NodePubkey(PublicKey), NodePubkey(PublicKey),
LnUrl(LnUrl), LnUrl(LnUrl),
LightningAddress(LightningAddress), LightningAddress(LightningAddress),
Nostr(XOnlyPublicKey),
} }
impl PaymentParams<'_> { impl PaymentParams<'_> {
@@ -41,6 +43,7 @@ impl PaymentParams<'_> {
PaymentParams::NodePubkey(_) => None, PaymentParams::NodePubkey(_) => None,
PaymentParams::LnUrl(_) => None, PaymentParams::LnUrl(_) => None,
PaymentParams::LightningAddress(_) => None, PaymentParams::LightningAddress(_) => None,
PaymentParams::Nostr(_) => None,
} }
} }
@@ -53,6 +56,7 @@ impl PaymentParams<'_> {
PaymentParams::NodePubkey(_) => None, PaymentParams::NodePubkey(_) => None,
PaymentParams::LnUrl(_) => None, PaymentParams::LnUrl(_) => None,
PaymentParams::LightningAddress(_) => None, PaymentParams::LightningAddress(_) => None,
PaymentParams::Nostr(_) => None,
} }
} }
@@ -67,6 +71,7 @@ impl PaymentParams<'_> {
PaymentParams::NodePubkey(_) => None, PaymentParams::NodePubkey(_) => None,
PaymentParams::LnUrl(_) => None, PaymentParams::LnUrl(_) => None,
PaymentParams::LightningAddress(_) => None, PaymentParams::LightningAddress(_) => None,
PaymentParams::Nostr(_) => None,
} }
} }
@@ -87,6 +92,7 @@ impl PaymentParams<'_> {
PaymentParams::NodePubkey(_) => None, PaymentParams::NodePubkey(_) => None,
PaymentParams::LnUrl(_) => None, PaymentParams::LnUrl(_) => None,
PaymentParams::LightningAddress(_) => None, PaymentParams::LightningAddress(_) => None,
PaymentParams::Nostr(_) => None,
} }
} }
@@ -99,6 +105,7 @@ impl PaymentParams<'_> {
PaymentParams::NodePubkey(_) => None, PaymentParams::NodePubkey(_) => None,
PaymentParams::LnUrl(_) => None, PaymentParams::LnUrl(_) => None,
PaymentParams::LightningAddress(_) => None, PaymentParams::LightningAddress(_) => None,
PaymentParams::Nostr(_) => None,
} }
} }
@@ -111,6 +118,7 @@ impl PaymentParams<'_> {
PaymentParams::NodePubkey(_) => None, PaymentParams::NodePubkey(_) => None,
PaymentParams::LnUrl(_) => None, PaymentParams::LnUrl(_) => None,
PaymentParams::LightningAddress(_) => None, PaymentParams::LightningAddress(_) => None,
PaymentParams::Nostr(_) => None,
} }
} }
@@ -127,6 +135,7 @@ impl PaymentParams<'_> {
PaymentParams::NodePubkey(pubkey) => Some(*pubkey), PaymentParams::NodePubkey(pubkey) => Some(*pubkey),
PaymentParams::LnUrl(_) => None, PaymentParams::LnUrl(_) => None,
PaymentParams::LightningAddress(_) => None, PaymentParams::LightningAddress(_) => None,
PaymentParams::Nostr(_) => None,
} }
} }
@@ -139,6 +148,7 @@ impl PaymentParams<'_> {
PaymentParams::NodePubkey(_) => None, PaymentParams::NodePubkey(_) => None,
PaymentParams::LnUrl(lnurl) => Some(lnurl.clone()), PaymentParams::LnUrl(lnurl) => Some(lnurl.clone()),
PaymentParams::LightningAddress(ln_addr) => Some(LnUrl::from_url(ln_addr.lnurlp_url())), PaymentParams::LightningAddress(ln_addr) => Some(LnUrl::from_url(ln_addr.lnurlp_url())),
PaymentParams::Nostr(_) => None,
} }
} }
@@ -147,6 +157,19 @@ impl PaymentParams<'_> {
.map(|lnurl| lnurl.is_lnurl_auth()) .map(|lnurl| lnurl.is_lnurl_auth())
.unwrap_or(false) .unwrap_or(false)
} }
pub fn nostr_pubkey(&self) -> Option<XOnlyPublicKey> {
match self {
PaymentParams::OnChain(_) => None,
PaymentParams::Bip21(_) => None,
PaymentParams::Bolt11(_) => None,
PaymentParams::Bolt12(_) => None,
PaymentParams::NodePubkey(_) => None,
PaymentParams::LnUrl(_) => None,
PaymentParams::LightningAddress(_) => None,
PaymentParams::Nostr(key) => Some(key.clone()),
}
}
} }
impl FromStr for PaymentParams<'_> { impl FromStr for PaymentParams<'_> {
@@ -174,6 +197,12 @@ impl FromStr for PaymentParams<'_> {
.map(PaymentParams::LnUrl) .map(PaymentParams::LnUrl)
.or_else(|_| LightningAddress::from_str(str).map(PaymentParams::LightningAddress)) .or_else(|_| LightningAddress::from_str(str).map(PaymentParams::LightningAddress))
.map_err(|_| ()); .map_err(|_| ());
} else if lower.starts_with("nostr:") {
let str = str.strip_prefix("nostr:").unwrap();
return XOnlyPublicKey::from_str(str)
.map(PaymentParams::Nostr)
.or_else(|_| XOnlyPublicKey::from_bech32(str).map(PaymentParams::Nostr))
.map_err(|_| ());
} }
Address::from_str(str) Address::from_str(str)
@@ -184,6 +213,8 @@ impl FromStr for PaymentParams<'_> {
.or_else(|_| LnUrl::from_str(str).map(PaymentParams::LnUrl)) .or_else(|_| LnUrl::from_str(str).map(PaymentParams::LnUrl))
.or_else(|_| PublicKey::from_str(str).map(PaymentParams::NodePubkey)) .or_else(|_| PublicKey::from_str(str).map(PaymentParams::NodePubkey))
.or_else(|_| Offer::from_str(str).map(PaymentParams::Bolt12)) .or_else(|_| Offer::from_str(str).map(PaymentParams::Bolt12))
.or_else(|_| XOnlyPublicKey::from_str(str).map(PaymentParams::Nostr))
.or_else(|_| XOnlyPublicKey::from_bech32(str).map(PaymentParams::Nostr))
.map_err(|_| ()) .map_err(|_| ())
} }
} }
@@ -387,4 +418,52 @@ mod tests {
assert_eq!(parsed.node_pubkey(), None); assert_eq!(parsed.node_pubkey(), None);
assert_eq!(parsed.lnurl(), Some(LnUrl::from_str("lnurl1dp68gurn8ghj7mmswfjhgatjde3x7apwvdhk6tewwajkcmpdddhx7amw9akxuatjd3cz7cn9dc94s6d4").unwrap())); assert_eq!(parsed.lnurl(), Some(LnUrl::from_str("lnurl1dp68gurn8ghj7mmswfjhgatjde3x7apwvdhk6tewwajkcmpdddhx7amw9akxuatjd3cz7cn9dc94s6d4").unwrap()));
} }
#[test]
fn parse_nostr_key() {
let parsed = PaymentParams::from_str(
"npub1u8lnhlw5usp3t9vmpz60ejpyt649z33hu82wc2hpv6m5xdqmuxhs46turz",
)
.unwrap();
assert_eq!(parsed.amount(), None);
assert_eq!(parsed.address(), None);
assert_eq!(parsed.memo(), None);
assert_eq!(parsed.network(), None);
assert_eq!(parsed.invoice(), None);
assert_eq!(parsed.node_pubkey(), None);
assert_eq!(
parsed.nostr_pubkey(),
Some(
XOnlyPublicKey::from_str(
"e1ff3bfdd4e40315959b08b4fcc8245eaa514637e1d4ec2ae166b743341be1af"
)
.unwrap()
)
);
}
#[test]
fn parse_nostr_key_with_prefix() {
let parsed = PaymentParams::from_str(
"nostr:npub1u8lnhlw5usp3t9vmpz60ejpyt649z33hu82wc2hpv6m5xdqmuxhs46turz",
)
.unwrap();
assert_eq!(parsed.amount(), None);
assert_eq!(parsed.address(), None);
assert_eq!(parsed.memo(), None);
assert_eq!(parsed.network(), None);
assert_eq!(parsed.invoice(), None);
assert_eq!(parsed.node_pubkey(), None);
assert_eq!(
parsed.nostr_pubkey(),
Some(
XOnlyPublicKey::from_str(
"e1ff3bfdd4e40315959b08b4fcc8245eaa514637e1d4ec2ae166b743341be1af"
)
.unwrap()
)
);
}
} }