circle_user_controlled_wallets/models/
wallet.rs1use serde::{Deserialize, Serialize};
7
8use super::common::{
9 AccountType, Blockchain, CustodyType, PageParams, ScaCore, TokenStandard, WalletState,
10};
11
12#[derive(Debug, Clone, Default, Deserialize, Serialize)]
16#[serde(rename_all = "camelCase")]
17pub struct WalletMetadata {
18 pub name: Option<String>,
20 pub ref_id: Option<String>,
22}
23
24#[derive(Debug, Clone, Deserialize, Serialize)]
28#[serde(rename_all = "camelCase")]
29pub struct Token {
30 pub id: String,
32 pub blockchain: Blockchain,
34 pub is_native: bool,
36 pub name: Option<String>,
38 pub standard: Option<TokenStandard>,
40 pub decimals: Option<i32>,
42 pub symbol: Option<String>,
44 pub token_address: Option<String>,
46 pub update_date: String,
48 pub create_date: String,
50}
51
52#[derive(Debug, Clone, Deserialize, Serialize)]
56#[serde(rename_all = "camelCase")]
57pub struct Balance {
58 pub amount: String,
60 pub token: Token,
62 pub update_date: String,
64}
65
66#[derive(Debug, Clone, Deserialize, Serialize)]
68#[serde(rename_all = "camelCase")]
69pub struct BalancesData {
70 pub token_balances: Vec<Balance>,
72}
73
74#[derive(Debug, Clone, Deserialize, Serialize)]
76#[serde(rename_all = "camelCase")]
77pub struct Balances {
78 pub data: BalancesData,
80}
81
82#[derive(Debug, Clone, Default, Deserialize, Serialize)]
86#[serde(rename_all = "camelCase")]
87pub struct NftMetadata {
88 pub name: Option<String>,
90 pub description: Option<String>,
92 pub image: Option<String>,
94}
95
96#[derive(Debug, Clone, Deserialize, Serialize)]
98#[serde(rename_all = "camelCase")]
99pub struct Nft {
100 pub token: Token,
102 pub amount: String,
104 pub update_date: String,
106 pub nft_token_id: Option<String>,
108 pub metadata: Option<NftMetadata>,
110}
111
112#[derive(Debug, Clone, Deserialize, Serialize)]
114#[serde(rename_all = "camelCase")]
115pub struct NftsData {
116 pub nfts: Vec<Nft>,
118}
119
120#[derive(Debug, Clone, Deserialize, Serialize)]
122#[serde(rename_all = "camelCase")]
123pub struct Nfts {
124 pub data: NftsData,
126}
127
128#[derive(Debug, Clone, Deserialize, Serialize)]
132#[serde(rename_all = "camelCase")]
133pub struct Wallet {
134 pub id: String,
136 pub address: String,
138 pub blockchain: Blockchain,
140 pub create_date: String,
142 pub update_date: String,
144 pub custody_type: CustodyType,
146 pub name: Option<String>,
148 pub ref_id: Option<String>,
150 pub state: WalletState,
152 pub user_id: Option<String>,
154 pub wallet_set_id: String,
156 pub initial_public_key: Option<String>,
158 pub account_type: Option<AccountType>,
160 pub sca_core: Option<ScaCore>,
162}
163
164#[derive(Debug, Clone, Deserialize, Serialize)]
166#[serde(rename_all = "camelCase")]
167pub struct WalletsData {
168 pub wallets: Vec<Wallet>,
170}
171
172#[derive(Debug, Clone, Deserialize, Serialize)]
174#[serde(rename_all = "camelCase")]
175pub struct Wallets {
176 pub data: WalletsData,
178}
179
180#[derive(Debug, Clone, Deserialize, Serialize)]
182#[serde(rename_all = "camelCase")]
183pub struct WalletData {
184 pub wallet: Wallet,
186}
187
188#[derive(Debug, Clone, Deserialize, Serialize)]
190#[serde(rename_all = "camelCase")]
191pub struct WalletResponse {
192 pub data: WalletData,
194}
195
196#[derive(Debug, Clone, Deserialize, Serialize)]
200#[serde(rename_all = "camelCase")]
201pub struct TokenData {
202 pub token: Token,
204}
205
206#[derive(Debug, Clone, Deserialize, Serialize)]
208#[serde(rename_all = "camelCase")]
209pub struct TokenResponse {
210 pub data: TokenData,
212}
213
214#[derive(Debug, Clone, Default, Deserialize, Serialize)]
218#[serde(rename_all = "camelCase")]
219pub struct UpdateWalletRequest {
220 pub name: Option<String>,
222 pub ref_id: Option<String>,
224}
225
226#[derive(Debug, Clone, Default, Deserialize, Serialize)]
228#[serde(rename_all = "camelCase")]
229pub struct ListWalletsParams {
230 pub address: Option<String>,
232 pub blockchain: Option<Blockchain>,
234 pub sca_core: Option<ScaCore>,
236 pub wallet_set_id: Option<String>,
238 pub ref_id: Option<String>,
240 #[serde(flatten)]
242 pub page: PageParams,
243}
244
245#[derive(Debug, Clone, Default, Deserialize, Serialize)]
247#[serde(rename_all = "camelCase")]
248pub struct ListWalletBalancesParams {
249 pub include_all: Option<bool>,
251 pub name: Option<String>,
253 pub token_address: Option<String>,
255 pub standard: Option<TokenStandard>,
257 #[serde(flatten)]
259 pub page: PageParams,
260}
261
262#[derive(Debug, Clone, Default, Deserialize, Serialize)]
264#[serde(rename_all = "camelCase")]
265pub struct ListWalletNftsParams {
266 pub include_all: Option<bool>,
268 pub name: Option<String>,
270 pub token_address: Option<String>,
272 pub standard: Option<TokenStandard>,
274 #[serde(flatten)]
276 pub page: PageParams,
277}
278
279#[derive(Debug, Clone, Deserialize, Serialize)]
281#[serde(rename_all = "camelCase")]
282pub struct CreateEndUserWalletRequest {
283 pub idempotency_key: String,
285 pub blockchains: Vec<Blockchain>,
287 pub account_type: Option<AccountType>,
289 pub metadata: Option<Vec<WalletMetadata>>,
291}
292
293#[cfg(test)]
296mod tests {
297 use super::*;
298
299 #[test]
300 fn wallet_state_screaming() -> Result<(), Box<dyn std::error::Error>> {
301 assert_eq!(serde_json::to_string(&WalletState::Live)?, "\"LIVE\"");
302 assert_eq!(serde_json::to_string(&WalletState::Frozen)?, "\"FROZEN\"");
303 Ok(())
304 }
305
306 #[test]
307 fn update_wallet_request_camel_case() -> Result<(), Box<dyn std::error::Error>> {
308 let req = UpdateWalletRequest { name: Some("myWallet".to_string()), ref_id: None };
309 let s = serde_json::to_string(&req)?;
310 assert!(s.contains("\"name\""), "expected name in {s}");
311 Ok(())
312 }
313
314 #[test]
315 fn create_wallet_request_camel_case() -> Result<(), Box<dyn std::error::Error>> {
316 let req = CreateEndUserWalletRequest {
317 idempotency_key: "abc-def".to_string(),
318 blockchains: vec![Blockchain::Eth, Blockchain::EthSepolia],
319 account_type: None,
320 metadata: None,
321 };
322 let s = serde_json::to_string(&req)?;
323 assert!(s.contains("idempotencyKey"), "expected idempotencyKey in {s}");
324 assert!(s.contains("ETH-SEPOLIA"), "expected ETH-SEPOLIA in {s}");
325 Ok(())
326 }
327}