use falcon_multisig::{KeyPair, SigningSession, ThresholdConfig};
fn main() {
println!("falcon-multisig — Cross-chain bridge validator example (4-of-7)");
println!("{}", "=".repeat(65));
let total = 7;
let required = 4;
println!("\n[1] Generating {total} validator keypairs...");
let keypairs: Vec<KeyPair> = (0..total).map(|_| KeyPair::generate()).collect();
let public_keys: Vec<_> = keypairs.iter().map(|kp| kp.public_key().clone()).collect();
let config = ThresholdConfig::new(required, public_keys).unwrap();
println!(" Policy : {}", config.policy());
println!(" Bridge ID: {}", config.address());
let message = b"BRIDGE:src=1:dst=42161:asset=ETH:amount=5000000:nonce=9912:receiver=0xABCD";
println!("\n[2] Cross-chain message (hex):");
println!(" {}", hex::encode(message));
println!("\n[3] Collecting validator signatures...");
let mut session = SigningSession::new(&config, message);
let participating = [0usize, 1, 3, 5];
for &i in &participating {
let sig = keypairs[i].sign(message);
session.add_signature(i, sig).unwrap();
let (have, need) = session.progress();
println!(" Validator {i} signed — progress: {have}/{need}");
}
println!("\n[4] Verifying supermajority...");
match session.verify() {
Ok(true) => {
println!(" Supermajority reached: {}/{}", required, total);
println!(" Cross-chain transfer authorised.");
println!(" Active validators: {:?}", session.signed_indices());
}
Err(e) => {
eprintln!(" Verification error: {e}");
std::process::exit(1);
}
Ok(false) => unreachable!(),
}
}