dlc_manager/contract/
ser.rs

1//! Serialization trait implementations for various data structures enabling them
2//! to be converted to byte arrays.
3
4use crate::contract::accepted_contract::AcceptedContract;
5use crate::contract::contract_info::ContractInfo;
6use crate::contract::enum_descriptor::EnumDescriptor;
7use crate::contract::numerical_descriptor::{DifferenceParams, NumericalDescriptor};
8use crate::contract::offered_contract::OfferedContract;
9use crate::contract::signed_contract::SignedContract;
10use crate::contract::AdaptorInfo;
11use crate::contract::{
12    ClosedContract, ContractDescriptor, FailedAcceptContract, FailedSignContract, PreClosedContract,
13};
14use crate::payout_curve::{
15    HyperbolaPayoutCurvePiece, PayoutFunction, PayoutFunctionPiece, PayoutPoint,
16    PolynomialPayoutCurvePiece, RoundingInterval, RoundingIntervals,
17};
18use dlc::DlcTransactions;
19use dlc_messages::ser_impls::{
20    read_ecdsa_adaptor_signatures, read_option_cb, read_usize, read_vec, read_vec_cb,
21    write_ecdsa_adaptor_signatures, write_option_cb, write_usize, write_vec, write_vec_cb,
22};
23use dlc_trie::digit_trie::{DigitNodeData, DigitTrieDump};
24use dlc_trie::multi_oracle_trie::{MultiOracleTrie, MultiOracleTrieDump};
25use dlc_trie::multi_oracle_trie_with_diff::{MultiOracleTrieWithDiff, MultiOracleTrieWithDiffDump};
26use dlc_trie::multi_trie::{MultiTrieDump, MultiTrieNodeData, TrieNodeInfo};
27use dlc_trie::{OracleNumericInfo, RangeInfo};
28use lightning::io::Read;
29use lightning::ln::msgs::DecodeError;
30use lightning::util::ser::{Readable, Writeable, Writer};
31
32/// Trait used to de/serialize an object to/from a vector of bytes.
33pub trait Serializable
34where
35    Self: Sized,
36{
37    /// Serialize the object.
38    fn serialize(&self) -> Result<Vec<u8>, lightning::io::Error>;
39    /// Deserialize the object.
40    fn deserialize<R: Read>(reader: &mut R) -> Result<Self, DecodeError>;
41}
42
43impl<T> Serializable for T
44where
45    T: Writeable + Readable,
46{
47    fn serialize(&self) -> Result<Vec<u8>, lightning::io::Error> {
48        let mut buffer = Vec::new();
49        self.write(&mut buffer)?;
50        Ok(buffer)
51    }
52
53    fn deserialize<R: Read>(reader: &mut R) -> Result<Self, DecodeError> {
54        Readable::read(reader)
55    }
56}
57
58impl_dlc_writeable!(PayoutPoint, { (event_outcome, writeable), (outcome_payout, writeable), (extra_precision, writeable) });
59impl_dlc_writeable_enum!(
60    PayoutFunctionPiece,
61    (0, PolynomialPayoutCurvePiece),
62    (1, HyperbolaPayoutCurvePiece);;;
63);
64impl_dlc_writeable!(RoundingInterval, { (begin_interval, writeable), (rounding_mod, writeable) });
65impl_dlc_writeable!(PayoutFunction, { (payout_function_pieces, vec) });
66impl_dlc_writeable!(NumericalDescriptor, { (payout_function, writeable), (rounding_intervals, writeable), (difference_params, option), (oracle_numeric_infos, {cb_writeable, oracle_params::write, oracle_params::read}) });
67impl_dlc_writeable!(PolynomialPayoutCurvePiece, { (payout_points, vec) });
68impl_dlc_writeable!(RoundingIntervals, { (intervals, vec) });
69impl_dlc_writeable!(DifferenceParams, { (max_error_exp, usize), (min_support_exp, usize), (maximize_coverage, writeable) });
70impl_dlc_writeable!(HyperbolaPayoutCurvePiece, {
71    (left_end_point, writeable),
72    (right_end_point, writeable),
73    (use_positive_piece, writeable),
74    (translate_outcome, float),
75    (translate_payout, float),
76    (a, float),
77    (b, float),
78    (c, float),
79    (d, float)
80});
81impl_dlc_writeable_enum!(ContractDescriptor, (0, Enum), (1, Numerical);;;);
82impl_dlc_writeable!(ContractInfo, { (contract_descriptor, writeable), (oracle_announcements, vec), (threshold, usize)});
83impl_dlc_writeable!(EnumDescriptor, {
84    (
85        outcome_payouts,
86        {vec_cb, dlc_messages::ser_impls::enum_payout::write, dlc_messages::ser_impls::enum_payout::read}
87    )
88});
89impl_dlc_writeable!(OfferedContract, {
90    (id, writeable),
91    (is_offer_party, writeable),
92    (contract_info, vec),
93    (offer_params, { cb_writeable, dlc_messages::ser_impls::party_params::write, dlc_messages::ser_impls::party_params::read }),
94    (total_collateral, writeable),
95    (funding_inputs, vec),
96    (fund_output_serial_id, writeable),
97    (fee_rate_per_vb, writeable),
98    (cet_locktime, writeable),
99    (refund_locktime, writeable),
100    (counter_party, writeable),
101    (keys_id, writeable)
102});
103impl_dlc_writeable_external!(RangeInfo, range_info, { (cet_index, usize), (adaptor_index, usize)});
104impl_dlc_writeable_enum!(AdaptorInfo,;; (0, Numerical, write_multi_oracle_trie, read_multi_oracle_trie), (1, NumericalWithDifference, write_multi_oracle_trie_with_diff, read_multi_oracle_trie_with_diff); (2, Enum));
105impl_dlc_writeable_external!(
106    DlcTransactions, dlc_transactions,
107    { (fund, writeable),
108    (cets, vec),
109    (refund, writeable),
110    (funding_script_pubkey, writeable) }
111);
112impl_dlc_writeable!(AcceptedContract, {
113    (offered_contract, writeable),
114    (accept_params, { cb_writeable, dlc_messages::ser_impls::party_params::write, dlc_messages::ser_impls::party_params::read }),
115    (funding_inputs, vec),
116    (adaptor_infos, vec),
117    (adaptor_signatures, {option_cb, write_ecdsa_adaptor_signatures, read_ecdsa_adaptor_signatures }),
118    (accept_refund_signature, writeable),
119    (dlc_transactions, {cb_writeable, dlc_transactions::write, dlc_transactions::read })
120});
121impl_dlc_writeable!(SignedContract, {
122    (accepted_contract, writeable),
123    (adaptor_signatures, {option_cb, write_ecdsa_adaptor_signatures, read_ecdsa_adaptor_signatures }),
124    (offer_refund_signature, writeable),
125    (funding_signatures, writeable),
126    (channel_id, option)
127});
128impl_dlc_writeable!(PreClosedContract, {
129    (signed_contract, writeable),
130    (attestations, {option_cb, write_vec, read_vec}),
131    (signed_cet, writeable)
132});
133impl_dlc_writeable!(ClosedContract, {
134    (attestations, {option_cb, write_vec, read_vec}),
135    (signed_cet, writeable),
136    (contract_id, writeable),
137    (temporary_contract_id, writeable),
138    (counter_party_id, writeable),
139    (pnl, SignedAmount)
140});
141impl_dlc_writeable!(FailedAcceptContract, {(offered_contract, writeable), (accept_message, writeable), (error_message, string)});
142impl_dlc_writeable!(FailedSignContract, {(accepted_contract, writeable), (sign_message, writeable), (error_message, string)});
143
144impl_dlc_writeable_external!(DigitTrieDump<Vec<RangeInfo> >, digit_trie_dump_vec_range, { (node_data, {vec_cb, write_digit_node_data_vec_range, read_digit_node_data_vec_range}), (root, {option_cb, write_usize, read_usize}), (base, usize)});
145impl_dlc_writeable_external!(DigitTrieDump<RangeInfo>, digit_trie_dump_range, { (node_data, {vec_cb, write_digit_node_data_range, read_digit_node_data_range}), (root, {option_cb, write_usize, read_usize}), (base, usize)});
146impl_dlc_writeable_external!(DigitTrieDump<Vec<TrieNodeInfo> >, digit_trie_dump_trie, { (node_data, {vec_cb, write_digit_node_data_trie, read_digit_node_data_trie}), (root, {option_cb, write_usize, read_usize}), (base, usize)});
147impl_dlc_writeable_external!(MultiOracleTrieDump, multi_oracle_trie_dump, { (digit_trie_dump, {cb_writeable, digit_trie_dump_vec_range::write, digit_trie_dump_vec_range::read}), (threshold, usize), (oracle_numeric_infos, {cb_writeable, oracle_params::write, oracle_params::read}), (extra_cover_trie_dump, {option_cb, multi_trie_dump::write, multi_trie_dump::read}) });
148impl_dlc_writeable_external!(OracleNumericInfo, oracle_params, { (base, usize), (nb_digits, {vec_cb, write_usize, read_usize}) });
149impl_dlc_writeable_external_enum!(
150    MultiTrieNodeData<RangeInfo>,
151    multi_trie_node_data,
152    (0, Leaf, digit_trie_dump_range),
153    (1, Node, digit_trie_dump_trie)
154);
155impl_dlc_writeable_external!(MultiTrieDump<RangeInfo>, multi_trie_dump, { (node_data, {vec_cb, multi_trie_node_data::write, multi_trie_node_data::read}), (nb_tries, usize), (nb_required, usize), (min_support_exp, usize), (max_error_exp, usize), (maximize_coverage, writeable), (oracle_numeric_infos, {cb_writeable, oracle_params::write, oracle_params::read}) });
156impl_dlc_writeable_external!(MultiOracleTrieWithDiffDump, multi_oracle_trie_with_diff_dump, { (multi_trie_dump, {cb_writeable, multi_trie_dump::write, multi_trie_dump::read}), (oracle_numeric_infos, {cb_writeable, oracle_params::write, oracle_params::read}) });
157impl_dlc_writeable_external!(TrieNodeInfo, trie_node_info, { (trie_index, usize), (store_index, usize) });
158
159fn write_digit_node_data_trie<W: Writer>(
160    input: &DigitNodeData<Vec<TrieNodeInfo>>,
161    writer: &mut W,
162) -> Result<(), lightning::io::Error> {
163    let cb = |x: &Vec<TrieNodeInfo>, writer: &mut W| -> Result<(), lightning::io::Error> {
164        write_vec_cb(x, writer, &trie_node_info::write)
165    };
166    write_digit_node_data(input, writer, &cb)
167}
168
169fn read_digit_node_data_trie<R: Read>(
170    reader: &mut R,
171) -> Result<DigitNodeData<Vec<TrieNodeInfo>>, DecodeError> {
172    let cb = |reader: &mut R| -> Result<Vec<TrieNodeInfo>, DecodeError> {
173        read_vec_cb(reader, &trie_node_info::read)
174    };
175    read_digit_node_data(reader, &cb)
176}
177
178fn write_digit_node_data_range<W: Writer>(
179    input: &DigitNodeData<RangeInfo>,
180    writer: &mut W,
181) -> Result<(), lightning::io::Error> {
182    write_digit_node_data(input, writer, &range_info::write)
183}
184
185fn read_digit_node_data_range<R: Read>(
186    reader: &mut R,
187) -> Result<DigitNodeData<RangeInfo>, DecodeError> {
188    read_digit_node_data(reader, &range_info::read)
189}
190
191fn write_digit_node_data_vec_range<W: Writer>(
192    input: &DigitNodeData<Vec<RangeInfo>>,
193    writer: &mut W,
194) -> Result<(), lightning::io::Error> {
195    let cb = |x: &Vec<RangeInfo>, writer: &mut W| -> Result<(), lightning::io::Error> {
196        write_vec_cb(x, writer, &range_info::write)
197    };
198    write_digit_node_data(input, writer, &cb)
199}
200
201fn read_digit_node_data_vec_range<R: Read>(
202    reader: &mut R,
203) -> Result<DigitNodeData<Vec<RangeInfo>>, DecodeError> {
204    let cb = |reader: &mut R| -> Result<Vec<RangeInfo>, DecodeError> {
205        read_vec_cb(reader, &range_info::read)
206    };
207    read_digit_node_data(reader, &cb)
208}
209
210fn write_digit_node_data<W: Writer, T, F>(
211    input: &DigitNodeData<T>,
212    writer: &mut W,
213    cb: &F,
214) -> Result<(), lightning::io::Error>
215where
216    F: Fn(&T, &mut W) -> Result<(), lightning::io::Error>,
217{
218    write_option_cb(&input.data, writer, &cb)?;
219    write_vec_cb(&input.prefix, writer, &write_usize)?;
220    let cb = |x: &Vec<Option<usize>>, writer: &mut W| -> Result<(), lightning::io::Error> {
221        let cb = |y: &Option<usize>, writer: &mut W| -> Result<(), lightning::io::Error> {
222            write_option_cb(y, writer, &write_usize)
223        };
224        write_vec_cb(x, writer, &cb)
225    };
226    write_option_cb(&input.children, writer, &cb)
227}
228
229fn read_digit_node_data<R: Read, T, F>(
230    reader: &mut R,
231    cb: &F,
232) -> Result<DigitNodeData<T>, DecodeError>
233where
234    F: Fn(&mut R) -> Result<T, DecodeError>,
235{
236    let cb1 = |reader: &mut R| -> Result<T, DecodeError> { cb(reader) };
237    let cb = |reader: &mut R| -> Result<Vec<Option<usize>>, DecodeError> {
238        let cb = |reader: &mut R| -> Result<Option<usize>, DecodeError> {
239            read_option_cb(reader, &read_usize)
240        };
241        read_vec_cb(reader, &cb)
242    };
243
244    Ok(DigitNodeData {
245        data: read_option_cb(reader, &cb1)?,
246        prefix: read_vec_cb(reader, &read_usize)?,
247        children: read_option_cb(reader, &cb)?,
248    })
249}
250
251fn write_multi_oracle_trie<W: Writer>(
252    trie: &MultiOracleTrie,
253    w: &mut W,
254) -> Result<(), lightning::io::Error> {
255    multi_oracle_trie_dump::write(&trie.dump(), w)
256}
257
258fn read_multi_oracle_trie<R: Read>(reader: &mut R) -> Result<MultiOracleTrie, DecodeError> {
259    let dump = multi_oracle_trie_dump::read(reader)?;
260    Ok(MultiOracleTrie::from_dump(dump))
261}
262
263fn write_multi_oracle_trie_with_diff<W: Writer>(
264    trie: &MultiOracleTrieWithDiff,
265    w: &mut W,
266) -> Result<(), lightning::io::Error> {
267    multi_oracle_trie_with_diff_dump::write(&trie.dump(), w)
268}
269
270fn read_multi_oracle_trie_with_diff<R: Read>(
271    reader: &mut R,
272) -> Result<MultiOracleTrieWithDiff, DecodeError> {
273    let dump = multi_oracle_trie_with_diff_dump::read(reader)?;
274    Ok(MultiOracleTrieWithDiff::from_dump(dump))
275}