use agentic_payments::ap2::*;
use ed25519_dalek::SigningKey;
#[tokio::main]
async fn main() -> Result<()> {
println!("🚀 AP2 Payment Flow Example\n");
println!("📋 Step 1: Initializing AP2 Protocol...");
let mut protocol = Ap2Protocol::new();
println!(" ✓ Protocol initialized\n");
println!("👤 Step 2: Creating User Identity...");
let user_signing_key = SigningKey::generate(&mut rand::rngs::OsRng);
let user_identity = protocol.register_agent(
"alice",
user_signing_key.verifying_key().to_bytes().to_vec(),
)?;
println!(" ✓ User DID: {}\n", user_identity.did);
println!("🏪 Step 3: Creating Merchant Identity...");
let merchant_signing_key = SigningKey::generate(&mut rand::rngs::OsRng);
let merchant_identity = protocol.register_agent(
"merchant-store",
merchant_signing_key.verifying_key().to_bytes().to_vec(),
)?;
println!(" ✓ Merchant DID: {}\n", merchant_identity.did);
println!("📝 Step 4: Creating Intent Mandate (User Authorization)...");
let intent_mandate = protocol.create_intent_mandate(
&user_identity,
&merchant_identity.did,
"Purchase electronics and books from merchant store",
user_signing_key.as_bytes(),
)?;
println!(" ✓ Intent Mandate Created");
println!(" ✓ Signature Verified: {}\n", intent_mandate.verify(protocol.did_resolver())?);
println!("🛒 Step 5: Creating Shopping Cart...");
let items = vec![
CartItem::new(
"laptop-001".to_string(),
"Professional Laptop".to_string(),
1,
89999, )
.with_description("High-performance laptop for developers".to_string()),
CartItem::new(
"book-001".to_string(),
"Rust Programming Book".to_string(),
2,
3999, )
.with_description("Learn Rust programming".to_string()),
CartItem::new(
"mouse-001".to_string(),
"Wireless Mouse".to_string(),
1,
2999, ),
];
println!(" Items in cart:");
for item in &items {
println!(
" - {} x{} @ ${:.2}",
item.name,
item.quantity,
item.unit_price as f64 / 100.0
);
}
let subtotal: u64 = items.iter().map(|i| i.total_price).sum();
let tax = (subtotal as f64 * 0.08) as u64; let shipping = 999; let total = subtotal + tax + shipping;
println!(" Subtotal: ${:.2}", subtotal as f64 / 100.0);
println!(" Tax (8%): ${:.2}", tax as f64 / 100.0);
println!(" Shipping: ${:.2}", shipping as f64 / 100.0);
println!(" Total: ${:.2}\n", total as f64 / 100.0);
println!("📦 Step 6: Creating Cart Mandate...");
let cart_mandate = protocol.create_cart_mandate(
&user_identity,
items,
total,
"USD",
user_signing_key.as_bytes(),
)?;
println!(" ✓ Cart Mandate Created");
println!(" ✓ Signature Verified: {}\n", cart_mandate.verify(protocol.did_resolver())?);
println!("💳 Step 7: Creating Payment Mandate...");
let payment_mandate = protocol.create_payment_mandate(
&user_identity,
&merchant_identity.did,
total,
"USD",
"credit_card",
user_signing_key.as_bytes(),
)?;
println!(" ✓ Payment Mandate Created");
println!(" ✓ Signature Verified: {}\n", payment_mandate.verify(protocol.did_resolver())?);
println!("🔐 Step 8: Creating Complete Payment Authorization...");
let authorization = PaymentAuthorization::new(
intent_mandate,
cart_mandate,
payment_mandate,
);
println!(" ✓ Authorization Chain Created");
println!(" ✓ Chain Verified: {}", authorization.verify_chain(protocol.did_resolver())?);
println!(" ✓ Authorization Valid: {}\n", authorization.is_valid());
println!("🤝 Step 9: Setting up Multi-Agent Consensus Verification...");
let mut verifier_keys = Vec::new();
let mut verifier_dids = Vec::new();
for i in 0..5 {
let verifier_key = SigningKey::generate(&mut rand::rngs::OsRng);
let verifier_did = format!("did:ap2:verifier-{:03}", i);
protocol.register_agent(
&format!("verifier-{}", i),
verifier_key.verifying_key().to_bytes().to_vec(),
)?;
verifier_keys.push(verifier_key);
verifier_dids.push(verifier_did);
}
let verifier_nodes: Vec<VerifierNode> = verifier_dids.iter().enumerate()
.map(|(i, verifier_did)| {
VerifierNode::new(
format!("verifier-{}", i),
verifier_did.clone(),
format!("https://verifier-{}.example.com", i),
)
.with_weight(1.0)
.with_reputation(0.9 + (i as f64 * 0.02))
})
.collect();
println!(" ✓ {} verifier nodes created", verifier_nodes.len());
for (i, node) in verifier_nodes.iter().enumerate() {
println!(
" Verifier {}: {} (reputation: {:.2})",
i + 1,
node.id,
node.reputation
);
}
println!();
println!("✅ Step 10: Performing Consensus Verification...");
let result = protocol
.verify_payment_authorization(&authorization, verifier_nodes)
.await?;
println!(" 📊 Consensus Results:");
println!(" Verified: {}", result.verified);
println!(" Consensus Achieved: {}", result.consensus_achieved);
println!(" Total Verifiers: {}", result.verifier_count);
println!(" Approvals: {}", result.approval_count);
println!(" Rejections: {}", result.rejection_count);
println!(" Threshold: {:.0}%", result.threshold_percentage * 100.0);
println!(" Approval Rate: {:.1}%", (result.approval_count as f64 / result.verifier_count as f64) * 100.0);
if result.verified {
println!("\n🎉 Payment Authorization Verified Successfully!");
println!(" The payment can now be processed through the payment network.");
} else {
println!("\n❌ Payment Authorization Failed!");
println!(" Consensus was not achieved. Payment cannot proceed.");
}
println!("\n✨ AP2 Payment Flow Complete!");
Ok(())
}