use mudra::proof::ecdsa;
use mudra::{claim, cosmos, seed};
use sha2::{Digest, Sha256};
const MNEMONIC: &str =
"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
const PUBKEY: &str = "024f4e2ad99c34d60b9ba6283c9431a8418af8673212961f97a77b6377fcd05b62";
const PUSSY_ADDR: &str = "pussy19rl4cm2hmr8afy4kldpxz3fka4jguq0a4l8rzm";
fn hex(b: &[u8]) -> String {
b.iter().map(|x| format!("{x:02x}")).collect()
}
#[test]
fn abandon_mnemonic_derives_the_verified_pussy_account() {
let key = seed::cosmos_key(MNEMONIC, "").unwrap();
let pubkey = cosmos::compressed(key.verifying_key());
assert_eq!(hex(&pubkey), PUBKEY, "HD-derived pubkey matches independent derivation");
assert_eq!(cosmos::address(&pubkey, cosmos::PUSSY).unwrap(), PUSSY_ADDR);
}
#[test]
fn full_bridge_round_trips() {
let key = seed::cosmos_key(MNEMONIC, "").unwrap();
let pubkey = cosmos::compressed(key.verifying_key());
let neuron = claim::neuron_of(&pubkey);
let c = claim::create(&key, cosmos::PUSSY, neuron).unwrap();
assert_eq!(c.address, PUSSY_ADDR);
assert!(claim::verify(&c, cosmos::PUSSY));
}
#[test]
fn in_stack_ecdsa_verifies_a_real_claim() {
let key = seed::cosmos_key(MNEMONIC, "").unwrap();
let pubkey = cosmos::compressed(key.verifying_key());
let neuron = claim::neuron_of(&pubkey);
let c = claim::create(&key, cosmos::PUSSY, neuron).unwrap();
let doc = claim::adr036_doc(&c.address, &claim::bind_message(&c.neuron));
let z: [u8; 32] = Sha256::digest(doc.as_bytes()).into();
let mut r = [0u8; 32];
let mut s = [0u8; 32];
r.copy_from_slice(&c.signature[..32]);
s.copy_from_slice(&c.signature[32..]);
assert!(ecdsa::verify(&c.pubkey, &r, &s, &z), "in-stack ECDSA agrees with the native claim");
let forged_doc = claim::adr036_doc(&c.address, &claim::bind_message(&[0xFFu8; 32]));
let z_forged: [u8; 32] = Sha256::digest(forged_doc.as_bytes()).into();
assert!(!ecdsa::verify(&c.pubkey, &r, &s, &z_forged), "forged binding rejected");
}