use uor_addr::cbor::{
address, address_blake3, address_keccak256, address_sha3_256, canonicalize, AddressFailure,
};
fn unhex(s: &str) -> Vec<u8> {
(0..s.len())
.step_by(2)
.map(|i| u8::from_str_radix(&s[i..i + 2], 16).unwrap())
.collect()
}
fn main() {
println!("uor-addr — CBOR realization (RFC 8949 §4.2)\n");
let cases: &[(&str, &str)] = &[
("uint 42", "182a"),
("[1, 2, 3]", "83010203"),
("unsorted map {\"b\":[2,3],\"a\":1}", "a26162820203616101"),
];
for (label, hex) in cases {
let raw = unhex(hex);
match address(&raw) {
Ok(outcome) => {
let canon = canonicalize(&raw).expect("well-formed CBOR canonicalizes");
println!(" input ({label}): {hex}");
println!(
" canonical: {}",
canon.iter().map(|b| format!("{b:02x}")).collect::<String>()
);
println!(" sha256: {}", outcome.address);
println!(
" blake3: {}",
address_blake3(&raw).unwrap().address
);
println!(
" sha3-256: {}",
address_sha3_256(&raw).unwrap().address
);
println!(
" keccak256: {}\n",
address_keccak256(&raw).unwrap().address
);
assert!(outcome.witness.verify().is_ok(), "witness must verify");
}
Err(AddressFailure::InvalidCbor) => panic!("example input must be valid CBOR"),
Err(AddressFailure::PipelineFailure) => panic!("unreachable substrate failure"),
}
}
let sorted = address(&unhex("a26161016162820203")).unwrap().address;
let unsorted = address(&unhex("a26162820203616101")).unwrap().address;
assert_eq!(
sorted, unsorted,
"RFC 8949 §4.2.1 map-key sorting must collapse key order"
);
println!("OK — every CBOR value produced its κ-label across all four σ-axes.");
}