1use serde::{Deserialize, Serialize};
2
3use crate::HexBytes;
4
5#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
6#[serde(rename_all = "snake_case")]
7pub enum MiniscriptKeyType {
8 PublicKey,
9 String,
10}
11
12#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
13pub struct ScriptContexts {
14 pub bare: bool, pub p2sh: bool,
16 pub segwitv0: bool,
17}
18
19impl ScriptContexts {
20
21 pub fn from_bare(bare: bool) -> Self {
22 Self {
23 bare: bare,
24 p2sh: false,
25 segwitv0: false,
26 }
27 }
28
29 pub fn from_p2sh(p2sh: bool) -> Self {
30 Self {
31 bare: false,
32 p2sh: p2sh,
33 segwitv0: false,
34 }
35 }
36
37 pub fn from_segwitv0(segwitv0: bool) -> Self {
38 Self {
39 bare: false,
40 p2sh: false,
41 segwitv0: segwitv0,
42 }
43 }
44
45 pub fn or(a: Self, b: Self) -> Self {
46 Self {
47 bare: a.bare || b.bare,
48 p2sh: a.p2sh || b.p2sh,
49 segwitv0: a.segwitv0 || b.segwitv0,
50 }
51 }
52}
53
54#[derive(Clone, PartialEq, Eq, Debug, Default, Deserialize, Serialize)]
55pub struct Miniscripts {
56 #[serde(skip_serializing_if = "Option::is_none")]
57 pub bare: Option<String>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 pub p2sh: Option<String>,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub segwitv0: Option<String>,
62 }
64
65#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
66pub struct DescriptorInfo {
67 pub descriptor: String,
68 pub key_type: MiniscriptKeyType,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub address: Option<String>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub script_pubkey: Option<HexBytes>,
73 #[serde(skip_serializing_if = "Option::is_none")]
74 pub unsigned_script_sig: Option<HexBytes>,
75 #[serde(skip_serializing_if = "Option::is_none")]
76 pub witness_script: Option<HexBytes>,
77 #[serde(skip_serializing_if = "Option::is_none")]
78 pub max_satisfaction_weight: Option<u64>,
79 #[serde(skip_serializing_if = "Option::is_none")]
80 pub policy: Option<String>,
81}
82
83#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
84pub struct MiniscriptInfo {
85 pub key_type: MiniscriptKeyType,
86 pub valid_script_contexts: ScriptContexts,
87 pub requires_sig: bool,
88 pub has_mixed_timelocks: bool,
89 pub has_repeated_keys: bool,
90 pub non_malleable: ScriptContexts,
91 pub within_resource_limits: ScriptContexts,
92 pub sane_miniscript: ScriptContexts,
93 pub script_size: usize,
94 #[serde(skip_serializing_if = "Option::is_none")]
95 pub max_satisfaction_witness_elements: Option<usize>,
96 #[serde(skip_serializing_if = "Option::is_none")]
97 pub max_satisfaction_size_segwit: Option<usize>,
98 #[serde(skip_serializing_if = "Option::is_none")]
99 pub max_satisfaction_size_non_segwit: Option<usize>,
100 #[serde(skip_serializing_if = "Option::is_none")]
101 pub script: Option<HexBytes>,
102 #[serde(skip_serializing_if = "Option::is_none")]
103 pub policy: Option<String>,
104}
105
106#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
107pub struct PolicyInfo {
108 pub is_concrete: bool,
109 pub key_type: MiniscriptKeyType,
110 pub is_trivial: bool,
111 pub is_unsatisfiable: bool,
112 pub relative_timelocks: Vec<u32>,
113 pub n_keys: usize,
114 pub minimum_n_keys: usize,
115 pub sorted: String,
116 pub normalized: String,
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub miniscript: Option<Miniscripts>,
119}