defmodule Bitcoinex.Network do @moduledoc """ Includes network-specific paramater options. Supported networks include mainnet, testnet3, and regtest. """ @enforce_keys [ :name, :hrp_segwit_prefix, :p2pkh_version_decimal_prefix, :p2sh_version_decimal_prefix ] defstruct [ :name, :hrp_segwit_prefix, :p2pkh_version_decimal_prefix, :p2sh_version_decimal_prefix ] @type t() :: %__MODULE__{ name: atom, hrp_segwit_prefix: String.t(), p2pkh_version_decimal_prefix: integer(), p2sh_version_decimal_prefix: integer() } @type network_name :: :mainnet | :testnet | :regtest @doc """ Returns a list of supported networks. """ def supported_networks() do [ mainnet(), testnet(), regtest() ] end def mainnet do %__MODULE__{ name: :mainnet, hrp_segwit_prefix: "bc", p2pkh_version_decimal_prefix: 0, p2sh_version_decimal_prefix: 5 } end def testnet do %__MODULE__{ name: :testnet, hrp_segwit_prefix: "tb", p2pkh_version_decimal_prefix: 111, p2sh_version_decimal_prefix: 196 } end def regtest do %__MODULE__{ name: :regtest, hrp_segwit_prefix: "bcrt", p2pkh_version_decimal_prefix: 111, p2sh_version_decimal_prefix: 196 } end @spec get_network(network_name) :: t() def get_network(:mainnet) do mainnet() end def get_network(:testnet) do testnet() end def get_network(:regtest) do regtest() end end