lib/signing/psbt/global/xpub.ex

defmodule BitcoinLib.Signing.Psbt.Global.Xpub do
  @moduledoc """
  An xpub in a partially signed bitcoin transaction
  """

  defstruct [:fingerprint, :path_elements]

  alias BitcoinLib.Signing.Psbt.Global.Xpub

  # TODO: document
  def parse(<<fingerprint::binary-4, remaining::bitstring>>) do
    {path_elements, remaining} =
      remaining
      |> extract_path_elements([])

    {%Xpub{fingerprint: fingerprint, path_elements: Enum.reverse(path_elements)}, remaining}
  end

  defp extract_path_elements(<<>> = remaining, elements) do
    {elements, remaining}
  end

  defp extract_path_elements(<<element::little-32, remaining::bitstring>>, elements) do
    extract_path_elements(remaining, [element | elements])
  end
end