lib/signing/script_sig.ex

defmodule BitcoinLib.Signing.ScriptSig do
  @byte 8

  @doc """
  Extracts the signature, the public key and the remaining data from a script_sig

  ## Examples
      iex> script_sig = <<0x49304602210096b0685ed376e4841443b51b183fc1bd9e8df6bce219b192d488faf8f1d58429022100a175822c319aa494f349f725654d54be5a8bf59147b02d80782abda5880f6f0a014104f0e5a53db9f85e5b2eecf677925ffe21dd1409bcfe9a0730404053599b0901e505f9f974e41c436248aa19a74dc2a85fd0f4d4d6ba40d635ccdc95458da645b3::1120>>
      ...> BitcoinLib.Signing.ScriptSig.decode(script_sig)
      %{
        signature: <<0x304602210096b0685ed376e4841443b51b183fc1bd9e8df6bce219b192d488faf8f1d58429022100a175822c319aa494f349f725654d54be5a8bf59147b02d80782abda5880f6f0a::576>>,
        public_key: <<0x04f0e5a53db9f85e5b2eecf677925ffe21dd1409bcfe9a0730404053599b0901e505f9f974e41c436248aa19a74dc2a85fd0f4d4d6ba40d635ccdc95458da645b3::520>>,
        remaining: <<>>
      }
  """
  def decode(script_sig) do
    <<signature_size::8, remaining::bitstring>> = script_sig

    signature_bit_size = (signature_size - 1) * @byte

    <<signature::bitstring-size(signature_bit_size), 1::8, _::8, public_key::bitstring-520,
      remaining::bitstring>> = remaining

    %{
      signature: signature,
      public_key: public_key,
      remaining: remaining
    }
  end
end