pub const ALPHABET: [u8; 58] = *b"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
mod decode;
mod encode;
mod simd;
pub use decode::DecodeError;
pub use decode::decode;
pub use decode::decode_full;
pub use encode::encode;
#[cfg(feature = "simd")]
pub use simd::{divmod_batch, horner_batch};
#[cfg(test)]
mod tests {
use super::*;
use hex_literal::hex;
const CORPUS: &[(&[u8], &str)] = &[
(b"", ""),
(b"\x00", "1"),
(b"\x00\x00", "11"),
(b"hello", "Cn8eVZg"),
(
&hex!("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"),
"111114VYJtj3yEDffZem7N3PkK563wkLZZ8RjKzcfY",
),
(
&hex!("00759d6677091e973b9e9d99f19c68fbf43e3f05f9"),
"12e3A9pcaDSMffCV3iBuhipLAGczU",
),
(
&hex!("a1b2c3d4e5f67890123456789abcdef0123456789abcdef0123456789abcdef0"),
"BtCjvJYNhqehX2sbzvBNrbkCYp2qfc6AepXfK1JGnELw",
),
];
#[test]
fn roundtrip_no_checksum() {
for (bytes, encoded) in CORPUS {
let enc = encode(bytes);
assert_eq!(enc, *encoded, "Encode fail: {:?}", bytes);
let dec = decode(&enc).unwrap();
assert_eq!(dec, *bytes, "Decode fail: {}", enc);
}
}
#[test]
fn roundtrip_with_checksum() {
let addr_cases: &[(&[u8], &str)] = &[(
&hex!("00759d6677091e973b9e9d99f19c68fbf43e3f05f9"),
"1BitcoinEaterAddressDontSendf59kuE",
)];
for (payload, addr) in addr_cases {
let enc_raw = encode(payload);
assert_ne!(enc_raw, *addr);
let dec = decode_full(addr, true).unwrap();
assert_eq!(dec, *payload, "Checksum decode fail: {}", addr);
}
}
#[test]
fn invalid_cases() {
assert!(matches!(
decode("invalid!"),
Err(DecodeError::InvalidChar(4))
));
let invalid_addr = "1BitcoinEaterAddressDontSendf59kuF";
assert!(matches!(
decode_full(invalid_addr, true),
Err(DecodeError::Checksum)
));
assert!(matches!(
decode_full("12", true),
Err(DecodeError::InvalidLength)
));
}
#[test]
fn simd_smoke() {
let bytes = b"hello world bsv58 test";
let enc = encode(bytes);
let dec = decode(&enc).unwrap();
assert_eq!(dec, bytes);
}
#[test]
fn large_payload() {
let pubkey = vec![0x42u8; 50]; let enc = encode(&pubkey);
let dec = decode(&enc).unwrap();
assert_eq!(dec, pubkey);
assert!(enc.len() >= 68); }
}