agent-pay 0.1.0

L402 + DID-signed invoices: agent-to-agent Lightning payments (Rust port of @p-vbordei/agent-pay)
Documentation
//! BOLT11 parsing wrapper (uses the `lightning-invoice` crate).

use std::time::{SystemTime, UNIX_EPOCH};

use chrono::{DateTime, Utc};
use lightning_invoice::Bolt11Invoice;

use crate::error::Error;

#[derive(Debug, Clone)]
pub struct ParsedInvoice {
    pub payment_hash: String,
    pub amount_msat: u64,
    pub expiry_at: Option<DateTime<Utc>>,
}

pub fn parse_invoice(input: &str) -> Result<ParsedInvoice, Error> {
    let inv: Bolt11Invoice = input.parse().map_err(|e| Error::Bolt11(format!("{e:?}")))?;
    let payment_hash = hex::encode(inv.payment_hash());
    let amount_msat = inv.amount_milli_satoshis().unwrap_or(0);
    let expiry_at = inv.expires_at().and_then(|d| {
        let secs = d.as_secs();
        SystemTime::UNIX_EPOCH
            .checked_add(std::time::Duration::from_secs(secs))
            .and_then(|st| {
                let dur = st.duration_since(UNIX_EPOCH).unwrap_or_default();
                DateTime::<Utc>::from_timestamp(dur.as_secs() as i64, 0)
            })
    });
    Ok(ParsedInvoice {
        payment_hash,
        amount_msat,
        expiry_at,
    })
}