pub use r402_core::scheme::ExactScheme;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct StellarExtra {
pub are_fees_sponsored: bool,
}
impl StellarExtra {
#[must_use]
pub const fn sponsored() -> Self {
Self {
are_fees_sponsored: true,
}
}
}
impl Default for StellarExtra {
fn default() -> Self {
Self::sponsored()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExactStellarPayload {
pub transaction: String,
}
pub mod v2 {
use r402_core::wire;
use super::{ExactScheme, ExactStellarPayload, StellarExtra};
use crate::chain::{StellarAddress, StellarTokenAmount};
pub type PaymentPayload = wire::PaymentPayload<PaymentRequirements, ExactStellarPayload>;
pub type PaymentRequirements =
wire::PaymentRequirements<ExactScheme, StellarTokenAmount, StellarAddress, StellarExtra>;
}
#[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 = ExactStellarPayload {
transaction: "AAAAAg==".to_owned(),
};
let json = serde_json::to_value(&payload).unwrap();
assert_eq!(
json.get("transaction").and_then(Value::as_str),
Some("AAAAAg==")
);
let back: ExactStellarPayload = serde_json::from_value(json).unwrap();
assert_eq!(back.transaction, "AAAAAg==");
}
#[test]
fn extra_rejects_unknown_fields() {
let json = serde_json::json!({ "areFeesSponsored": true, "feePayer": "G..." });
assert!(serde_json::from_value::<StellarExtra>(json).is_err());
let false_extra = serde_json::json!({ "areFeesSponsored": false });
let unsponsored: StellarExtra = serde_json::from_value(false_extra).unwrap();
assert!(!unsponsored.are_fees_sponsored);
let ok = serde_json::json!({ "areFeesSponsored": true });
let sponsored: StellarExtra = serde_json::from_value(ok).unwrap();
assert!(sponsored.are_fees_sponsored);
}
#[test]
fn extra_golden_from_ts_shape() {
let raw = include_str!("fixtures/extra_sponsored.json");
let extra: StellarExtra = serde_json::from_str(raw).unwrap();
assert!(extra.are_fees_sponsored);
}
}