defmodule Stellar.KeyPair.Spec do @moduledoc """ Defines contracts to generate, validate and encode/decode Stellar KeyPairs. This `behaviour` allows you to use any crypto package of your choice. The default is Ed25519. """ @type public_key :: String.t() @type secret_seed :: String.t() @type error :: {:error, atom()} @type validation :: :ok | error() @callback random() :: {public_key(), secret_seed()} @callback from_secret_seed(secret_seed()) :: {public_key(), secret_seed()} @callback from_raw_public_key(binary()) :: public_key() @callback from_raw_muxed_account(binary()) :: public_key() @callback raw_public_key(public_key()) :: binary() @callback raw_muxed_account(public_key()) :: binary() @callback raw_secret_seed(public_key()) :: binary() @callback validate_public_key(public_key()) :: validation() @callback validate_muxed_account(public_key()) :: validation() @callback validate_secret_seed(public_key()) :: validation() @callback sign(binary(), secret_seed()) :: binary() | error() @optional_callbacks from_raw_public_key: 1, from_raw_muxed_account: 1, validate_public_key: 1, validate_muxed_account: 1, validate_secret_seed: 1 end