use serde::{Deserialize, Serialize};
use crate::wallet::Address;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct SubmitEncryptedOrder {
pub ciphertext: Vec<u8>,
pub commitment: [u8; 32],
pub threshold: u8,
pub target_block: u64,
pub reveal_deadline_ms: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct EncryptedOrderState {
pub submitter: Address,
pub ciphertext: Vec<u8>,
pub decryption_share_count: u8,
pub threshold: u8,
pub target_block: u64,
pub status: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn submit_encrypted_order_round_trips() {
let s = SubmitEncryptedOrder {
ciphertext: vec![0xAB; 64],
commitment: [0u8; 32],
threshold: 5,
target_block: 1_000_000,
reveal_deadline_ms: 5_000,
};
let j = serde_json::to_string(&s).unwrap();
let dec: SubmitEncryptedOrder = serde_json::from_str(&j).unwrap();
assert_eq!(s, dec);
}
#[test]
fn encrypted_order_state_uses_snake_case() {
let s = EncryptedOrderState {
submitter: Address::ZERO,
ciphertext: vec![],
decryption_share_count: 0,
threshold: 5,
target_block: 1_000_000,
status: "pending".into(),
};
let j = serde_json::to_value(&s).unwrap();
for key in ["decryption_share_count", "target_block"] {
assert!(j.get(key).is_some());
}
for key in ["decryptionShareCount", "targetBlock"] {
assert!(j.get(key).is_none());
}
}
}