useopenlibx402_client::{X402AutoClient,AutoClientOptions};usesolana_sdk::signature::Keypair;// With default optionsletkeypair=Keypair::new();letclient=X402AutoClient::new(keypair,None,None);// With custom optionsletoptions=AutoClientOptions{max_payment_amount:"5.0".to_string(),auto_retry:true,max_retries:3,};letclient=X402AutoClient::new(keypair,Some("https://your-rpc.com"),Some(options));
pubstructAutoClientOptions{/// Maximum amount willing to pay automatically (in USDC)pubmax_payment_amount:String,/// Whether to automatically retry after paymentpubauto_retry:bool,/// Maximum number of retry attemptspubmax_retries:u32,}
// Get the explicit client for manual operationsletexplicit_client=auto_client.client();// Get current optionsletoptions=auto_client.options();println!("Max payment: {}",options.max_payment_amount);
useopenlibx402_client::X402Client;usesolana_sdk::signature::Keypair;letkeypair=Keypair::new();// With default RPCletclient=X402Client::new(keypair,None);// With custom RPCletclient=X402Client::new(keypair,Some("https://your-rpc.com"));
// Check if response is 402letis_402=client.is_payment_required(&response);// Parse payment request from 402 responseletpayment_request=client.parse_payment_request(response).await?;// Create and broadcast paymentletauthorization=client.create_payment(&payment_request).await?;// Verify payment (optional)letverified=client.verify_payment(&authorization,"0.10").await?;// Make requests with payment authorizationletresponse=client.get_with_auth(url,&authorization).await?;letresponse=client.post_with_auth(url,body,&authorization).await?;
implX402Client{// Make custom HTTP requestsasyncfnrequest(&self,method:&str,url:&str,body:Option<String>,authorization:Option<&PaymentAuthorization>,)->X402Result<Response>}
usereqwest::StatusCode;letresponse=client.get(url).await?;matchresponse.status(){StatusCode::OK=>{// No payment requiredletdata=response.text().await?;}StatusCode::PAYMENT_REQUIRED=>{// Payment requiredletpayment_request=PaymentRequest::from_json(&response.text().await?)?;}status=>{// Other HTTP erroreprintln!("HTTP {}",status);}}
// Create once, reuse for multiple requestsletclient=X402AutoClient::new(keypair,None,None);forurlinurls{letresponse=client.get(&url).await?;// Process response}
useopenlibx402_client::X402Client;usesolana_sdk::signature::read_keypair_file;#[tokio::main]asyncfnmain()->Result<(),Box<dynstd::error::Error>>{letkeypair=read_keypair_file("~/.config/solana/id.json")?;letclient=X402Client::new(keypair,None);leturl="http://localhost:8000/premium";// Make requestletresponse=client.get(url).await?;// Handle 402ifclient.is_payment_required(&response){letpayment_request=client.parse_payment_request(response).await?;// Show payment details to userprintln!("Payment required:");println!(" Amount: {} USDC",payment_request.max_amount_required);println!(" Description: {:?}",payment_request.description);println!(" Expires: {}",payment_request.expires_at);// Confirm with user (in real app)println!("Proceeding with payment...");// Create paymentletauthorization=client.create_payment(&payment_request).await?;println!("Payment sent: {}",authorization.signature);// Retry requestletresponse=client.get_with_auth(url,&authorization).await?;letbody=response.text().await?;println!("Received: {}",body);}else{letbody=response.text().await?;println!("Received: {}",body);}Ok(())}