lib/transaction/validator/preimage.ex

defmodule BitcoinLib.Transaction.Validator.Preimage do
  @moduledoc """
  Hashes a transaction right before the signing
  """

  alias BitcoinLib.Transaction
  alias BitcoinLib.Crypto

  @four_bytes 32

  def from_transaction(transaction, sighash_type) do
    transaction
    |> Transaction.encode()
    |> append_sighash_type(sighash_type)
    |> Crypto.double_sha256()
  end

  defp append_sighash_type(data, sighash_type),
    do: <<data::bitstring, sighash_type::little-@four_bytes>>
end