use std::fmt;
#[allow(unused_imports)]
use std::str::FromStr;
mod decode;
pub use decode::*;
mod encode;
pub use encode::*;
pub const CHARSET: &[u8; 32] = b"qpzry9x8gf2tvdw0s3jn54khce6mua7l";
pub const ALLOWED_LENGTHS: [usize;8] = [20, 24, 28, 32, 40, 48, 56, 64];
fn polymod(v: &[u8]) -> u64 {
let mut c: u64 = 1;
for d in v.iter() {
let c0: u8 = (c >> 35) as u8;
c = ((c & 0x0007_FFFF_FFFF) << 5) ^ u64::from(*d);
if c0 & 0x01 != 0 { c ^= 0x0098_F2BC_8E61; }
if c0 & 0x02 != 0 { c ^= 0x0079_B76D_99E2; }
if c0 & 0x04 != 0 { c ^= 0x00F3_3E5F_B3C4; }
if c0 & 0x08 != 0 { c ^= 0x00AE_2EAB_E2A8; }
if c0 & 0x10 != 0 { c ^= 0x001E_4F43_E470; }
}
c ^ 1
}
fn expand_prefix(prefix: &str) -> Vec<u8> {
let mut ret: Vec<u8> = prefix.chars().map(|c| (c as u8) & 0x1f).collect();
ret.push(0);
ret
}
fn convert_bits(data: &[u8], inbits: u8, outbits: u8, pad: bool) -> Vec<u8> {
assert!(inbits <= 8 && outbits <= 8);
let num_bytes = (data.len() * inbits as usize + outbits as usize - 1) / outbits as usize;
let mut ret = Vec::with_capacity(num_bytes);
let mut acc: u16 = 0; let mut num: u8 = 0; let groupmask = (1 << outbits) - 1;
for d in data.iter() {
acc = (acc << inbits) | u16::from(*d);
num += inbits;
while num > outbits {
ret.push((acc >> (num - outbits)) as u8);
acc &= !(groupmask << (num - outbits));
num -= outbits;
}
}
if pad {
if num > 0 {
ret.push((acc << (outbits - num)) as u8);
}
} else {
let padding = (data.len() * inbits as usize) % outbits as usize;
if num as usize > padding {
ret.push((acc >> padding) as u8);
}
}
ret
}
#[derive(Debug, PartialEq)]
pub enum HashType {
P2PKH = 0x00,
P2SH = 0x08,
}
impl TryFrom<u8> for HashType {
type Error = DecodeError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0x00 => Ok(Self::P2PKH),
0x08 => Ok(Self::P2SH),
_ => Err(DecodeError::InvalidVersion(value)),
}
}
}