urma-runtime 0.3.0

URMA publication planning, network transports and recovery
Documentation
use crate::config;
use crate::error::{Context, Error, ensure};
use crate::transaction::transaction;
use bitcoin::{
    OutPoint, ScriptBuf, Transaction, TxOut,
    hashes::Hash,
    secp256k1::Message,
    sighash::{Prevouts, SighashCache, TapSighashType},
    taproot::{LeafVersion, TapLeafHash, TaprootSpendInfo},
};
use urma_core::envelope;

pub(crate) fn preview(
    output: TxOut,
    script: &ScriptBuf,
    info: &TaprootSpendInfo,
) -> Result<Transaction, Error> {
    let mut reveal = transaction(OutPoint::null(), output);
    reveal.input[0].witness = envelope::witness(&[0; 64], script, info)?;
    ensure!(
        reveal.weight().to_wu() <= config::STANDARD_TX_WEIGHT,
        "reveal exceeds standard transaction weight"
    );
    Ok(reveal)
}

pub(crate) fn fee(reveal: &Transaction, rate: u64) -> Result<u64, Error> {
    u64::try_from(reveal.vsize())?
        .checked_mul(rate)
        .context("reveal fee overflow")
}

pub(crate) fn digest(
    reveal: &Transaction,
    previous: &TxOut,
    script: &ScriptBuf,
) -> Result<Message, Error> {
    let hash = SighashCache::new(reveal).taproot_script_spend_signature_hash(
        0,
        &Prevouts::All(std::slice::from_ref(previous)),
        TapLeafHash::from_script(script, LeafVersion::TapScript),
        TapSighashType::Default,
    )?;
    Ok(Message::from_digest(hash.to_byte_array()))
}