pubstructPaymentRequirement{/// Amount required in USDCpubamount:String,/// Optional descriptionpubdescription:Option<String>,/// Expiration time in seconds (default: 300)pubexpires_in:i64,}
// Simple requirementletrequirement=PaymentRequirement::new("0.10");// With descriptionletrequirement=PaymentRequirement::new("0.10").with_description("Access to premium data");// With custom expirationletrequirement=PaymentRequirement::new("0.10").with_description("Premium API access").with_expires_in(600);// 10 minutes
useopenlibx402_rocket::*;userocket::{get,routes,serde::json::Json,State};useserde::Serialize;#[derive(Serialize)]structTierData{tier:String,data:Vec<String>,}#[get("/basic")]fnbasic(config:&State<X402Config>,auth:Option<PaymentGuard>,)->Result<Json<TierData>,PaymentRequiredResponse>{matchauth{Some(_)=>Ok(Json(TierData{tier:"basic".to_string(),data:vec!["Basic data".to_string()],})),None=>{letreq=PaymentRequirement::new("0.01").with_description("Basic tier access");Err(PaymentRequiredResponse{payment_request:create_payment_request(config,&req,"/basic")})}}}#[get("/premium")]fnpremium(config:&State<X402Config>,auth:Option<PaymentGuard>,)->Result<Json<TierData>,PaymentRequiredResponse>{matchauth{Some(_)=>Ok(Json(TierData{tier:"premium".to_string(),data:vec!["Premium data 1".to_string(),"Premium data 2".to_string()],})),None=>{letreq=PaymentRequirement::new("0.10").with_description("Premium tier access").with_expires_in(600);Err(PaymentRequiredResponse{payment_request:create_payment_request(config,&req,"/premium")})}}}#[get("/enterprise")]fnenterprise(config:&State<X402Config>,auth:Option<PaymentGuard>,)->Result<Json<TierData>,PaymentRequiredResponse>{matchauth{Some(_)=>Ok(Json(TierData{tier:"enterprise".to_string(),data:vec!["Enterprise data 1".to_string(),"Enterprise data 2".to_string(),"Enterprise data 3".to_string(),],})),None=>{letreq=PaymentRequirement::new("1.00").with_description("Enterprise tier access");Err(PaymentRequiredResponse{payment_request:create_payment_request(config,&req,"/enterprise")})}}}#[rocket::main]asyncfnmain(){letconfig=X402Config{payment_address:"YOUR_WALLET".to_string(),token_mint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v".to_string(),network:"solana-devnet".to_string(),rpc_url:None,auto_verify:true,};rocket::build().manage(config).mount("/",routes![basic,premium,enterprise]).launch().await.unwrap();}