defmodule BitcoinLib.Key.PublicKeyHash do @moduledoc """ Bitcoin Public Key Hash module """ alias BitcoinLib.Crypto alias BitcoinLib.Key.{PublicKey, Address} @doc """ Extract a public key hash from a bitcoin public key Inspired by https://learnmeabitcoin.com/technical/public-key-hash ## Examples iex> %BitcoinLib.Key.PublicKey{ ...> key: <<0x02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737::264>> ...> } ...> |> BitcoinLib.Key.PublicKeyHash.from_public_key() <<0x93ce48570b55c42c2af816aeaba06cfee1224fae::160>> """ @spec from_public_key(%PublicKey{}) :: bitstring() def from_public_key(%PublicKey{key: key}) do key |> Crypto.hash160() end @doc """ Extracts the public key hash from an address, and make sure the checkum is ok ## Examples iex> address = "mwYKDe7uJcgqyVHJAPURddeZvM5zBVQj5L" ...> BitcoinLib.Key.PublicKeyHash.from_address(address) {:ok, <<0xafc3e518577316386188af748a816cd14ce333f2::160>>, :p2pkh} """ @spec from_address(binary()) :: {:ok, bitstring(), atom()} | {:error, binary()} def from_address(address) do address |> Address.to_public_key_hash() end end