hal/
miniscript.rs

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, // in bare script pubkey
15	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	// Taproot to come
63}
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}