use crate::prelude::*;
use bitcoin::consensus::encode::VarInt;
use miniscript::miniscript::satisfy::Placeholder;
use miniscript::MiniscriptKey;
pub(crate) trait ItemSize {
fn size(&self) -> usize;
}
impl<Pk: MiniscriptKey> ItemSize for Placeholder<Pk> {
fn size(&self) -> usize {
match self {
Placeholder::Pubkey(_, size) => *size,
Placeholder::PubkeyHash(_, size) => *size,
Placeholder::EcdsaSigPk(_) | Placeholder::EcdsaSigPkHash(_) => 73,
Placeholder::SchnorrSigPk(_, _, size) | Placeholder::SchnorrSigPkHash(_, _, size) =>
size + 1, Placeholder::HashDissatisfaction
| Placeholder::Sha256Preimage(_)
| Placeholder::Hash256Preimage(_)
| Placeholder::Ripemd160Preimage(_)
| Placeholder::Hash160Preimage(_) => 33,
Placeholder::PushOne => 2, Placeholder::PushZero => 1,
Placeholder::TapScript(s) => s.len(),
Placeholder::TapControlBlock(cb) => cb.serialize().len(),
}
}
}
impl ItemSize for Vec<u8> {
fn size(&self) -> usize { self.len() }
}
pub(crate) fn witness_size<T: ItemSize>(wit: &[T]) -> usize {
wit.iter().map(T::size).sum::<usize>() + varint_len(wit.len())
}
pub(crate) fn varint_len(n: usize) -> usize { VarInt(n as u64).size() }