pub use r402_core::scheme::ExactScheme;
use serde::{Deserialize, Serialize};
use crate::chain::HederaAddress;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct HederaExtra {
pub fee_payer: HederaAddress,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExactHederaPayload {
pub transaction: String,
}
pub mod v2 {
use r402_core::wire;
use super::{ExactHederaPayload, ExactScheme, HederaExtra};
use crate::chain::{HederaAddress, HederaTokenAmount};
pub type PaymentPayload = wire::PaymentPayload<PaymentRequirements, ExactHederaPayload>;
pub type PaymentRequirements =
wire::PaymentRequirements<ExactScheme, HederaTokenAmount, HederaAddress, HederaExtra>;
}
#[cfg(test)]
#[allow(clippy::unwrap_used, reason = "test assertions")]
mod tests {
use serde_json::Value;
use super::*;
#[test]
fn payload_field_is_camel_case() {
let payload = ExactHederaPayload {
transaction: "AQID".to_owned(),
};
let json = serde_json::to_value(&payload).unwrap();
assert_eq!(
json.get("transaction").and_then(Value::as_str),
Some("AQID")
);
let back: ExactHederaPayload = serde_json::from_value(json).unwrap();
assert_eq!(back.transaction, "AQID");
}
#[test]
fn extra_rejects_unknown_fields() {
let json = serde_json::json!({ "feePayer": "0.0.5001", "aliasPolicy": "allow" });
assert!(serde_json::from_value::<HederaExtra>(json).is_err());
let ok = serde_json::json!({ "feePayer": "0.0.5001" });
let extra: HederaExtra = serde_json::from_value(ok).unwrap();
assert_eq!(extra.fee_payer.as_str(), "0.0.5001");
}
#[test]
fn extra_golden_fixture_roundtrips() {
let raw = include_str!("fixtures/extra.json");
let extra: HederaExtra = serde_json::from_str(raw).unwrap();
assert_eq!(extra.fee_payer.as_str(), "0.0.5001");
let encoded = serde_json::to_value(&extra).unwrap();
assert_eq!(encoded, serde_json::json!({ "feePayer": "0.0.5001" }));
}
}