inf_circle_sdk/types.rs
1//! Common types used across the SDK
2//!
3//! This module defines shared types, enums, and structures used throughout the SDK.
4
5use serde::{Deserialize, Serialize};
6
7/// Supported blockchain networks
8///
9/// Circle supports multiple blockchain networks for wallet and contract operations.
10///
11/// # Mainnets
12///
13/// - `Eth` - Ethereum mainnet
14/// - `Avax` - Avalanche C-Chain mainnet
15/// - `Matic` - Polygon mainnet
16/// - `Sol` - Solana mainnet
17/// - `Arb` - Arbitrum One mainnet
18/// - `Near` - NEAR Protocol mainnet
19/// - `Uni` - Unichain mainnet
20/// - `Base` - Base mainnet
21/// - `Op` - Optimism mainnet
22/// - `Aptos` - Aptos mainnet
23/// - `Monad` - Monad mainnet
24///
25/// # Testnets
26///
27/// - `EthSepolia` - Ethereum Sepolia testnet
28/// - `AvaxFuji` - Avalanche Fuji testnet
29/// - `MaticAmoy` - Polygon Amoy testnet
30/// - `SolDevnet` - Solana devnet
31/// - `ArbSepolia` - Arbitrum Sepolia testnet
32/// - `NearTestnet` - NEAR Protocol testnet
33/// - `UniSepolia` - Unichain Sepolia testnet
34/// - `BaseSepolia` - Base Sepolia testnet
35/// - `OpSepolia` - Optimism Sepolia testnet
36/// - `AptosTestnet` - Aptos testnet
37/// - `ArcTestnet` - Arc testnet
38/// - `MonadTestnet` - Monad testnet
39///
40/// # Example
41///
42/// ```rust
43/// use inf_circle_sdk::types::Blockchain;
44///
45/// let blockchain = Blockchain::EthSepolia;
46/// println!("Using blockchain: {}", blockchain.as_str()); // "ETH-SEPOLIA"
47/// ```
48#[derive(Debug, Clone, Deserialize, Eq, PartialEq)]
49pub enum Blockchain {
50 #[serde(rename = "ETH")]
51 Eth,
52 #[serde(rename = "ETH-SEPOLIA")]
53 EthSepolia,
54 #[serde(rename = "AVAX")]
55 Avax,
56 #[serde(rename = "AVAX-FUJI")]
57 AvaxFuji,
58 #[serde(rename = "MATIC")]
59 Matic,
60 #[serde(rename = "MATIC-AMOY")]
61 MaticAmoy,
62 #[serde(rename = "SOL")]
63 Sol,
64 #[serde(rename = "SOL-DEVNET")]
65 SolDevnet,
66 #[serde(rename = "ARB")]
67 Arb,
68 #[serde(rename = "ARB-SEPOLIA")]
69 ArbSepolia,
70 #[serde(rename = "NEAR")]
71 Near,
72 #[serde(rename = "NEAR-TESTNET")]
73 NearTestnet,
74 #[serde(rename = "MONAD")]
75 Monad,
76 #[serde(rename = "MONAD-TESTNET")]
77 MonadTestnet,
78 #[serde(rename = "EVM")]
79 Evm,
80 #[serde(rename = "EVM-TESTNET")]
81 EvmTestnet,
82 #[serde(rename = "UNI")]
83 Uni,
84 #[serde(rename = "UNI-SEPOLIA")]
85 UniSepolia,
86 #[serde(rename = "BASE")]
87 Base,
88 #[serde(rename = "BASE-SEPOLIA")]
89 BaseSepolia,
90 #[serde(rename = "OP")]
91 Op,
92 #[serde(rename = "OP-SEPOLIA")]
93 OpSepolia,
94 #[serde(rename = "APTOS")]
95 Aptos,
96 #[serde(rename = "APTOS-TESTNET")]
97 AptosTestnet,
98 #[serde(rename = "ARC-TESTNET")]
99 ArcTestnet,
100}
101
102impl Blockchain {
103 /// Get the string representation of the blockchain
104 ///
105 /// Returns the API-compatible string identifier for the blockchain.
106 ///
107 /// # Returns
108 ///
109 /// Returns a static string slice with the blockchain identifier.
110 ///
111 /// # Example
112 ///
113 /// ```rust
114 /// use inf_circle_sdk::types::Blockchain;
115 ///
116 /// let blockchain = Blockchain::EthSepolia;
117 /// assert_eq!(blockchain.as_str(), "ETH-SEPOLIA");
118 ///
119 /// let blockchain = Blockchain::Avax;
120 /// assert_eq!(blockchain.as_str(), "AVAX");
121 /// ```
122 pub fn as_str(&self) -> &'static str {
123 match self {
124 Blockchain::Eth => "ETH",
125 Blockchain::EthSepolia => "ETH-SEPOLIA",
126 Blockchain::Avax => "AVAX",
127 Blockchain::AvaxFuji => "AVAX-FUJI",
128 Blockchain::Matic => "MATIC",
129 Blockchain::MaticAmoy => "MATIC-AMOY",
130 Blockchain::Sol => "SOL",
131 Blockchain::SolDevnet => "SOL-DEVNET",
132 Blockchain::Arb => "ARB",
133 Blockchain::ArbSepolia => "ARB-SEPOLIA",
134 Blockchain::Near => "NEAR",
135 Blockchain::NearTestnet => "NEAR-TESTNET",
136 Blockchain::Monad => "MONAD",
137 Blockchain::MonadTestnet => "MONAD-TESTNET",
138 Blockchain::Evm => "EVM",
139 Blockchain::EvmTestnet => "EVM-TESTNET",
140 Blockchain::Uni => "UNI",
141 Blockchain::UniSepolia => "UNI-SEPOLIA",
142 Blockchain::Base => "BASE",
143 Blockchain::BaseSepolia => "BASE-SEPOLIA",
144 Blockchain::Op => "OP",
145 Blockchain::OpSepolia => "OP-SEPOLIA",
146 Blockchain::Aptos => "APTOS",
147 Blockchain::AptosTestnet => "APTOS-TESTNET",
148 Blockchain::ArcTestnet => "ARC-TESTNET",
149 }
150 }
151}
152
153impl Serialize for Blockchain {
154 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
155 where
156 S: serde::Serializer,
157 {
158 serializer.serialize_str(self.as_str())
159 }
160}