1use crate::prelude::*;
7
8use alloc::borrow::Cow;
9use core::fmt;
10use core::fmt::Formatter;
11use core::time::Duration;
12use lightning::ln::channel_keys::{DelayedPaymentBasepoint, HtlcBasepoint, RevocationBasepoint};
13use vls_common::HexEncode;
14
15use bitcoin::hashes::Hash;
16use bitcoin::secp256k1::PublicKey;
17use bitcoin::{OutPoint, Script, ScriptBuf, Txid};
18use lightning::ln::chan_utils::ChannelPublicKeys;
19use lightning::util::ser::Writer;
20use serde::de::SeqAccess;
21use serde::ser::SerializeSeq;
22use serde::{Deserialize, Deserializer, Serialize, Serializer};
23use serde_with::serde_as;
24use serde_with::{DeserializeAs, SerializeAs};
25
26use crate::channel::ChannelId;
27use crate::io;
28
29#[derive(Copy, Clone, Debug, Default)]
30pub struct PublicKeyHandler;
31
32impl SerializeAs<PublicKey> for PublicKeyHandler {
33 fn serialize_as<S>(source: &PublicKey, serializer: S) -> Result<S::Ok, S::Error>
34 where
35 S: Serializer,
36 {
37 serializer.serialize_str(hex::encode(source.serialize().to_vec()).as_str())
38 }
39}
40
41impl<'de> DeserializeAs<'de, PublicKey> for PublicKeyHandler {
42 fn deserialize_as<D>(deserializer: D) -> Result<PublicKey, D::Error>
43 where
44 D: Deserializer<'de>,
45 {
46 let res = <Cow<'de, str> as Deserialize<'de>>::deserialize(deserializer)?;
47 let key = PublicKey::from_slice(hex::decode(&*res).unwrap().as_slice()).unwrap();
48 Ok(key)
49 }
50}
51
52#[derive(Copy, Clone, Debug, Default)]
53pub struct RevocationBasepointHandler;
54
55impl SerializeAs<RevocationBasepoint> for RevocationBasepointHandler {
56 fn serialize_as<S>(source: &RevocationBasepoint, serializer: S) -> Result<S::Ok, S::Error>
57 where
58 S: Serializer,
59 {
60 serde::Serialize::serialize(&source.0, serializer)
61 }
62}
63
64impl<'de> DeserializeAs<'de, RevocationBasepoint> for RevocationBasepointHandler {
65 fn deserialize_as<D>(deserializer: D) -> Result<RevocationBasepoint, D::Error>
66 where
67 D: Deserializer<'de>,
68 {
69 let key = PublicKey::deserialize(deserializer)?;
70 Ok(key.into())
71 }
72}
73
74#[derive(Copy, Clone, Debug, Default)]
75pub struct DelayedPaymentBasepointHandler;
76
77impl SerializeAs<DelayedPaymentBasepoint> for DelayedPaymentBasepointHandler {
78 fn serialize_as<S>(source: &DelayedPaymentBasepoint, serializer: S) -> Result<S::Ok, S::Error>
79 where
80 S: Serializer,
81 {
82 serde::Serialize::serialize(&source.0, serializer)
83 }
84}
85
86impl<'de> DeserializeAs<'de, DelayedPaymentBasepoint> for DelayedPaymentBasepointHandler {
87 fn deserialize_as<D>(deserializer: D) -> Result<DelayedPaymentBasepoint, D::Error>
88 where
89 D: Deserializer<'de>,
90 {
91 let key = PublicKey::deserialize(deserializer)?;
92 Ok(key.into())
93 }
94}
95
96#[derive(Copy, Clone, Debug, Default)]
97pub struct HtlcBasepointHandler;
98
99impl SerializeAs<HtlcBasepoint> for HtlcBasepointHandler {
100 fn serialize_as<S>(source: &HtlcBasepoint, serializer: S) -> Result<S::Ok, S::Error>
101 where
102 S: Serializer,
103 {
104 serde::Serialize::serialize(&source.0, serializer)
105 }
106}
107
108impl<'de> DeserializeAs<'de, HtlcBasepoint> for HtlcBasepointHandler {
109 fn deserialize_as<D>(deserializer: D) -> Result<HtlcBasepoint, D::Error>
110 where
111 D: Deserializer<'de>,
112 {
113 let key = PublicKey::deserialize(deserializer)?;
114 Ok(key.into())
115 }
116}
117
118pub struct ChannelIdHandler;
119
120impl SerializeAs<ChannelId> for ChannelIdHandler {
121 fn serialize_as<S>(source: &ChannelId, serializer: S) -> Result<S::Ok, S::Error>
122 where
123 S: Serializer,
124 {
125 serializer.serialize_str(hex::encode(source.as_slice()).as_str())
126 }
127}
128
129impl<'de> DeserializeAs<'de, ChannelId> for ChannelIdHandler {
130 fn deserialize_as<D>(deserializer: D) -> Result<ChannelId, D::Error>
131 where
132 D: Deserializer<'de>,
133 {
134 let res = <Cow<'de, str> as Deserialize<'de>>::deserialize(deserializer).unwrap();
135 let key = ChannelId::new(&hex::decode(&*res).unwrap());
136 Ok(key)
137 }
138}
139
140#[serde_as]
141#[derive(Serialize, Deserialize)]
142#[serde(remote = "ChannelPublicKeys")]
143pub struct ChannelPublicKeysDef {
144 pub funding_pubkey: PublicKey,
145 #[serde_as(as = "RevocationBasepointHandler")]
146 pub revocation_basepoint: RevocationBasepoint,
147 pub payment_point: PublicKey,
148 #[serde_as(as = "DelayedPaymentBasepointHandler")]
149 pub delayed_payment_basepoint: DelayedPaymentBasepoint,
150 #[serde_as(as = "HtlcBasepointHandler")]
151 pub htlc_basepoint: HtlcBasepoint,
152}
153
154#[derive(Deserialize)]
155struct ChannelPublicKeysHelper(#[serde(with = "ChannelPublicKeysDef")] ChannelPublicKeys);
156
157impl SerializeAs<ChannelPublicKeys> for ChannelPublicKeysDef {
158 fn serialize_as<S>(value: &ChannelPublicKeys, serializer: S) -> Result<S::Ok, S::Error>
159 where
160 S: Serializer,
161 {
162 ChannelPublicKeysDef::serialize(value, serializer)
163 }
164}
165
166impl<'de> DeserializeAs<'de, ChannelPublicKeys> for ChannelPublicKeysDef {
167 fn deserialize_as<D>(
168 deserializer: D,
169 ) -> Result<ChannelPublicKeys, <D as Deserializer<'de>>::Error>
170 where
171 D: Deserializer<'de>,
172 {
173 ChannelPublicKeysHelper::deserialize(deserializer).map(|h| h.0)
174 }
175}
176
177pub struct VecWriter(pub Vec<u8>);
178impl Writer for VecWriter {
179 fn write_all(&mut self, buf: &[u8]) -> Result<(), io::Error> {
180 self.0.extend_from_slice(buf);
181 Ok(())
182 }
183}
184
185pub struct TxIdReversedDef;
192
193impl SerializeAs<Txid> for TxIdReversedDef {
194 fn serialize_as<S>(value: &Txid, serializer: S) -> Result<S::Ok, S::Error>
195 where
196 S: Serializer,
197 {
198 serializer.serialize_str(value.as_byte_array().to_hex().as_str())
199 }
200}
201
202impl<'de> DeserializeAs<'de, Txid> for TxIdReversedDef {
203 fn deserialize_as<D>(deserializer: D) -> Result<Txid, <D as Deserializer<'de>>::Error>
204 where
205 D: Deserializer<'de>,
206 {
207 let res = <Cow<'de, str> as Deserialize<'de>>::deserialize(deserializer).unwrap();
208 let txid = Txid::from_slice(hex::decode(&*res).unwrap().as_slice()).unwrap();
209 Ok(txid)
210 }
211}
212
213#[serde_as]
221#[derive(Serialize, Deserialize)]
222#[serde(remote = "OutPoint")]
223pub struct OutPointReversedDef {
224 #[serde_as(as = "TxIdReversedDef")]
225 pub txid: Txid,
226 pub vout: u32,
227}
228
229#[derive(Deserialize)]
230struct OutPointHelper(#[serde(with = "OutPointReversedDef")] OutPoint);
231
232impl SerializeAs<OutPoint> for OutPointReversedDef {
233 fn serialize_as<S>(value: &OutPoint, serializer: S) -> Result<S::Ok, S::Error>
234 where
235 S: Serializer,
236 {
237 OutPointReversedDef::serialize(value, serializer)
238 }
239}
240
241impl<'de> DeserializeAs<'de, OutPoint> for OutPointReversedDef {
242 fn deserialize_as<D>(deserializer: D) -> Result<OutPoint, <D as Deserializer<'de>>::Error>
243 where
244 D: Deserializer<'de>,
245 {
246 OutPointHelper::deserialize(deserializer).map(|h| h.0)
247 }
248}
249
250#[derive(Serialize, Deserialize)]
251#[serde(remote = "ScriptBuf")]
252pub struct ScriptDef(#[serde(getter = "Script::to_bytes")] Vec<u8>);
253
254impl From<ScriptDef> for ScriptBuf {
255 fn from(s: ScriptDef) -> Self {
256 ScriptBuf::from(s.0)
257 }
258}
259
260#[derive(Deserialize)]
261struct ScriptHelper(#[serde(with = "ScriptDef")] ScriptBuf);
262
263impl SerializeAs<ScriptBuf> for ScriptDef {
264 fn serialize_as<S>(value: &ScriptBuf, serializer: S) -> Result<S::Ok, S::Error>
265 where
266 S: Serializer,
267 {
268 ScriptDef::serialize(value, serializer)
269 }
270}
271
272impl<'de> DeserializeAs<'de, ScriptBuf> for ScriptDef {
273 fn deserialize_as<D>(deserializer: D) -> Result<ScriptBuf, <D as Deserializer<'de>>::Error>
274 where
275 D: Deserializer<'de>,
276 {
277 ScriptHelper::deserialize(deserializer).map(|h| h.0)
278 }
279}
280
281#[derive(Copy, Clone, Debug, Default)]
282pub struct DurationHandler;
283
284impl SerializeAs<Duration> for DurationHandler {
285 fn serialize_as<S>(value: &Duration, serializer: S) -> Result<S::Ok, S::Error>
286 where
287 S: Serializer,
288 {
289 let mut seq = serializer.serialize_seq(Some(2))?;
290 seq.serialize_element(&value.as_secs())?;
291 seq.serialize_element(&value.subsec_nanos())?;
292 seq.end()
293 }
294}
295
296struct DurationVisitor;
297
298impl<'de> serde::de::Visitor<'de> for DurationVisitor {
299 type Value = Duration;
300
301 fn expecting(&self, fmt: &mut Formatter) -> fmt::Result {
302 fmt.write_str("tuple")
303 }
304
305 fn visit_seq<V>(self, mut seq: V) -> Result<Duration, V::Error>
306 where
307 V: SeqAccess<'de>,
308 {
309 let secs = seq.next_element()?.ok_or_else(|| serde::de::Error::invalid_length(0, &self))?;
310 let nanos =
311 seq.next_element()?.ok_or_else(|| serde::de::Error::invalid_length(1, &self))?;
312 Ok(Duration::new(secs, nanos))
313 }
314}
315
316impl<'de> DeserializeAs<'de, Duration> for DurationHandler {
317 fn deserialize_as<D>(deserializer: D) -> Result<Duration, <D as Deserializer<'de>>::Error>
318 where
319 D: Deserializer<'de>,
320 {
321 deserializer.deserialize_seq(DurationVisitor)
322 }
323}