hal_elements/
confidential.rs

1use elements::confidential::{Asset, Nonce, Value};
2use elements::AssetId;
3use serde::{Deserialize, Serialize};
4
5use ::{GetInfo, Network, HexBytes};
6
7#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
8#[serde(rename_all = "lowercase")]
9pub enum ConfidentialType {
10	Null,
11	Explicit,
12	Confidential,
13}
14
15#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
16pub struct ConfidentialValueInfo {
17	#[serde(rename = "type")]
18	pub type_: ConfidentialType,
19	#[serde(skip_serializing_if = "Option::is_none")]
20	pub value: Option<u64>,
21	#[serde(skip_serializing_if = "Option::is_none")]
22	pub commitment: Option<HexBytes>,
23}
24
25impl GetInfo<ConfidentialValueInfo> for Value {
26	fn get_info(&self, _network: Network) -> ConfidentialValueInfo {
27		ConfidentialValueInfo {
28			type_: match self {
29				Value::Null => ConfidentialType::Null,
30				Value::Explicit(..) => ConfidentialType::Explicit,
31				Value::Confidential(..) => ConfidentialType::Confidential,
32			},
33			value: match self {
34				Value::Explicit(v) => Some(*v),
35				_ => None,
36			},
37			commitment: match self {
38				Value::Confidential(pk) => Some(pk.serialize()[..].into()),
39				_ => None,
40			},
41		}
42	}
43}
44
45#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
46#[serde(rename_all = "snake_case")]
47pub enum ConfidentialAssetLabel {
48	LiquidBitcoin,
49}
50
51impl ConfidentialAssetLabel {
52	pub fn from_asset_id(id: AssetId) -> Option<ConfidentialAssetLabel> {
53		match id.to_string().as_str() {
54			"6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d" => {
55				Some(ConfidentialAssetLabel::LiquidBitcoin)
56			}
57			_ => None,
58		}
59	}
60}
61
62#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
63pub struct ConfidentialAssetInfo {
64	#[serde(rename = "type")]
65	pub type_: ConfidentialType,
66	#[serde(skip_serializing_if = "Option::is_none")]
67	pub asset: Option<AssetId>,
68	#[serde(skip_serializing_if = "Option::is_none")]
69	pub commitment: Option<HexBytes>,
70	#[serde(skip_serializing_if = "Option::is_none")]
71	pub label: Option<ConfidentialAssetLabel>,
72}
73
74impl GetInfo<ConfidentialAssetInfo> for Asset {
75	fn get_info(&self, _network: Network) -> ConfidentialAssetInfo {
76		ConfidentialAssetInfo {
77			type_: match self {
78				Asset::Null => ConfidentialType::Null,
79				Asset::Explicit(..) => ConfidentialType::Explicit,
80				Asset::Confidential(..) => ConfidentialType::Confidential,
81			},
82			asset: match self {
83				Asset::Explicit(a) => Some(*a),
84				_ => None,
85			},
86			commitment: match self {
87				Asset::Confidential(pk) => Some(pk.serialize()[..].into()),
88				_ => None,
89			},
90			label: match self {
91				Asset::Explicit(a) => ConfidentialAssetLabel::from_asset_id(*a),
92				_ => None,
93			},
94		}
95	}
96}
97
98impl GetInfo<ConfidentialAssetInfo> for AssetId {
99	fn get_info(&self, _network: Network) -> ConfidentialAssetInfo {
100		ConfidentialAssetInfo {
101			type_: ConfidentialType::Explicit,
102			asset: Some(*self),
103			commitment: None,
104			label: ConfidentialAssetLabel::from_asset_id(*self),
105		}
106	}
107}
108
109#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
110pub struct ConfidentialNonceInfo {
111	#[serde(rename = "type")]
112	pub type_: ConfidentialType,
113	#[serde(skip_serializing_if = "Option::is_none")]
114	pub nonce: Option<HexBytes>,
115	#[serde(skip_serializing_if = "Option::is_none")]
116	pub commitment: Option<HexBytes>,
117}
118
119impl GetInfo<ConfidentialNonceInfo> for Nonce {
120	fn get_info(&self, _network: Network) -> ConfidentialNonceInfo {
121		ConfidentialNonceInfo {
122			type_: match self {
123				Nonce::Null => ConfidentialType::Null,
124				Nonce::Explicit(..) => ConfidentialType::Explicit,
125				Nonce::Confidential(..) => ConfidentialType::Confidential,
126			},
127			nonce: match self {
128				Nonce::Explicit(n) => Some(n[..].into()),
129				_ => None,
130			},
131			commitment: match self {
132				Nonce::Confidential(pk) => Some(pk.serialize()[..].into()),
133				_ => None,
134			},
135		}
136	}
137}