pub use r402_core::scheme::ExactScheme;
use serde::{Deserialize, Serialize};
use crate::chain::AptosAddress;
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct AptosExtra {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fee_payer: Option<AptosAddress>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExactAptosPayload {
pub transaction: String,
}
pub mod v2 {
use r402_core::wire;
use super::{AptosExtra, ExactAptosPayload, ExactScheme};
use crate::chain::{AptosAddress, AptosTokenAmount};
pub type PaymentPayload = wire::PaymentPayload<PaymentRequirements, ExactAptosPayload>;
pub type PaymentRequirements =
wire::PaymentRequirements<ExactScheme, AptosTokenAmount, AptosAddress, AptosExtra>;
}
#[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 = ExactAptosPayload {
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: ExactAptosPayload = serde_json::from_value(json).unwrap();
assert_eq!(back.transaction, "AQID");
}
#[test]
fn extra_rejects_unknown_fields() {
let json = serde_json::json!({ "feePayer": crate::chain::USDC_TESTNET_FA, "alias": "x" });
assert!(serde_json::from_value::<AptosExtra>(json).is_err());
let empty = serde_json::json!({});
assert!(serde_json::from_value::<AptosExtra>(empty).is_ok());
}
#[test]
fn extra_golden_fixture_roundtrips() {
let raw = include_str!("fixtures/extra.json");
let extra: AptosExtra = serde_json::from_str(raw).unwrap();
assert_eq!(
extra.fee_payer.as_ref().map(AptosAddress::as_str),
Some("0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
);
let encoded = serde_json::to_value(&extra).unwrap();
assert_eq!(
encoded,
serde_json::json!({
"feePayer": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
})
);
}
}