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,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct EncryptedOrderSubmit {
pub ciphertext: Vec<u8>,
pub commitment: [u8; 32],
pub reveal_deadline_ms: u64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn encrypted_order_submit_has_three_fields() {
let e = EncryptedOrderSubmit {
ciphertext: vec![1, 2, 3],
commitment: [9u8; 32],
reveal_deadline_ms: 123,
};
let j = serde_json::to_value(&e).unwrap();
assert!(j["ciphertext"].is_array());
assert_eq!(j["commitment"].as_array().unwrap().len(), 32);
assert_eq!(j["reveal_deadline_ms"], 123);
assert!(j.get("threshold").is_none());
assert!(j.get("target_block").is_none());
let dec: EncryptedOrderSubmit = serde_json::from_value(j).unwrap();
assert_eq!(dec, e);
}
#[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());
}
}
}