Skip to main content

fedimint_ln_common/
serde_routing_fees.rs

1// TODO: Upstream serde serialization for
2// lightning_invoice::RoutingFees
3// See https://github.com/lightningdevkit/rust-lightning/blob/b8ed4d2608e32128dd5a1dee92911638a4301138/lightning/src/routing/gossip.rs#L1057-L1065
4use lightning_invoice::RoutingFees;
5use serde::ser::SerializeStruct;
6use serde::{Deserialize, Deserializer, Serializer};
7
8#[allow(missing_docs)]
9pub fn serialize<S>(fees: &RoutingFees, serializer: S) -> Result<S::Ok, S::Error>
10where
11    S: Serializer,
12{
13    let mut state = serializer.serialize_struct("RoutingFees", 2)?;
14    state.serialize_field("base_msat", &fees.base_msat)?;
15    state.serialize_field("proportional_millionths", &fees.proportional_millionths)?;
16    state.end()
17}
18
19#[allow(missing_docs)]
20pub fn deserialize<'de, D>(deserializer: D) -> Result<RoutingFees, D::Error>
21where
22    D: Deserializer<'de>,
23{
24    let fees = serde_json::Value::deserialize(deserializer)?;
25    // While we deserialize fields as u64, RoutingFees expects u32 for the fields
26    let base_msat = fees["base_msat"]
27        .as_u64()
28        .ok_or_else(|| serde::de::Error::custom("base_msat is not a u64"))?;
29    let proportional_millionths = fees["proportional_millionths"]
30        .as_u64()
31        .ok_or_else(|| serde::de::Error::custom("proportional_millionths is not a u64"))?;
32
33    Ok(RoutingFees {
34        base_msat: base_msat
35            .try_into()
36            .map_err(|_| serde::de::Error::custom("base_msat is greater than u32::MAX"))?,
37        proportional_millionths: proportional_millionths.try_into().map_err(|_| {
38            serde::de::Error::custom("proportional_millionths is greater than u32::MAX")
39        })?,
40    })
41}