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}