use serde::{Deserialize, Serialize};
use crate::wallet::Address;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct CrossChainMsg {
pub dst_chain: u32,
pub payload: Vec<u8>,
pub nonce: u64,
pub sender: Address,
pub ts_ms: u64,
pub status: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct CrossChainSend {
pub dst_chain_id: u32,
pub recipient: [u8; 32],
pub token: u32,
pub amount: u128,
pub nonce: u64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cross_chain_send_recipient_is_array_amount_is_number() {
let m = CrossChainSend {
dst_chain_id: 8453,
recipient: [7u8; 32],
token: 1,
amount: 1_000_000,
nonce: 7,
};
let j = serde_json::to_value(&m).unwrap();
assert_eq!(j["dst_chain_id"], 8453);
assert!(j["recipient"].is_array());
assert_eq!(j["recipient"].as_array().unwrap().len(), 32);
assert!(j["amount"].is_number());
let dec: CrossChainSend = serde_json::from_value(j).unwrap();
assert_eq!(dec, m);
}
#[test]
fn cross_chain_msg_round_trips() {
let m = CrossChainMsg {
dst_chain: 8453,
payload: vec![1, 2, 3],
nonce: 1,
sender: Address::ZERO,
ts_ms: 1_700_000_000_000,
status: "pending".into(),
};
let j = serde_json::to_value(&m).unwrap();
for key in ["dst_chain", "ts_ms"] {
assert!(j.get(key).is_some());
}
for key in ["dstChain", "tsMs"] {
assert!(j.get(key).is_none());
}
let dec: CrossChainMsg = serde_json::from_value(j).unwrap();
assert_eq!(m, dec);
}
}