use super::common::Blockchain;
#[derive(Debug, Clone, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SignMessageRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub wallet_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub blockchain: Option<Blockchain>,
#[serde(skip_serializing_if = "Option::is_none")]
pub wallet_address: Option<String>,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub encoded_by_hex: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub memo: Option<String>,
pub entity_secret_ciphertext: String,
}
#[derive(Debug, Clone, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SignatureData {
pub signature: String,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct SignatureResponse {
pub data: SignatureData,
}
#[derive(Debug, Clone, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SignTypedDataRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub wallet_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub blockchain: Option<Blockchain>,
#[serde(skip_serializing_if = "Option::is_none")]
pub wallet_address: Option<String>,
pub typed_data: String,
pub entity_secret_ciphertext: String,
}
#[derive(Debug, Clone, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SignTransactionRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub wallet_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub blockchain: Option<Blockchain>,
#[serde(skip_serializing_if = "Option::is_none")]
pub wallet_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub raw_transaction: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transaction: Option<serde_json::Value>,
pub entity_secret_ciphertext: String,
}
#[derive(Debug, Clone, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SignTransactionData {
pub signature: String,
pub signed_transaction: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub tx_hash: Option<String>,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct SignTransactionResponse {
pub data: SignTransactionData,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn signature_response_deserializes() -> Result<(), Box<dyn std::error::Error>> {
let json = r#"{"data": {"signature": "0xabcdef1234"}}"#;
let resp: SignatureResponse = serde_json::from_str(json)?;
assert_eq!(resp.data.signature, "0xabcdef1234");
Ok(())
}
#[test]
fn sign_transaction_response_deserializes() -> Result<(), Box<dyn std::error::Error>> {
let json = r#"{
"data": {
"signature": "0xsig",
"signedTransaction": "0xsigned",
"txHash": "0xhash"
}
}"#;
let resp: SignTransactionResponse = serde_json::from_str(json)?;
assert_eq!(resp.data.signature, "0xsig");
assert_eq!(resp.data.signed_transaction, "0xsigned");
assert_eq!(resp.data.tx_hash.as_deref(), Some("0xhash"));
Ok(())
}
#[test]
fn sign_message_request_serializes() -> Result<(), Box<dyn std::error::Error>> {
let req = SignMessageRequest {
wallet_id: Some("wallet-1".to_string()),
blockchain: None,
wallet_address: None,
message: "Hello, World!".to_string(),
encoded_by_hex: None,
memo: None,
entity_secret_ciphertext: "cipher".to_string(),
};
let json = serde_json::to_string(&req)?;
assert!(json.contains("walletId"));
assert!(json.contains("entitySecretCiphertext"));
assert!(json.contains("Hello, World!"));
Ok(())
}
#[test]
fn sign_typed_data_request_serializes() -> Result<(), Box<dyn std::error::Error>> {
let req = SignTypedDataRequest {
wallet_id: Some("wallet-1".to_string()),
blockchain: None,
wallet_address: None,
typed_data: r#"{"types":{}}"#.to_string(),
entity_secret_ciphertext: "cipher".to_string(),
};
let json = serde_json::to_string(&req)?;
assert!(json.contains("typedData"));
Ok(())
}
}