1use bitcoin::Amount;
4use lightning::ln::msgs::DecodeError;
5use lightning::util::ser::{Readable, Writeable, Writer};
6use oracle_msgs::OracleInfo;
7
8#[derive(Clone, PartialEq, Debug, Eq)]
9#[cfg_attr(
10 any(test, feature = "use-serde"),
11 derive(serde::Deserialize, serde::Serialize),
12 serde(rename_all = "camelCase")
13)]
14pub struct ContractOutcome {
17 pub outcome: String,
19 pub offer_payout: Amount,
21}
22
23impl_dlc_writeable!(ContractOutcome, {(outcome, string), (offer_payout, writeable)});
24
25#[derive(Clone, Debug, PartialEq)]
26#[cfg_attr(
27 feature = "use-serde",
28 derive(serde::Serialize, serde::Deserialize),
29 serde(rename_all = "camelCase")
30)]
31#[allow(clippy::large_enum_variant)]
33pub enum ContractInfo {
34 SingleContractInfo(SingleContractInfo),
36 DisjointContractInfo(DisjointContractInfo),
38}
39
40impl_dlc_writeable_enum!(ContractInfo,
41 (0, SingleContractInfo), (1, DisjointContractInfo);;;
42);
43
44impl ContractInfo {
45 pub fn get_total_collateral(&self) -> Amount {
47 match self {
48 ContractInfo::SingleContractInfo(v0) => v0.total_collateral,
49 ContractInfo::DisjointContractInfo(v1) => v1.total_collateral,
50 }
51 }
52
53 pub fn get_closest_maturity_date(&self) -> u32 {
56 match self {
57 ContractInfo::SingleContractInfo(s) => {
58 s.contract_info.oracle_info.get_closest_maturity_date()
59 }
60 ContractInfo::DisjointContractInfo(d) => d
61 .contract_infos
62 .iter()
63 .map(|x| x.oracle_info.get_closest_maturity_date())
64 .min()
65 .expect("to have at least one element"),
66 }
67 }
68}
69
70#[derive(Clone, Debug, PartialEq)]
71#[cfg_attr(
72 feature = "use-serde",
73 derive(serde::Serialize, serde::Deserialize),
74 serde(rename_all = "camelCase")
75)]
76pub struct SingleContractInfo {
78 pub total_collateral: Amount,
80 pub contract_info: ContractInfoInner,
82}
83
84impl_dlc_writeable!(SingleContractInfo, { (total_collateral, writeable), (contract_info, writeable) });
85
86#[derive(Clone, Debug, PartialEq)]
87#[cfg_attr(
88 feature = "use-serde",
89 derive(serde::Serialize, serde::Deserialize),
90 serde(rename_all = "camelCase")
91)]
92pub struct DisjointContractInfo {
94 pub total_collateral: Amount,
96 pub contract_infos: Vec<ContractInfoInner>,
98}
99
100impl_dlc_writeable!(DisjointContractInfo, { (total_collateral, writeable), (contract_infos, vec)});
101
102#[derive(Clone, Debug, PartialEq)]
103#[cfg_attr(
104 feature = "use-serde",
105 derive(serde::Serialize, serde::Deserialize),
106 serde(rename_all = "camelCase")
107)]
108pub struct ContractInfoInner {
110 pub contract_descriptor: ContractDescriptor,
112 pub oracle_info: OracleInfo,
114}
115
116impl_dlc_writeable!(ContractInfoInner, { (contract_descriptor, writeable), (oracle_info, writeable) });
117
118#[derive(Clone, Debug, PartialEq)]
119#[cfg_attr(
120 feature = "use-serde",
121 derive(serde::Serialize, serde::Deserialize),
122 serde(rename_all = "camelCase")
123)]
124pub enum ContractDescriptor {
126 EnumeratedContractDescriptor(EnumeratedContractDescriptor),
128 NumericOutcomeContractDescriptor(NumericOutcomeContractDescriptor),
130}
131
132impl_dlc_writeable_enum!(
133 ContractDescriptor, (0, EnumeratedContractDescriptor), (1, NumericOutcomeContractDescriptor);;;
134);
135
136#[derive(Clone, Debug, PartialEq, Eq)]
137#[cfg_attr(
138 feature = "use-serde",
139 derive(serde::Serialize, serde::Deserialize),
140 serde(rename_all = "camelCase")
141)]
142pub struct EnumeratedContractDescriptor {
145 pub payouts: Vec<ContractOutcome>,
147}
148
149impl_dlc_writeable!(EnumeratedContractDescriptor, { (payouts, vec) });
150
151#[derive(Clone, Debug, PartialEq)]
152#[cfg_attr(
153 feature = "use-serde",
154 derive(serde::Serialize, serde::Deserialize),
155 serde(rename_all = "camelCase")
156)]
157pub struct NumericOutcomeContractDescriptor {
160 pub num_digits: u16,
162 pub payout_function: PayoutFunction,
164 pub rounding_intervals: RoundingIntervals,
166}
167
168impl_dlc_writeable!(NumericOutcomeContractDescriptor, { (num_digits, writeable), (payout_function, writeable), (rounding_intervals, writeable) });
169
170#[derive(Clone, Debug, PartialEq)]
171#[cfg_attr(
172 feature = "use-serde",
173 derive(serde::Serialize, serde::Deserialize),
174 serde(rename_all = "camelCase")
175)]
176pub struct PayoutFunction {
178 pub payout_function_pieces: Vec<PayoutFunctionPiece>,
180 pub last_endpoint: PayoutPoint,
182}
183
184impl_dlc_writeable!(PayoutFunction, {(payout_function_pieces, vec), (last_endpoint, writeable)});
185
186#[derive(Clone, Debug, PartialEq)]
187#[cfg_attr(
188 feature = "use-serde",
189 derive(serde::Serialize, serde::Deserialize),
190 serde(rename_all = "camelCase")
191)]
192pub struct PayoutFunctionPiece {
194 pub end_point: PayoutPoint,
196 pub payout_curve_piece: PayoutCurvePiece,
198}
199
200impl_dlc_writeable!(PayoutFunctionPiece, { (end_point, writeable), (payout_curve_piece, writeable) });
201
202#[derive(Clone, Debug, PartialEq)]
203#[cfg_attr(
204 feature = "use-serde",
205 derive(serde::Serialize, serde::Deserialize),
206 serde(rename_all = "camelCase")
207)]
208pub enum PayoutCurvePiece {
210 PolynomialPayoutCurvePiece(PolynomialPayoutCurvePiece),
212 HyperbolaPayoutCurvePiece(HyperbolaPayoutCurvePiece),
214}
215
216impl_dlc_writeable_enum!(PayoutCurvePiece,
217 (0, PolynomialPayoutCurvePiece),
218 (1, HyperbolaPayoutCurvePiece);;;
219);
220
221#[derive(Clone, Debug, PartialEq, Eq)]
222#[cfg_attr(
223 feature = "use-serde",
224 derive(serde::Serialize, serde::Deserialize),
225 serde(rename_all = "camelCase")
226)]
227pub struct PolynomialPayoutCurvePiece {
229 pub payout_points: Vec<PayoutPoint>,
231}
232
233impl_dlc_writeable!(PolynomialPayoutCurvePiece, { (payout_points, vec) });
234
235#[derive(Clone, Debug, PartialEq, Eq)]
236#[cfg_attr(
237 feature = "use-serde",
238 derive(serde::Serialize, serde::Deserialize),
239 serde(rename_all = "camelCase")
240)]
241pub struct PayoutPoint {
243 pub event_outcome: u64,
245 pub outcome_payout: Amount,
247 pub extra_precision: u16,
249}
250
251impl_dlc_writeable!(PayoutPoint, { (event_outcome, writeable), (outcome_payout, writeable), (extra_precision, writeable) });
252
253#[derive(Clone, Debug, PartialEq)]
254#[cfg_attr(
255 feature = "use-serde",
256 derive(serde::Serialize, serde::Deserialize),
257 serde(rename_all = "camelCase")
258)]
259pub struct HyperbolaPayoutCurvePiece {
261 pub use_positive_piece: bool,
264 pub translate_outcome: f64,
266 pub translate_payout: f64,
268 pub a: f64,
270 pub b: f64,
272 pub c: f64,
274 pub d: f64,
276}
277
278impl_dlc_writeable!(HyperbolaPayoutCurvePiece, {
279 (use_positive_piece, writeable),
280 (translate_outcome, float),
281 (translate_payout, float),
282 (a, float),
283 (b, float),
284 (c, float),
285 (d, float)
286});
287
288#[derive(Clone, Debug, PartialEq, Eq)]
289#[cfg_attr(
290 feature = "use-serde",
291 derive(serde::Serialize, serde::Deserialize),
292 serde(rename_all = "camelCase")
293)]
294pub struct RoundingInterval {
297 pub begin_interval: u64,
299 pub rounding_mod: u64,
301}
302
303impl_dlc_writeable!(RoundingInterval, { (begin_interval, writeable), (rounding_mod, writeable) });
304
305#[derive(Clone, Debug, PartialEq, Eq)]
306#[cfg_attr(
307 feature = "use-serde",
308 derive(serde::Serialize, serde::Deserialize),
309 serde(rename_all = "camelCase")
310)]
311pub struct RoundingIntervals {
313 pub intervals: Vec<RoundingInterval>,
315}
316
317impl_dlc_writeable!(RoundingIntervals, { (intervals, vec) });