Skip to content

Commit

Permalink
Merge pull request #17 from elnosh/cashu-token
Browse files Browse the repository at this point in the history
add cashu token support
  • Loading branch information
benthecarman authored Feb 9, 2024
2 parents ba6f197 + bedcba6 commit 01b5d57
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 1 deletion.
5 changes: 5 additions & 0 deletions waila-wasm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,11 @@ impl PaymentParams {
self.params.nostr_wallet_auth().map(|u| u.to_string())
}

#[wasm_bindgen(getter)]
pub fn cashu_token(&self) -> Option<String> {
self.params.cashu_token().and_then(|t| t.serialize().ok())
}

#[wasm_bindgen(getter)]
pub fn payjoin_endpoint(&self) -> Option<String> {
self.params.payjoin_endpoint().map(|n| n.to_string())
Expand Down
1 change: 1 addition & 0 deletions waila/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ lightning = { version = "0.0.119", 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"

[features]
default = ["std"]
Expand Down
56 changes: 55 additions & 1 deletion waila/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use bech32::Variant;
use std::convert::TryInto;
use std::convert::{TryFrom, TryInto};
use std::str::FromStr;

use bitcoin::blockdata::constants::ChainHash;
Expand All @@ -12,7 +12,9 @@ use lightning::offers::refund::Refund;
use lightning_invoice::{Bolt11Invoice, Bolt11InvoiceDescription};
use lnurl::lightning_address::LightningAddress;
use lnurl::lnurl::LnUrl;
use moksha_core::model::TokenV3;
use nostr::FromBech32;

#[cfg(feature = "rgb")]
use rgbstd::Chain;
#[cfg(feature = "rgb")]
Expand All @@ -38,6 +40,7 @@ pub enum PaymentParams<'a> {
Nostr(XOnlyPublicKey),
FedimintInvite(String),
NostrWalletAuth(NIP49URI),
CashuToken(TokenV3),
#[cfg(feature = "rgb")]
Rgb(RgbInvoice),
}
Expand Down Expand Up @@ -68,6 +71,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -86,6 +90,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(invoice) => invoice.chain.and_then(map_chain_to_network),
}
Expand All @@ -110,6 +115,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(invoice) => invoice
.chain
Expand Down Expand Up @@ -139,6 +145,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(token) => Some(token.total_amount() * 1000),
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -157,6 +164,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -175,6 +183,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -193,6 +202,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -211,6 +221,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -233,6 +244,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -251,6 +263,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -275,6 +288,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -293,6 +307,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(key) => Some(*key),
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -311,6 +326,7 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(i) => Some(i.clone()),
PaymentParams::NostrWalletAuth(_) => None,
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand All @@ -329,6 +345,26 @@ impl PaymentParams<'_> {
PaymentParams::Nostr(_) => None,
PaymentParams::FedimintInvite(_) => None,
PaymentParams::NostrWalletAuth(a) => Some(a.clone()),
PaymentParams::CashuToken(_) => None,
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
}

pub fn cashu_token(&self) -> Option<TokenV3> {
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(a) => Some(a.clone()),
#[cfg(feature = "rgb")]
PaymentParams::Rgb(_) => None,
}
Expand Down Expand Up @@ -425,6 +461,7 @@ impl FromStr for PaymentParams<'_> {
.or_else(|_| XOnlyPublicKey::from_bech32(str).map(PaymentParams::Nostr))
.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))
.map_err(|_| ())
}
}
Expand All @@ -447,6 +484,7 @@ mod tests {
const SAMPLE_LNURL: &str = "LNURL1DP68GURN8GHJ7UM9WFMXJCM99E3K7MF0V9CXJ0M385EKVCENXC6R2C35XVUKXEFCV5MKVV34X5EKZD3EV56NYD3HXQURZEPEXEJXXEPNXSCRVWFNV9NXZCN9XQ6XYEFHVGCXXCMYXYMNSERXFQ5FNS";
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";
#[cfg(feature = "rgb")]
const SAMPLE_RGB_INVOICE: &str = "rgb:Cbw1h3zbHgRhA6sxb4FS3Z7GTpdj9MLb7Do88qh5TUH1/RGB20/1+utxob0KPoUVTWL3WqyY6zsJY5giaugWHt5n4hEeWMQymQJmPRFPXL2n";

Expand Down Expand Up @@ -793,6 +831,22 @@ mod tests {
);
}

#[test]
fn parse_cashu_token() {
let parsed = PaymentParams::from_str(SAMPLE_CASHU_TOKEN).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.cashu_token(),
Some(TokenV3::try_from(SAMPLE_CASHU_TOKEN.to_string()).unwrap())
)
}

#[test]
fn parse_nwa() {
let parsed = PaymentParams::from_str(SAMPLE_NWA).unwrap();
Expand Down

0 comments on commit 01b5d57

Please sign in to comment.