defmodule BitcoinLib do @moduledoc """ High level bitcoin operations """ alias BitcoinLib.Address alias BitcoinLib.Key.{PrivateKey, PublicKey} @doc """ Creates a bitcoin private key both in raw and WIF format ## Examples iex> %{raw: _, wif: _} = BitcoinLib.generate_private_key() """ @spec generate_private_key() :: %{raw: <<_::256>>, wif: binary()} def generate_private_key do PrivateKey.generate() end @doc """ Derives a public key from a raw private key ## Examples iex> %BitcoinLib.Key.PrivateKey{key: <<0x0a8d286b11b98f6cb2585b627ff44d12059560acd430dcfa1260ef2bd9569373::256>>} ...> |> BitcoinLib.derive_public_key() %BitcoinLib.Key.PublicKey{ chain_code: nil, depth: 0, fingerprint: <<0x6ae20179::32>>, index: 0, key: <<0x020f69ef8f2feb09b29393eef514761f22636b90d8e4d3f2138b2373bd37523053::264>>, parent_fingerprint: <<0::32>>, uncompressed_key: <<0x040f69ef8f2feb09b29393eef514761f22636b90d8e4d3f2138b2373bd37523053002119e16b613619691f760eadd486315fc9e36491c7adb76998d1b903b3dd12::520>> } """ @spec derive_public_key(PrivateKey.t()) :: PublicKey.t() def derive_public_key(private_key) do PublicKey.from_private_key(private_key) end @doc """ Creates a P2PKH address from a public key ## Examples iex> %BitcoinLib.Key.PublicKey{key: <<0x020f69ef8f2feb09b29393eef514761f22636b90d8e4d3f2138b2373bd37523053::264>>} ...> |> BitcoinLib.generate_p2pkh_address() "1Ak9NVPmwCHEpsSWvM6cNRC7dsYniRmwMG" """ @spec generate_p2pkh_address(PublicKey.t()) :: binary() def generate_p2pkh_address(public_key) do public_key |> Address.from_public_key(:p2pkh) end end