use codex32::Codex32String;
use ms_codec::{decode, encode, Payload, Tag};
const BIP93_VECTOR_4: &str =
"ms10leetsllhdmn9m42vcsamx24zrxgs3qrl7ahwvhw4fnzrhve25gvezzyqqtum9pgv99ycma";
const BIP93_VECTOR_4_PAYLOAD_HEX: &str =
"ffeeddccbbaa99887766554433221100ffeeddccbbaa99887766554433221100";
#[test]
fn bip93_vector_4_payload_extracts_via_upstream() {
let c = Codex32String::from_string(BIP93_VECTOR_4.to_string())
.expect("BIP-93 §93.4 must parse via rust-codex32");
let data = c.parts().data();
let expected = hex_decode(BIP93_VECTOR_4_PAYLOAD_HEX);
assert_eq!(
data, expected,
"BIP-93 §93.4 payload bytes drifted; rust-codex32 bit-packing changed?"
);
}
#[test]
fn bip93_vector_4_payload_round_trips_as_ms_codec_entr() {
let c = Codex32String::from_string(BIP93_VECTOR_4.to_string()).unwrap();
let payload_bytes: Vec<u8> = c.parts().data();
assert_eq!(payload_bytes.len(), 32, "expected 32-B entr-bucket payload");
let s = encode(Tag::ENTR, &Payload::Entr(payload_bytes.clone()))
.expect("re-encode of BIP-93 §93.4 payload as entr must succeed");
let (tag, recovered) = decode(&s).expect("ms-codec must decode its own output");
assert_eq!(tag, Tag::ENTR);
let Payload::Entr(recovered_bytes) = recovered else {
panic!("expected Payload::Entr after decode");
};
assert_eq!(recovered_bytes, payload_bytes);
let _c2 = Codex32String::from_string(s.clone())
.expect("ms-codec output must be parseable by upstream rust-codex32");
}
fn hex_decode(s: &str) -> Vec<u8> {
(0..s.len())
.step_by(2)
.map(|i| u8::from_str_radix(&s[i..i + 2], 16).unwrap())
.collect()
}