defmodule BitcoinLib.Key.PublicKey.Address do @moduledoc """ Converts public keys into Bitcoin addresses of different formats """ alias BitcoinLib.Key.PublicKey alias BitcoinLib.Key.PublicKey.Address.{P2PKH, P2SH, Bech32} @doc """ Turns a public key into an address of the specified format ## Examples iex> %BitcoinLib.Key.PublicKey{ ...> key: <<0x0343B337DEC65A47B3362C9620A6E6FF39A1DDFA908ABAB1666C8A30A3F8A7CCCC::264>> ...> } ...> |> BitcoinLib.Key.PublicKey.Address.from_public_key(:bech32, :mainnet) "bc1qa5gyew808tdta3wjh6qh3jvcglukjsnfg0qx4u" """ @spec from_public_key(%PublicKey{}, :p2pkh | :p2sh | :bech32, :mainnet | :testnet) :: binary() def from_public_key(%PublicKey{} = public_key, :p2pkh, :mainnet), do: P2PKH.from_public_key(public_key) def from_public_key(%PublicKey{} = public_key, :p2pkh, :testnet), do: P2PKH.from_public_key(public_key, :testnet) def from_public_key(%PublicKey{} = public_key, :p2sh, :mainnet), do: P2SH.from_public_key(public_key) def from_public_key(%PublicKey{} = public_key, :p2sh, :testnet), do: P2SH.from_public_key(public_key, :testnet) def from_public_key(%PublicKey{} = public_key, :bech32, :mainnet), do: Bech32.from_public_key(public_key) def from_public_key(%PublicKey{} = public_key, :bech32, :testnet), do: Bech32.from_public_key(public_key, :testnet) end