mirror of
https://github.com/aljazceru/bitcoin-waila.git
synced 2025-12-17 04:54:18 +01:00
@@ -16,6 +16,6 @@ crate-type = ["cdylib", "rlib"]
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitcoin-waila = { path = "../waila", version = "0.2.6" }
|
bitcoin-waila = { path = "../waila", version = "0.2.6" }
|
||||||
bitcoin = "0.29.2"
|
bitcoin = "0.30.2"
|
||||||
nostr = { version = "=0.23.0-bitcoin-v0.29", default-features = false, features = ["nip19"] }
|
nostr = { version = "0.26.0", default-features = false, features = ["std"] }
|
||||||
wasm-bindgen = "0.2.84"
|
wasm-bindgen = "0.2.84"
|
||||||
|
|||||||
@@ -16,21 +16,21 @@ crate-type = ["cdylib", "rlib"]
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bech32 = "0.9.1"
|
bech32 = "0.9.1"
|
||||||
bitcoin = { version = "0.29.2", default-features = false, features = ["serde"] }
|
bitcoin = { version = "0.30.2", default-features = false, features = ["serde"] }
|
||||||
bip21 = "0.2.0"
|
bip21 = "0.3.1"
|
||||||
itertools = "0.12.0"
|
itertools = "0.12.0"
|
||||||
nostr = { version = "=0.23.0-bitcoin-v0.29", default-features = false, features = ["nip19", "nip47"] }
|
nostr = { version = "0.26.0", default-features = false, features = ["nip47"] }
|
||||||
lnurl-rs = { version = "0.3", default-features = false }
|
lnurl-rs = { version = "0.4.0", default-features = false }
|
||||||
lightning-invoice = { version = "0.26.0", default-features = false }
|
lightning-invoice = { version = "0.27.0", default-features = false }
|
||||||
lightning = { version = "0.0.118", default-features = false }
|
lightning = { version = "0.0.119", default-features = false }
|
||||||
rgb-std = { version = "0.10.9", optional = true }
|
rgb-std = { version = "0.10.9", optional = true }
|
||||||
rgb-wallet = { version = "0.10.9", optional = true }
|
rgb-wallet = { version = "0.10.9", optional = true }
|
||||||
url = "2.4.1"
|
url = "2.4.1"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["std"]
|
default = ["std"]
|
||||||
std = ["bitcoin/std", "lightning-invoice/std", "lightning/std"]
|
std = ["bitcoin/std", "lightning-invoice/std", "lightning/std", "nostr/std"]
|
||||||
no-std = ["bitcoin/no-std", "lightning-invoice/no-std", "lightning/no-std"]
|
no-std = ["bitcoin/no-std", "lightning-invoice/no-std", "lightning/no-std", "nostr/alloc"]
|
||||||
rgb = ["rgb-std", "rgb-wallet"]
|
rgb = ["rgb-std", "rgb-wallet"]
|
||||||
|
|
||||||
[package.metadata.wasm-pack.profile.release]
|
[package.metadata.wasm-pack.profile.release]
|
||||||
|
|||||||
@@ -4,11 +4,12 @@ use std::convert::TryFrom;
|
|||||||
|
|
||||||
use ::bip21::de::*;
|
use ::bip21::de::*;
|
||||||
use ::bip21::*;
|
use ::bip21::*;
|
||||||
|
use bitcoin::address::NetworkUnchecked;
|
||||||
use lightning_invoice::{Bolt11Invoice, ParseOrSemanticError};
|
use lightning_invoice::{Bolt11Invoice, ParseOrSemanticError};
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
/// This lets us parse `lightning` and payjoin parameters from a BIP21 URI.
|
/// This lets us parse `lightning` and payjoin parameters from a BIP21 URI.
|
||||||
pub type UnifiedUri<'a> = Uri<'a, WailaExtras>;
|
pub type UnifiedUri<'a> = Uri<'a, NetworkUnchecked, WailaExtras>;
|
||||||
|
|
||||||
#[derive(Debug, Default, Eq, PartialEq, Clone, Hash)]
|
#[derive(Debug, Default, Eq, PartialEq, Clone, Hash)]
|
||||||
pub struct WailaExtras {
|
pub struct WailaExtras {
|
||||||
@@ -116,9 +117,7 @@ mod test {
|
|||||||
|
|
||||||
use lightning_invoice::Bolt11Invoice;
|
use lightning_invoice::Bolt11Invoice;
|
||||||
|
|
||||||
use crate::bip21::WailaExtras;
|
use crate::bip21::UnifiedUri;
|
||||||
|
|
||||||
type UnifiedUri<'a> = bip21::Uri<'a, WailaExtras>;
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_ln_uri() {
|
fn test_ln_uri() {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
|
use bech32::Variant;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use bitcoin::blockdata::constants::ChainHash;
|
use bitcoin::blockdata::constants::ChainHash;
|
||||||
|
use bitcoin::key::XOnlyPublicKey;
|
||||||
use bitcoin::secp256k1::PublicKey;
|
use bitcoin::secp256k1::PublicKey;
|
||||||
use bitcoin::{Address, Amount, Network};
|
use bitcoin::{Address, Amount, Network};
|
||||||
use lightning::offers::offer;
|
use lightning::offers::offer;
|
||||||
@@ -10,11 +12,12 @@ use lightning::offers::refund::Refund;
|
|||||||
use lightning_invoice::{Bolt11Invoice, Bolt11InvoiceDescription};
|
use lightning_invoice::{Bolt11Invoice, Bolt11InvoiceDescription};
|
||||||
use lnurl::lightning_address::LightningAddress;
|
use lnurl::lightning_address::LightningAddress;
|
||||||
use lnurl::lnurl::LnUrl;
|
use lnurl::lnurl::LnUrl;
|
||||||
use nostr::prelude::*;
|
use nostr::FromBech32;
|
||||||
#[cfg(feature = "rgb")]
|
#[cfg(feature = "rgb")]
|
||||||
use rgbstd::Chain;
|
use rgbstd::Chain;
|
||||||
#[cfg(feature = "rgb")]
|
#[cfg(feature = "rgb")]
|
||||||
use rgbwallet::RgbInvoice;
|
use rgbwallet::RgbInvoice;
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
use crate::bip21::UnifiedUri;
|
use crate::bip21::UnifiedUri;
|
||||||
use crate::nwa::NIP49URI;
|
use crate::nwa::NIP49URI;
|
||||||
@@ -92,7 +95,7 @@ impl PaymentParams<'_> {
|
|||||||
/// Returns None if the network is unknown
|
/// Returns None if the network is unknown
|
||||||
pub fn valid_for_network(&self, network: Network) -> Option<bool> {
|
pub fn valid_for_network(&self, network: Network) -> Option<bool> {
|
||||||
match self {
|
match self {
|
||||||
PaymentParams::OnChain(address) => Some(address.is_valid_for_network(network)),
|
PaymentParams::OnChain(address) => Some(address.network == network),
|
||||||
PaymentParams::Bip21(uri) => Some(uri.address.is_valid_for_network(network)),
|
PaymentParams::Bip21(uri) => Some(uri.address.is_valid_for_network(network)),
|
||||||
PaymentParams::Bolt11(invoice) => Some(Network::from(invoice.currency()) == network),
|
PaymentParams::Bolt11(invoice) => Some(Network::from(invoice.currency()) == network),
|
||||||
PaymentParams::Bolt12(offer) => {
|
PaymentParams::Bolt12(offer) => {
|
||||||
@@ -144,7 +147,7 @@ impl PaymentParams<'_> {
|
|||||||
pub fn address(&self) -> Option<Address> {
|
pub fn address(&self) -> Option<Address> {
|
||||||
match self {
|
match self {
|
||||||
PaymentParams::OnChain(address) => Some(address.clone()),
|
PaymentParams::OnChain(address) => Some(address.clone()),
|
||||||
PaymentParams::Bip21(uri) => Some(uri.address.clone()),
|
PaymentParams::Bip21(uri) => Some(uri.address.clone().assume_checked()),
|
||||||
PaymentParams::Bolt11(invoice) => invoice.fallback_addresses().first().cloned(),
|
PaymentParams::Bolt11(invoice) => invoice.fallback_addresses().first().cloned(),
|
||||||
PaymentParams::Bolt12(_) => None,
|
PaymentParams::Bolt12(_) => None,
|
||||||
PaymentParams::Bolt12Refund(_) => None,
|
PaymentParams::Bolt12Refund(_) => None,
|
||||||
@@ -410,7 +413,7 @@ impl FromStr for PaymentParams<'_> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Address::from_str(str)
|
Address::from_str(str)
|
||||||
.map(PaymentParams::OnChain)
|
.map(|a| PaymentParams::OnChain(a.assume_checked()))
|
||||||
.or_else(|_| Bolt11Invoice::from_str(str).map(PaymentParams::Bolt11))
|
.or_else(|_| Bolt11Invoice::from_str(str).map(PaymentParams::Bolt11))
|
||||||
.or_else(|_| UnifiedUri::from_str(str).map(PaymentParams::Bip21))
|
.or_else(|_| UnifiedUri::from_str(str).map(PaymentParams::Bip21))
|
||||||
.or_else(|_| LightningAddress::from_str(str).map(PaymentParams::LightningAddress))
|
.or_else(|_| LightningAddress::from_str(str).map(PaymentParams::LightningAddress))
|
||||||
@@ -463,7 +466,9 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_address() {
|
fn parse_address() {
|
||||||
let address = Address::from_str("1andreas3batLhQa2FawWjeyjCqyBzypd").unwrap();
|
let address = Address::from_str("1andreas3batLhQa2FawWjeyjCqyBzypd")
|
||||||
|
.unwrap()
|
||||||
|
.assume_checked();
|
||||||
let parsed = PaymentParams::from_str(&address.to_string()).unwrap();
|
let parsed = PaymentParams::from_str(&address.to_string()).unwrap();
|
||||||
|
|
||||||
assert_eq!(parsed.address(), Some(address));
|
assert_eq!(parsed.address(), Some(address));
|
||||||
@@ -486,7 +491,11 @@ mod tests {
|
|||||||
assert_eq!(parsed.network(), Some(Network::Bitcoin));
|
assert_eq!(parsed.network(), Some(Network::Bitcoin));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parsed.address(),
|
parsed.address(),
|
||||||
Some(Address::from_str("1RustyRX2oai4EYYDpQGWvEL62BBGqN9T").unwrap())
|
Some(
|
||||||
|
Address::from_str("1RustyRX2oai4EYYDpQGWvEL62BBGqN9T")
|
||||||
|
.unwrap()
|
||||||
|
.assume_checked()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
assert_eq!(parsed.memo(), None);
|
assert_eq!(parsed.memo(), None);
|
||||||
assert_eq!(parsed.lnurl(), None);
|
assert_eq!(parsed.lnurl(), None);
|
||||||
@@ -527,7 +536,11 @@ mod tests {
|
|||||||
assert_eq!(parsed.network(), Some(Network::Bitcoin));
|
assert_eq!(parsed.network(), Some(Network::Bitcoin));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parsed.address(),
|
parsed.address(),
|
||||||
Some(Address::from_str("1RustyRX2oai4EYYDpQGWvEL62BBGqN9T").unwrap())
|
Some(
|
||||||
|
Address::from_str("1RustyRX2oai4EYYDpQGWvEL62BBGqN9T")
|
||||||
|
.unwrap()
|
||||||
|
.assume_checked()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
assert_eq!(parsed.memo(), None);
|
assert_eq!(parsed.memo(), None);
|
||||||
assert_eq!(parsed.lnurl(), None);
|
assert_eq!(parsed.lnurl(), None);
|
||||||
@@ -546,7 +559,11 @@ mod tests {
|
|||||||
assert_eq!(parsed.network(), Some(Network::Bitcoin));
|
assert_eq!(parsed.network(), Some(Network::Bitcoin));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parsed.address(),
|
parsed.address(),
|
||||||
Some(Address::from_str("1RustyRX2oai4EYYDpQGWvEL62BBGqN9T").unwrap())
|
Some(
|
||||||
|
Address::from_str("1RustyRX2oai4EYYDpQGWvEL62BBGqN9T")
|
||||||
|
.unwrap()
|
||||||
|
.assume_checked()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
assert_eq!(parsed.memo(), None);
|
assert_eq!(parsed.memo(), None);
|
||||||
assert_eq!(parsed.lnurl(), None);
|
assert_eq!(parsed.lnurl(), None);
|
||||||
@@ -559,7 +576,11 @@ mod tests {
|
|||||||
assert_eq!(parsed.amount(), Some(Amount::from_btc(50_f64).unwrap()));
|
assert_eq!(parsed.amount(), Some(Amount::from_btc(50_f64).unwrap()));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parsed.address(),
|
parsed.address(),
|
||||||
Some(Address::from_str("1andreas3batLhQa2FawWjeyjCqyBzypd").unwrap())
|
Some(
|
||||||
|
Address::from_str("1andreas3batLhQa2FawWjeyjCqyBzypd")
|
||||||
|
.unwrap()
|
||||||
|
.assume_checked()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
assert_eq!(parsed.memo(), Some("Donation for project xyz".to_string()));
|
assert_eq!(parsed.memo(), Some("Donation for project xyz".to_string()));
|
||||||
assert_eq!(parsed.network(), Some(Network::Bitcoin));
|
assert_eq!(parsed.network(), Some(Network::Bitcoin));
|
||||||
@@ -575,7 +596,11 @@ mod tests {
|
|||||||
assert_eq!(parsed.amount(), Some(Amount::from_btc(0.00001).unwrap()));
|
assert_eq!(parsed.amount(), Some(Amount::from_btc(0.00001).unwrap()));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parsed.address(),
|
parsed.address(),
|
||||||
Some(Address::from_str("BC1QYLH3U67J673H6Y6ALV70M0PL2YZ53TZHVXGG7U").unwrap())
|
Some(
|
||||||
|
Address::from_str("BC1QYLH3U67J673H6Y6ALV70M0PL2YZ53TZHVXGG7U")
|
||||||
|
.unwrap()
|
||||||
|
.assume_checked()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
assert_eq!(parsed.memo(), Some("For lunch Tuesday".to_string()));
|
assert_eq!(parsed.memo(), Some("For lunch Tuesday".to_string()));
|
||||||
assert_eq!(parsed.network(), Some(Network::Bitcoin));
|
assert_eq!(parsed.network(), Some(Network::Bitcoin));
|
||||||
@@ -602,6 +627,7 @@ mod tests {
|
|||||||
Some(
|
Some(
|
||||||
Address::from_str("tb1p0vztr8q25czuka5u4ta5pqu0h8dxkf72mam89cpg4tg40fm8wgmqp3gv99")
|
Address::from_str("tb1p0vztr8q25czuka5u4ta5pqu0h8dxkf72mam89cpg4tg40fm8wgmqp3gv99")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
.assume_checked()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
assert_eq!(parsed.memo(), Some("yooo".to_string()));
|
assert_eq!(parsed.memo(), Some("yooo".to_string()));
|
||||||
|
|||||||
@@ -112,26 +112,6 @@ pub struct NIP49URI {
|
|||||||
pub identity: Option<XOnlyPublicKey>,
|
pub identity: Option<XOnlyPublicKey>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn method_from_str(s: &str) -> Result<Method, Error> {
|
|
||||||
match s {
|
|
||||||
"pay_invoice" => Ok(Method::PayInvoice),
|
|
||||||
"make_invoice" => Ok(Method::MakeInvoice),
|
|
||||||
"lookup_invoice" => Ok(Method::LookupInvoice),
|
|
||||||
"get_balance" => Ok(Method::GetBalance),
|
|
||||||
_ => Err(Error::InvalidURI),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn method_to_string(method: &Method) -> String {
|
|
||||||
match method {
|
|
||||||
Method::PayInvoice => "pay_invoice",
|
|
||||||
Method::MakeInvoice => "make_invoice",
|
|
||||||
Method::LookupInvoice => "lookup_invoice",
|
|
||||||
Method::GetBalance => "get_balance",
|
|
||||||
}
|
|
||||||
.to_string()
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromStr for NIP49URI {
|
impl FromStr for NIP49URI {
|
||||||
type Err = Error;
|
type Err = Error;
|
||||||
fn from_str(uri: &str) -> Result<Self, Self::Err> {
|
fn from_str(uri: &str) -> Result<Self, Self::Err> {
|
||||||
@@ -162,13 +142,13 @@ impl FromStr for NIP49URI {
|
|||||||
Cow::Borrowed("required_commands") => {
|
Cow::Borrowed("required_commands") => {
|
||||||
required_commands = value
|
required_commands = value
|
||||||
.split(' ')
|
.split(' ')
|
||||||
.map(method_from_str)
|
.map(Method::from_str)
|
||||||
.collect::<Result<Vec<Method>, Error>>()?;
|
.collect::<Result<Vec<Method>, Error>>()?;
|
||||||
}
|
}
|
||||||
Cow::Borrowed("optional_commands") => {
|
Cow::Borrowed("optional_commands") => {
|
||||||
optional_commands = value
|
optional_commands = value
|
||||||
.split(' ')
|
.split(' ')
|
||||||
.map(method_from_str)
|
.map(Method::from_str)
|
||||||
.collect::<Result<Vec<Method>, Error>>()?;
|
.collect::<Result<Vec<Method>, Error>>()?;
|
||||||
}
|
}
|
||||||
Cow::Borrowed("budget") => {
|
Cow::Borrowed("budget") => {
|
||||||
@@ -213,7 +193,7 @@ impl fmt::Display for NIP49URI {
|
|||||||
url_encode(
|
url_encode(
|
||||||
self.required_commands
|
self.required_commands
|
||||||
.iter()
|
.iter()
|
||||||
.map(method_to_string)
|
.map(|x| x.to_string())
|
||||||
.join(" ")
|
.join(" ")
|
||||||
),
|
),
|
||||||
)?;
|
)?;
|
||||||
@@ -224,7 +204,7 @@ impl fmt::Display for NIP49URI {
|
|||||||
url_encode(
|
url_encode(
|
||||||
self.optional_commands
|
self.optional_commands
|
||||||
.iter()
|
.iter()
|
||||||
.map(method_to_string)
|
.map(|x| x.to_string())
|
||||||
.join(" ")
|
.join(" ")
|
||||||
)
|
)
|
||||||
)?;
|
)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user