use serde::{Deserialize, Serialize};
pub const X402_VERSION: u32 = 2;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaymentRequired {
pub x402_version: u32,
pub resource: ResourceInfo,
pub accepts: Vec<PaymentRequirements>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceInfo {
pub url: String,
pub method: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaymentRequirements {
pub scheme: String,
pub network: String,
pub asset: String,
pub amount: u64,
pub pay_to: String,
pub max_timeout_seconds: u64,
#[serde(default)]
pub extra: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaymentPayload {
pub x402_version: u32,
pub scheme: String,
pub network: String,
pub payload: SvmExactPayload,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SvmExactPayload {
pub transaction: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VerifyResponse {
pub is_valid: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub invalid_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payer: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SettlementResponse {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub transaction: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payer: Option<String>,
pub network: String,
}