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}