1use dpp::dashcore::Network;
5use dpp::fee::epoch::DEFAULT_EPOCHS_PER_ERA;
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8
9pub const DEFAULT_GROVE_BATCHING_CONSISTENCY_VERIFICATION_ENABLED: bool = false;
11pub const DEFAULT_GROVE_HAS_RAW_ENABLED: bool = true;
13pub const DEFAULT_VERIFY_GROVE_ON_STARTUP: bool = false;
15pub const DEFAULT_QUERY_LIMIT: u16 = 100;
17pub const DEFAULT_MAX_QUERY_LIMIT: u16 = 100;
19pub const DEFAULT_DATA_CONTRACTS_CACHE_SIZE: u64 = 500;
21pub const DEFAULT_EPOCH_TIME_LENGTH_S: u64 = 788400;
24
25#[derive(Clone, Debug)]
26#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
27pub struct DriveConfig {
29 #[cfg_attr(
31 feature = "serde",
32 serde(default = "default_batching_consistency_verification")
33 )]
34 pub batching_consistency_verification: bool,
35
36 #[cfg_attr(feature = "serde", serde(default = "default_has_raw_enabled"))]
38 pub has_raw_enabled: bool,
39
40 #[cfg_attr(
42 feature = "serde",
43 serde(default = "default_grove_verify_on_startup_enabled")
44 )]
45 pub grovedb_verify_on_startup: bool,
46
47 #[cfg_attr(
49 feature = "serde",
50 serde(
51 default = "default_default_query_limit",
52 deserialize_with = "from_str_or_number"
53 )
54 )]
55 pub default_query_limit: u16,
56
57 #[cfg_attr(
59 feature = "serde",
60 serde(
61 default = "default_epochs_per_era",
62 deserialize_with = "from_str_or_number"
63 )
64 )]
65 pub epochs_per_era: u16,
66
67 #[cfg_attr(
69 feature = "serde",
70 serde(
71 default = "default_max_query_limit",
72 deserialize_with = "from_str_or_number"
73 )
74 )]
75 pub max_query_limit: u16,
76
77 #[cfg_attr(feature = "serde", serde(default))]
79 pub default_genesis_time: Option<u64>,
80
81 #[cfg_attr(
83 feature = "serde",
84 serde(
85 default = "default_data_contracts_cache_size",
86 deserialize_with = "from_str_or_number"
87 )
88 )]
89 pub data_contracts_global_cache_size: u64,
90
91 #[cfg_attr(
93 feature = "serde",
94 serde(
95 default = "default_data_contracts_cache_size",
96 deserialize_with = "from_str_or_number"
97 )
98 )]
99 pub data_contracts_block_cache_size: u64,
100
101 #[cfg(feature = "grovedbg")]
103 #[cfg_attr(
104 feature = "serde",
105 serde(
106 default = "default_grovedb_visualizer_address",
107 deserialize_with = "from_str_to_socket_address"
108 )
109 )]
110 pub grovedb_visualizer_address: std::net::SocketAddr,
111
112 #[cfg(feature = "grovedbg")]
114 #[cfg_attr(
115 feature = "serde",
116 serde(default, deserialize_with = "from_str_to_bool")
117 )]
118 pub grovedb_visualizer_enabled: bool,
119
120 #[cfg_attr(
122 feature = "serde",
123 serde(skip_deserializing, default = "DriveConfig::default_network")
124 )]
125 pub network: Network,
126
127 #[cfg_attr(
133 feature = "serde",
134 serde(skip, default = "default_epoch_time_length_s")
135 )]
136 pub epoch_time_length_s: u64,
137}
138
139#[cfg(all(feature = "serde", feature = "grovedbg"))]
141fn from_str_to_bool<'de, D>(deserializer: D) -> Result<bool, D::Error>
142where
143 D: serde::Deserializer<'de>,
144{
145 let s = String::deserialize(deserializer)?;
146 s.parse().map_err(serde::de::Error::custom)
147}
148
149#[cfg(feature = "serde")]
150fn from_str_or_number<'de, D, T>(deserializer: D) -> Result<T, D::Error>
151where
152 D: serde::Deserializer<'de>,
153 T: serde::Deserialize<'de> + std::str::FromStr,
154 <T as std::str::FromStr>::Err: std::fmt::Display,
155{
156 use serde::de::Error;
157
158 let s = String::deserialize(deserializer)?;
159 s.parse::<T>().map_err(Error::custom)
160}
161
162#[cfg(all(feature = "serde", feature = "grovedbg"))]
163fn from_str_to_socket_address<'de, D>(deserializer: D) -> Result<std::net::SocketAddr, D::Error>
164where
165 D: serde::Deserializer<'de>,
166{
167 let s = String::deserialize(deserializer)?;
168 s.parse().map_err(serde::de::Error::custom)
169}
170
171const fn default_batching_consistency_verification() -> bool {
172 DEFAULT_GROVE_BATCHING_CONSISTENCY_VERIFICATION_ENABLED
173}
174
175const fn default_has_raw_enabled() -> bool {
176 DEFAULT_GROVE_HAS_RAW_ENABLED
177}
178
179const fn default_grove_verify_on_startup_enabled() -> bool {
180 DEFAULT_VERIFY_GROVE_ON_STARTUP
181}
182
183const fn default_default_query_limit() -> u16 {
184 DEFAULT_QUERY_LIMIT
185}
186
187const fn default_epochs_per_era() -> u16 {
188 DEFAULT_EPOCHS_PER_ERA
189}
190
191const fn default_epoch_time_length_s() -> u64 {
192 DEFAULT_EPOCH_TIME_LENGTH_S
193}
194
195const fn default_max_query_limit() -> u16 {
196 DEFAULT_MAX_QUERY_LIMIT
197}
198
199const fn default_data_contracts_cache_size() -> u64 {
200 DEFAULT_DATA_CONTRACTS_CACHE_SIZE
201}
202
203pub fn default_grovedb_visualizer_address() -> std::net::SocketAddr {
205 "127.0.0.1:8083".parse().unwrap()
206}
207
208impl Default for DriveConfig {
209 fn default() -> Self {
210 DriveConfig {
211 batching_consistency_verification: default_batching_consistency_verification(),
212 has_raw_enabled: default_has_raw_enabled(),
213 grovedb_verify_on_startup: default_grove_verify_on_startup_enabled(),
214 default_query_limit: default_default_query_limit(),
215 epochs_per_era: default_epochs_per_era(),
216 max_query_limit: default_max_query_limit(),
217 default_genesis_time: None,
218 data_contracts_global_cache_size: default_data_contracts_cache_size(),
219 data_contracts_block_cache_size: default_data_contracts_cache_size(),
220 #[cfg(feature = "grovedbg")]
221 grovedb_visualizer_address: default_grovedb_visualizer_address(),
222 #[cfg(feature = "grovedbg")]
223 grovedb_visualizer_enabled: false,
224 network: Network::Mainnet,
225 epoch_time_length_s: default_epoch_time_length_s(),
226 }
227 }
228}
229
230impl DriveConfig {
231 pub fn default_network() -> Network {
233 Network::Mainnet
234 }
235
236 pub fn default_testnet() -> Self {
238 Self {
239 network: Network::Testnet,
240 ..Default::default()
241 }
242 }
243}