From 62ff44d6f4dad361367d40146050b52ce5d63616 Mon Sep 17 00:00:00 2001 From: Leonardo Lima Date: Fri, 16 Feb 2024 00:17:07 +0000 Subject: [PATCH] feat: add fedimint `OOBNotes` --- .cargo/config | 4 ++++ waila-wasm/src/lib.rs | 5 ++++ waila/Cargo.toml | 12 ++++++---- waila/src/lib.rs | 56 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 .cargo/config diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 0000000..caaeecc --- /dev/null +++ b/.cargo/config @@ -0,0 +1,4 @@ +[build] +target = "wasm32-unknown-unknown" +# for fedimint to use tokio::task::Builder - https://github.com/fedimint/fedimint/issues/3951 +rustflags = ["--cfg", "tokio_unstable"] diff --git a/waila-wasm/src/lib.rs b/waila-wasm/src/lib.rs index 26ff7c8..89f033d 100644 --- a/waila-wasm/src/lib.rs +++ b/waila-wasm/src/lib.rs @@ -111,6 +111,11 @@ impl PaymentParams { self.params.cashu_token().and_then(|t| t.serialize().ok()) } + #[wasm_bindgen(getter)] + pub fn fedimint_oob_notes(&self) -> Option { + self.params.fedimint_oob_notes().map(|t| t.to_string()) + } + #[wasm_bindgen(getter)] pub fn payjoin_endpoint(&self) -> Option { self.params.payjoin_endpoint().map(|n| n.to_string()) diff --git a/waila/Cargo.toml b/waila/Cargo.toml index f747b08..d8f5d26 100644 --- a/waila/Cargo.toml +++ b/waila/Cargo.toml @@ -15,18 +15,20 @@ keywords = ["lightning", "bitcoin", "bip21", "lnurl"] crate-type = ["cdylib", "rlib"] [dependencies] -bech32 = "0.9.1" +bech32 = { version = "0.9.1"} bitcoin = { version = "0.30.2", default-features = false, features = ["serde"] } -bip21 = "0.3.1" -itertools = "0.12.0" +bip21 = { version = "0.3.1"} +itertools = { version = "0.12.0"} nostr = { version = "0.27.0", default-features = false, features = ["nip47"] } lnurl-rs = { version = "0.4.0", default-features = false } lightning-invoice = { version = "0.29.0", default-features = false } lightning = { version = "0.0.121", default-features = false } rgb-std = { version = "0.10.9", optional = true } rgb-wallet = { version = "0.10.9", optional = true } -url = "2.4.1" -moksha-core = "0.1.2" +url = { version = "2.4.1"} +moksha-core = { version = "0.1.2"} + +fedimint-mint-client = { git = "https://github.com/fedimint/fedimint", rev = "6a923ee10c3a578cd835044e3fdd94aa5123735a" } [features] default = ["std"] diff --git a/waila/src/lib.rs b/waila/src/lib.rs index f8ac654..83a4c6c 100644 --- a/waila/src/lib.rs +++ b/waila/src/lib.rs @@ -1,4 +1,5 @@ use bech32::Variant; +use fedimint_mint_client::OOBNotes; use std::convert::{TryFrom, TryInto}; use std::str::FromStr; @@ -41,6 +42,7 @@ pub enum PaymentParams<'a> { FedimintInvite(String), NostrWalletAuth(NIP49URI), CashuToken(TokenV3), + FedimintOOBNotes(OOBNotes), #[cfg(feature = "rgb")] Rgb(RgbInvoice), } @@ -72,6 +74,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -91,6 +94,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(invoice) => invoice.chain.and_then(map_chain_to_network), } @@ -116,6 +120,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(invoice) => invoice .chain @@ -146,6 +151,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(token) => Some(token.total_amount() * 1000), + PaymentParams::FedimintOOBNotes(oob_notes) => Some(oob_notes.total_amount().msats), #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -165,6 +171,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -184,6 +191,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -203,6 +211,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -222,6 +231,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -245,6 +255,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -264,6 +275,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -289,6 +301,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -308,6 +321,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -327,6 +341,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(i) => Some(i.clone()), PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -346,6 +361,7 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(a) => Some(a.clone()), PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(_) => None, #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -365,6 +381,27 @@ impl PaymentParams<'_> { PaymentParams::FedimintInvite(_) => None, PaymentParams::NostrWalletAuth(_) => None, PaymentParams::CashuToken(a) => Some(a.clone()), + PaymentParams::FedimintOOBNotes(_) => None, + #[cfg(feature = "rgb")] + PaymentParams::Rgb(_) => None, + } + } + + pub fn fedimint_oob_notes(&self) -> Option { + match self { + PaymentParams::OnChain(_) => None, + PaymentParams::Bip21(_) => None, + PaymentParams::Bolt11(_) => None, + PaymentParams::Bolt12(_) => None, + PaymentParams::Bolt12Refund(_) => None, + PaymentParams::NodePubkey(_) => None, + PaymentParams::LnUrl(_) => None, + PaymentParams::LightningAddress(_) => None, + PaymentParams::Nostr(_) => None, + PaymentParams::FedimintInvite(_) => None, + PaymentParams::NostrWalletAuth(_) => None, + PaymentParams::CashuToken(_) => None, + PaymentParams::FedimintOOBNotes(a) => Some(a.clone()), #[cfg(feature = "rgb")] PaymentParams::Rgb(_) => None, } @@ -462,6 +499,7 @@ impl FromStr for PaymentParams<'_> { .or_else(|_| NIP49URI::from_str(str).map(PaymentParams::NostrWalletAuth)) .or_else(|_| parse_fedi_invite_code(str).map(PaymentParams::FedimintInvite)) .or_else(|_| TokenV3::try_from(str.to_string()).map(PaymentParams::CashuToken)) + .or_else(|_| OOBNotes::from_str(str).map(PaymentParams::FedimintOOBNotes)) .map_err(|_| ()) } } @@ -485,6 +523,8 @@ mod tests { const SAMPLE_FEDI_INVITE_CODE: &str = "fed11jpr3lgm8tuhcky2r3g287tgk9du7dd7kr95fptdsmkca7cwcvyu0lyqeh0e6rgp4u0shxsfaxycpwqpfwaehxw309askcurgvyhx6at5d9h8jmn9wsknqvfwv3jhvtnxv4jxjcn5vvhxxmmd9udpnpn49yg9w98dejw9u76hmm9"; const SAMPLE_NWA: &str = "nostr+walletauth://b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558e9d4?relay=wss%3A%2F%2Frelay.damus.io&secret=b8a30fafa48d4795b6c0eec169a383de&required_commands=pay_invoice&optional_commands=get_balance&budget=10000%2Fdaily"; const SAMPLE_CASHU_TOKEN: &str = "cashuAeyJ0b2tlbiI6W3sibWludCI6Imh0dHBzOi8vODMzMy5zcGFjZTozMzM4IiwicHJvb2ZzIjpbeyJhbW91bnQiOjIsImlkIjoiMDA5YTFmMjkzMjUzZTQxZSIsInNlY3JldCI6IjQwNzkxNWJjMjEyYmU2MWE3N2UzZTZkMmFlYjRjNzI3OTgwYmRhNTFjZDA2YTZhZmMyOWUyODYxNzY4YTc4MzciLCJDIjoiMDJiYzkwOTc5OTdkODFhZmIyY2M3MzQ2YjVlNDM0NWE5MzQ2YmQyYTUwNmViNzk1ODU5OGE3MmYwY2Y4NTE2M2VhIn0seyJhbW91bnQiOjgsImlkIjoiMDA5YTFmMjkzMjUzZTQxZSIsInNlY3JldCI6ImZlMTUxMDkzMTRlNjFkNzc1NmIwZjhlZTBmMjNhNjI0YWNhYTNmNGUwNDJmNjE0MzNjNzI4YzcwNTdiOTMxYmUiLCJDIjoiMDI5ZThlNTA1MGI4OTBhN2Q2YzA5NjhkYjE2YmMxZDVkNWZhMDQwZWExZGUyODRmNmVjNjlkNjEyOTlmNjcxMDU5In1dfV0sInVuaXQiOiJzYXQiLCJtZW1vIjoiVGhhbmsgeW91LiJ9"; + // TODO: (@leonardo) update the value for a valid fedimint OOBNotes + const SAMPLE_FEDIMINT_OOB_NOTES: &str = "cashuAeyJ0b2tlbiI6W3sibWludCI6Imh0dHBzOi8vODMzMy5zcGFjZTozMzM4IiwicHJvb2ZzIjpbeyJhbW91bnQiOjIsImlkIjoiMDA5YTFmMjkzMjUzZTQxZSIsInNlY3JldCI6IjQwNzkxNWJjMjEyYmU2MWE3N2UzZTZkMmFlYjRjNzI3OTgwYmRhNTFjZDA2YTZhZmMyOWUyODYxNzY4YTc4MzciLCJDIjoiMDJiYzkwOTc5OTdkODFhZmIyY2M3MzQ2YjVlNDM0NWE5MzQ2YmQyYTUwNmViNzk1ODU5OGE3MmYwY2Y4NTE2M2VhIn0seyJhbW91bnQiOjgsImlkIjoiMDA5YTFmMjkzMjUzZTQxZSIsInNlY3JldCI6ImZlMTUxMDkzMTRlNjFkNzc1NmIwZjhlZTBmMjNhNjI0YWNhYTNmNGUwNDJmNjE0MzNjNzI4YzcwNTdiOTMxYmUiLCJDIjoiMDI5ZThlNTA1MGI4OTBhN2Q2YzA5NjhkYjE2YmMxZDVkNWZhMDQwZWExZGUyODRmNmVjNjlkNjEyOTlmNjcxMDU5In1dfV0sInVuaXQiOiJzYXQiLCJtZW1vIjoiVGhhbmsgeW91LiJ9"; #[cfg(feature = "rgb")] const SAMPLE_RGB_INVOICE: &str = "rgb:Cbw1h3zbHgRhA6sxb4FS3Z7GTpdj9MLb7Do88qh5TUH1/RGB20/1+utxob0KPoUVTWL3WqyY6zsJY5giaugWHt5n4hEeWMQymQJmPRFPXL2n"; @@ -847,6 +887,22 @@ mod tests { ) } + #[test] + fn parse_fedimint_oob_notes() { + let parsed = PaymentParams::from_str(SAMPLE_FEDIMINT_OOB_NOTES).unwrap(); + + 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.amount(), Some(Amount::from_sat(10))); + assert_eq!( + parsed.fedimint_oob_notes(), + Some(OOBNotes::from_str(SAMPLE_FEDIMINT_OOB_NOTES).unwrap()) + ) + } + #[test] fn parse_nwa() { let parsed = PaymentParams::from_str(SAMPLE_NWA).unwrap();