1use std::collections::BTreeMap;
2use std::fmt::{Display, Formatter};
3
4use serde::de::Error as _;
5use serde::{Deserialize, Deserializer, Serialize, Serializer};
6use serde_json::Value;
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
9pub struct VestingDelegation {
10 #[serde(flatten)]
11 pub extra: BTreeMap<String, Value>,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
15pub struct ExpiringVestingDelegation {
16 #[serde(flatten)]
17 pub extra: BTreeMap<String, Value>,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
21pub struct Witness {
22 #[serde(flatten)]
23 pub extra: BTreeMap<String, Value>,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
27pub struct WitnessProps {
28 #[serde(flatten)]
29 pub extra: BTreeMap<String, Value>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
33pub struct OrderBook {
34 #[serde(flatten)]
35 pub extra: BTreeMap<String, Value>,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
39pub struct OpenOrder {
40 #[serde(flatten)]
41 pub extra: BTreeMap<String, Value>,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
45pub struct MarketTrade {
46 #[serde(flatten)]
47 pub extra: BTreeMap<String, Value>,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
51pub struct MarketBucket {
52 #[serde(flatten)]
53 pub extra: BTreeMap<String, Value>,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
57pub struct SavingsWithdraw {
58 #[serde(flatten)]
59 pub extra: BTreeMap<String, Value>,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
63pub struct ConversionRequest {
64 #[serde(flatten)]
65 pub extra: BTreeMap<String, Value>,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
69pub struct CollateralizedConversionRequest {
70 #[serde(flatten)]
71 pub extra: BTreeMap<String, Value>,
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
75pub struct FollowEntry {
76 #[serde(flatten)]
77 pub extra: BTreeMap<String, Value>,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
81pub struct FollowCount {
82 #[serde(flatten)]
83 pub extra: BTreeMap<String, Value>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
87pub struct BlogEntry {
88 #[serde(flatten)]
89 pub extra: BTreeMap<String, Value>,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
93pub struct BlogEntryLight {
94 #[serde(flatten)]
95 pub extra: BTreeMap<String, Value>,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
99pub struct Escrow {
100 #[serde(flatten)]
101 pub extra: BTreeMap<String, Value>,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
105pub struct Proposal {
106 #[serde(flatten)]
107 pub extra: BTreeMap<String, Value>,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
111pub struct RecurrentTransfer {
112 #[serde(flatten)]
113 pub extra: BTreeMap<String, Value>,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
117pub struct AppliedOperation {
118 #[serde(flatten)]
119 pub extra: BTreeMap<String, Value>,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
123pub struct CommunityDetail {
124 #[serde(flatten)]
125 pub extra: BTreeMap<String, Value>,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
129pub struct CommunityRole {
130 #[serde(flatten)]
131 pub extra: BTreeMap<String, Value>,
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
135pub struct Notification {
136 #[serde(flatten)]
137 pub extra: BTreeMap<String, Value>,
138}
139
140#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
141pub struct PostsQuery {
142 #[serde(flatten)]
143 pub extra: BTreeMap<String, Value>,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
147pub struct AccountPostsQuery {
148 #[serde(flatten)]
149 pub extra: BTreeMap<String, Value>,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
153pub struct CommunityQuery {
154 #[serde(flatten)]
155 pub extra: BTreeMap<String, Value>,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
159pub struct ListCommunitiesQuery {
160 #[serde(flatten)]
161 pub extra: BTreeMap<String, Value>,
162}
163
164#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
165pub struct CommunityRolesQuery {
166 #[serde(flatten)]
167 pub extra: BTreeMap<String, Value>,
168}
169
170#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
171pub struct AccountNotifsQuery {
172 #[serde(flatten)]
173 pub extra: BTreeMap<String, Value>,
174}
175
176#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
177pub struct ChainId {
178 pub bytes: [u8; 32],
179}
180
181impl ChainId {
182 pub fn mainnet() -> Self {
183 Self::from_hex("beeab0de00000000000000000000000000000000000000000000000000000000")
184 .expect("valid mainnet chain id")
185 }
186
187 pub fn testnet() -> Self {
188 Self::from_hex("18dcf0a285365fc58b71f18b3d3fec954aa0c141c44e4e5cb4cf777b9eab274e")
189 .expect("valid testnet chain id")
190 }
191
192 pub fn from_hex(value: &str) -> Result<Self, hex::FromHexError> {
193 let bytes = hex::decode(value)?;
194 let bytes: [u8; 32] = bytes
195 .try_into()
196 .map_err(|_| hex::FromHexError::InvalidStringLength)?;
197 Ok(Self { bytes })
198 }
199
200 pub fn to_hex(&self) -> String {
201 hex::encode(self.bytes)
202 }
203}
204
205impl Default for ChainId {
206 fn default() -> Self {
207 Self::mainnet()
208 }
209}
210
211impl Display for ChainId {
212 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
213 write!(f, "{}", self.to_hex())
214 }
215}
216
217impl Serialize for ChainId {
218 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
219 where
220 S: Serializer,
221 {
222 serializer.serialize_str(&self.to_hex())
223 }
224}
225
226impl<'de> Deserialize<'de> for ChainId {
227 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
228 where
229 D: Deserializer<'de>,
230 {
231 let value = String::deserialize(deserializer)?;
232 Self::from_hex(&value).map_err(D::Error::custom)
233 }
234}