defmodule BitcoinLib.Crypto.Wif do @moduledoc """ WIF Bitcoin private key format management Inspired by https://learnmeabitcoin.com/technical/wif """ alias BitcoinLib.Crypto alias BitcoinLib.Crypto.Convert @doc """ Converts a raw private key to the WIF format ## Examples iex> 0x0A8D286B11B98F6CB2585B627FF44D12059560ACD430DCFA1260EF2BD9569373 ...> |> BitcoinLib.Crypto.Wif.from_integer "KwaDo7PNi4XPMaABfSEo9rP6uviDUATAqvyjjWTcKp4fxdkVJWLe" """ @spec from_integer(integer(), integer()) :: String.t() def from_integer(value, bytes_length \\ 32) do value |> Convert.integer_to_binary(bytes_length) |> binary_to_wif end defp binary_to_wif(bitstring_private_key) do bitstring_private_key |> add_prefix |> add_compressed |> add_checksum |> Base58.encode() end defp add_prefix(key) do <<0x80>> <> key end defp add_compressed(key) do key <> <<1>> end defp add_checksum(key) do checksum = key |> Crypto.checksum_bitstring() key <> checksum end end