circle_developer_controlled_wallets/models/
signing.rs1use super::common::Blockchain;
7
8#[derive(Debug, Clone, serde::Serialize)]
10#[serde(rename_all = "camelCase")]
11pub struct SignMessageRequest {
12 #[serde(skip_serializing_if = "Option::is_none")]
14 pub wallet_id: Option<String>,
15 #[serde(skip_serializing_if = "Option::is_none")]
17 pub blockchain: Option<Blockchain>,
18 #[serde(skip_serializing_if = "Option::is_none")]
20 pub wallet_address: Option<String>,
21 pub message: String,
23 #[serde(skip_serializing_if = "Option::is_none")]
25 pub encoded_by_hex: Option<bool>,
26 #[serde(skip_serializing_if = "Option::is_none")]
28 pub memo: Option<String>,
29 pub entity_secret_ciphertext: String,
31}
32
33#[derive(Debug, Clone, serde::Deserialize)]
35#[serde(rename_all = "camelCase")]
36pub struct SignatureData {
37 pub signature: String,
39}
40
41#[derive(Debug, Clone, serde::Deserialize)]
43pub struct SignatureResponse {
44 pub data: SignatureData,
46}
47
48#[derive(Debug, Clone, serde::Serialize)]
50#[serde(rename_all = "camelCase")]
51pub struct SignTypedDataRequest {
52 #[serde(skip_serializing_if = "Option::is_none")]
54 pub wallet_id: Option<String>,
55 #[serde(skip_serializing_if = "Option::is_none")]
57 pub blockchain: Option<Blockchain>,
58 #[serde(skip_serializing_if = "Option::is_none")]
60 pub wallet_address: Option<String>,
61 pub typed_data: String,
63 pub entity_secret_ciphertext: String,
65}
66
67#[derive(Debug, Clone, serde::Serialize)]
69#[serde(rename_all = "camelCase")]
70pub struct SignTransactionRequest {
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub wallet_id: Option<String>,
74 #[serde(skip_serializing_if = "Option::is_none")]
76 pub blockchain: Option<Blockchain>,
77 #[serde(skip_serializing_if = "Option::is_none")]
79 pub wallet_address: Option<String>,
80 #[serde(skip_serializing_if = "Option::is_none")]
82 pub raw_transaction: Option<String>,
83 #[serde(skip_serializing_if = "Option::is_none")]
85 pub transaction: Option<serde_json::Value>,
86 pub entity_secret_ciphertext: String,
88}
89
90#[derive(Debug, Clone, serde::Deserialize)]
92#[serde(rename_all = "camelCase")]
93pub struct SignTransactionData {
94 pub signature: String,
96 pub signed_transaction: String,
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub tx_hash: Option<String>,
101}
102
103#[derive(Debug, Clone, serde::Deserialize)]
105pub struct SignTransactionResponse {
106 pub data: SignTransactionData,
108}
109
110#[cfg(test)]
111mod tests {
112 use super::*;
113
114 #[test]
115 fn signature_response_deserializes() -> Result<(), Box<dyn std::error::Error>> {
116 let json = r#"{"data": {"signature": "0xabcdef1234"}}"#;
117 let resp: SignatureResponse = serde_json::from_str(json)?;
118 assert_eq!(resp.data.signature, "0xabcdef1234");
119 Ok(())
120 }
121
122 #[test]
123 fn sign_transaction_response_deserializes() -> Result<(), Box<dyn std::error::Error>> {
124 let json = r#"{
125 "data": {
126 "signature": "0xsig",
127 "signedTransaction": "0xsigned",
128 "txHash": "0xhash"
129 }
130 }"#;
131 let resp: SignTransactionResponse = serde_json::from_str(json)?;
132 assert_eq!(resp.data.signature, "0xsig");
133 assert_eq!(resp.data.signed_transaction, "0xsigned");
134 assert_eq!(resp.data.tx_hash.as_deref(), Some("0xhash"));
135 Ok(())
136 }
137
138 #[test]
139 fn sign_message_request_serializes() -> Result<(), Box<dyn std::error::Error>> {
140 let req = SignMessageRequest {
141 wallet_id: Some("wallet-1".to_string()),
142 blockchain: None,
143 wallet_address: None,
144 message: "Hello, World!".to_string(),
145 encoded_by_hex: None,
146 memo: None,
147 entity_secret_ciphertext: "cipher".to_string(),
148 };
149 let json = serde_json::to_string(&req)?;
150 assert!(json.contains("walletId"));
151 assert!(json.contains("entitySecretCiphertext"));
152 assert!(json.contains("Hello, World!"));
153 Ok(())
154 }
155
156 #[test]
157 fn sign_typed_data_request_serializes() -> Result<(), Box<dyn std::error::Error>> {
158 let req = SignTypedDataRequest {
159 wallet_id: Some("wallet-1".to_string()),
160 blockchain: None,
161 wallet_address: None,
162 typed_data: r#"{"types":{}}"#.to_string(),
163 entity_secret_ciphertext: "cipher".to_string(),
164 };
165 let json = serde_json::to_string(&req)?;
166 assert!(json.contains("typedData"));
167 Ok(())
168 }
169}