circle_user_controlled_wallets/models/
common.rs1use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Deserialize, Serialize)]
12#[serde(rename_all = "camelCase")]
13pub struct ApiErrorBody {
14 pub code: i32,
16 pub message: String,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
24#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
25pub enum Blockchain {
26 Eth,
28 #[serde(rename = "ETH-SEPOLIA")]
30 EthSepolia,
31 Avax,
33 #[serde(rename = "AVAX-FUJI")]
35 AvaxFuji,
36 Matic,
38 #[serde(rename = "MATIC-AMOY")]
40 MaticAmoy,
41 Sol,
43 #[serde(rename = "SOL-DEVNET")]
45 SolDevnet,
46 Arb,
48 #[serde(rename = "ARB-SEPOLIA")]
50 ArbSepolia,
51 Near,
53 #[serde(rename = "NEAR-TESTNET")]
55 NearTestnet,
56 Evm,
58 #[serde(rename = "EVM-TESTNET")]
60 EvmTestnet,
61 Uni,
63 #[serde(rename = "UNI-SEPOLIA")]
65 UniSepolia,
66 Base,
68 #[serde(rename = "BASE-SEPOLIA")]
70 BaseSepolia,
71 Op,
73 #[serde(rename = "OP-SEPOLIA")]
75 OpSepolia,
76 Aptos,
78 #[serde(rename = "APTOS-TESTNET")]
80 AptosTestnet,
81 #[serde(rename = "ARC-TESTNET")]
83 ArcTestnet,
84 Monad,
86 #[serde(rename = "MONAD-TESTNET")]
88 MonadTestnet,
89}
90
91#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
95#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
96pub enum TokenStandard {
97 Erc20,
99 Erc721,
101 Erc1155,
103 Fungible,
105 FungibleAsset,
107 NonFungible,
109 NonFungibleEdition,
111 ProgrammableNonFungible,
113 ProgrammableNonFungibleEdition,
115}
116
117#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
121#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
122pub enum AccountType {
123 Sca,
125 Eoa,
127}
128
129#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
131#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
132pub enum CustodyType {
133 Developer,
135 Enduser,
137}
138
139#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
143#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
144pub enum WalletState {
145 Live,
147 Frozen,
149}
150
151#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
155#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
156pub enum FeeLevel {
157 Low,
159 Medium,
161 High,
163}
164
165#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
169pub enum ScaCore {
170 #[serde(rename = "circle_4337_v1")]
172 Circle4337V1,
173 #[serde(rename = "circle_6900_singleowner_v1")]
175 Circle6900SingleownerV1,
176 #[serde(rename = "circle_6900_singleowner_v2")]
178 Circle6900SingleownerV2,
179 #[serde(rename = "circle_6900_singleowner_v3")]
181 Circle6900SingleownerV3,
182}
183
184#[derive(Debug, Clone, Default, Deserialize, Serialize)]
188#[serde(rename_all = "camelCase")]
189pub struct TransactionFee {
190 pub gas_limit: Option<String>,
192 pub gas_price: Option<String>,
194 pub max_fee: Option<String>,
196 pub priority_fee: Option<String>,
198 pub base_fee: Option<String>,
200 pub network_fee: Option<String>,
202 pub network_fee_raw: Option<String>,
204 pub l1_fee: Option<String>,
206}
207
208#[derive(Debug, Clone, Default, Deserialize, Serialize)]
212pub struct PageParams {
213 pub from: Option<String>,
215 pub to: Option<String>,
217 #[serde(rename = "pageBefore", skip_serializing_if = "Option::is_none")]
219 pub page_before: Option<String>,
220 #[serde(rename = "pageAfter", skip_serializing_if = "Option::is_none")]
222 pub page_after: Option<String>,
223 #[serde(rename = "pageSize", skip_serializing_if = "Option::is_none")]
225 pub page_size: Option<u32>,
226}
227
228#[cfg(test)]
231mod tests {
232 use super::*;
233
234 #[test]
235 fn blockchain_eth_serializes_to_eth() -> Result<(), Box<dyn std::error::Error>> {
236 let s = serde_json::to_string(&Blockchain::Eth)?;
237 assert_eq!(s, "\"ETH\"");
238 Ok(())
239 }
240
241 #[test]
242 fn blockchain_eth_sepolia_serializes_with_hyphen() -> Result<(), Box<dyn std::error::Error>> {
243 let s = serde_json::to_string(&Blockchain::EthSepolia)?;
244 assert_eq!(s, "\"ETH-SEPOLIA\"");
245 Ok(())
246 }
247
248 #[test]
249 fn blockchain_avax_fuji_serializes_with_hyphen() -> Result<(), Box<dyn std::error::Error>> {
250 let s = serde_json::to_string(&Blockchain::AvaxFuji)?;
251 assert_eq!(s, "\"AVAX-FUJI\"");
252 Ok(())
253 }
254
255 #[test]
256 fn blockchain_round_trips() -> Result<(), Box<dyn std::error::Error>> {
257 let original = Blockchain::BaseSepolia;
258 let json = serde_json::to_string(&original)?;
259 assert_eq!(json, "\"BASE-SEPOLIA\"");
260 let decoded: Blockchain = serde_json::from_str(&json)?;
261 assert_eq!(decoded, original);
262 Ok(())
263 }
264
265 #[test]
266 fn sca_core_serializes_to_snake_case() -> Result<(), Box<dyn std::error::Error>> {
267 let s = serde_json::to_string(&ScaCore::Circle4337V1)?;
268 assert_eq!(s, "\"circle_4337_v1\"");
269 let s2 = serde_json::to_string(&ScaCore::Circle6900SingleownerV2)?;
270 assert_eq!(s2, "\"circle_6900_singleowner_v2\"");
271 Ok(())
272 }
273
274 #[test]
275 fn fee_level_screaming_snake_case() -> Result<(), Box<dyn std::error::Error>> {
276 assert_eq!(serde_json::to_string(&FeeLevel::Medium)?, "\"MEDIUM\"");
277 Ok(())
278 }
279
280 #[test]
281 fn page_params_camel_case_keys() -> Result<(), Box<dyn std::error::Error>> {
282 let p = PageParams {
283 page_before: Some("abc".to_string()),
284 page_size: Some(10),
285 ..Default::default()
286 };
287 let s = serde_json::to_string(&p)?;
288 assert!(s.contains("pageBefore"), "expected pageBefore in {s}");
289 assert!(s.contains("pageSize"), "expected pageSize in {s}");
290 Ok(())
291 }
292}