diff --git a/src/lightning/payments/bolt12.rs b/src/lightning/payments/bolt12.rs index 8b13789..47034d1 100644 --- a/src/lightning/payments/bolt12.rs +++ b/src/lightning/payments/bolt12.rs @@ -1 +1,48 @@ +use std::collections::HashMap; +use ldk::lightning::Lightning_invoice; +use ldk::lightning::Lightning_invoice::*; +use ldk::bitcoin::secp256k1_zkp::PublicKey; +use ldk::bitcoin::secp256k1_zkp::Signature; +use ldk::bitcoin::secp256k1_zkp::SignatureHash; +use ldk::bitcoin::secp256k1_zkp::Message; +use ldk::lightning::BOLT12; +use ldk_node::BOLT12_PREFIX; +use ldk_node::BOLT12_SEPARATOR; +pub fn invoice_to_bolt12(invoice: &Lightning_invoice) -> String { + let mut bolt12 = BOLT12_PREFIX.to_string(); + bolt12.push_str(&invoice.payment_hash.to_hex()); + bolt12.push_str(BOLT12_SEPARATOR); + bolt12.push_str(&invoice.description); + bolt12.push_str(BOLT12_SEPARATOR); + bolt12.push_str(&invoice.expiry_time.to_string()); + bolt12.push_str(BOLT12_SEPARATOR); + bolt12.push_str(&invoice.cltv_expiry.to_string()); + bolt12.push_str(BOLT12_SEPARATOR); + bolt12.push_str(&invoice.payment_secret.to_hex()); + bolt12.push_str(BOLT12_SEPARATOR); + bolt12.push_str(&invoice.features.to_hex()); + +impl bolt12_to_invoice(bolt12: &str) -> Result { + let mut split = bolt12.split(BOLT12_SEPARATOR); + let mut invoice = Lightning_invoice::new(); + invoice.payment_hash = split.next().ok_or("Invalid bolt12 string + (missing payment_hash)")?.from_hex().map_err(|_| "Invalid bolt12 string + (invalid payment_hash)")?; + invoice.description = split.next().ok_or("Invalid bolt12 string + (missing description)")?.to_string(); + invoice.expiry_time = split.next().ok_or("Invalid bolt12 string + (missing expiry_time)")?.parse::().map_err(|_| "Invalid bolt12 string + (invalid expiry_time)")?; + invoice.cltv_expiry = split.next().ok_or("Invalid bolt12 string + (missing cltv_expiry)")?.parse::().map_err(|_| "Invalid bolt12 string + (invalid cltv_expiry)")?; + invoice.payment_secret = split.next().ok_or("Invalid bolt12 string + (missing payment_secret)")?.from_hex().map_err(|_| "Invalid bolt12 string + (invalid payment_secret)")?; + invoice.features = split.next().ok_or("Invalid bolt12 string + (missing features)")?.from_hex().map_err(|_| "Invalid bolt12 string + (invalid features)")?; + Ok(invoice) + } +}