defmodule BitcoinLib.Transaction.Witnesses.P2wpkhWitness do
@moduledoc """
Witness section of a P2SH-P2WPKH transaction
"""
alias BitcoinLib.Signing.Psbt.CompactInteger
@witness_item_count 2
@byte 8
@doc """
Encodes an witness into a bitstring
Based on https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki#p2sh-p2wpkh
## Examples
iex> signature = <<0x3044022047ac8e878352d3ebbde1c94ce3a10d057c24175747116f8288e5d794d12d482f0220217f36a485cae903c713331d877c1f64677e3622ad4010726870540656fe9dcb01::568>>
...> public_key = <<0x03ad1d8e89212f0b92c74d23bb710c00662ad1470198ac48c43f7d6f93a2a26873::264>>
...> BitcoinLib.Transaction.Witnesses.P2wpkhWitness.encode(signature, public_key)
<<0x02473044022047ac8e878352d3ebbde1c94ce3a10d057c24175747116f8288e5d794d12d482f0220217f36a485cae903c713331d877c1f64677e3622ad4010726870540656fe9dcb012103ad1d8e89212f0b92c74d23bb710c00662ad1470198ac48c43f7d6f93a2a26873::856>>
"""
@spec encode(bitstring(), bitstring()) :: bitstring()
def encode(signature, public_key) do
# signature_bitstring = Binary.from_hex(signature)
signature_size = byte_size(signature)
encoded_signature_size = CompactInteger.encode(signature_size)
# public_key_bitstring = Binary.from_hex(public_key)
public_key_size = byte_size(public_key)
encoded_public_key_size = CompactInteger.encode(public_key_size)
<<
@witness_item_count::@byte,
encoded_signature_size::bitstring,
signature::bitstring,
encoded_public_key_size::bitstring,
public_key::bitstring
>>
end
end