lib/tx_build/spec.ex

defmodule Stellar.TxBuild.Spec do
  @moduledoc """
  Defines contracts to build a Stellar transaction.
  """

  alias Stellar.TxBuild

  alias Stellar.TxBuild.{
    Account,
    AccountMerge,
    BaseFee,
    BumpSequence,
    BeginSponsoringFutureReserves,
    ChangeTrust,
    Clawback,
    ClawbackClaimableBalance,
    CreateAccount,
    CreatePassiveSellOffer,
    EndSponsoringFutureReserves,
    ManageData,
    ManageSellOffer,
    ManageBuyOffer,
    Memo,
    Payment,
    PathPaymentStrictSend,
    PathPaymentStrictReceive,
    SequenceNumber,
    SetOptions,
    Signature,
    TimeBounds,
    Preconditions
  }

  @type opts :: Keyword.t()
  @type account :: Account.t()
  @type sequence_number :: SequenceNumber.t()
  @type memo :: Memo.t()
  @type base_fee :: BaseFee.t()
  @type time_bounds :: TimeBounds.t()
  @type preconditions :: Preconditions.t()
  @type signatures :: Signature.t() | list(Signature.t())
  @type operation ::
          AccountMerge.t()
          | BumpSequence.t()
          | BeginSponsoringFutureReserves.t()
          | ChangeTrust.t()
          | Clawback.t()
          | ClawbackClaimableBalance.t()
          | CreateAccount.t()
          | CreatePassiveSellOffer.t()
          | EndSponsoringFutureReserves.t()
          | ManageData.t()
          | ManageSellOffer.t()
          | ManageBuyOffer.t()
          | Payment.t()
          | PathPaymentStrictSend.t()
          | PathPaymentStrictReceive.t()
          | SetOptions.t()
  @type operations :: list(operation())
  @type envelope :: String.t()
  @type hash :: String.t()
  @type tx_build :: {:ok, TxBuild.t()} | {:error, atom()}
  @type tx_envelope :: {:ok, envelope()} | {:error, atom()}
  @type tx_hash :: {:ok, hash()} | {:error, atom()}

  @callback new(account(), opts()) :: tx_build()
  @callback add_memo(tx_build(), memo()) :: tx_build()
  @callback set_time_bounds(tx_build(), time_bounds()) :: tx_build()
  @callback set_preconditions(tx_build(), preconditions()) :: tx_build()
  @callback set_base_fee(tx_build(), base_fee()) :: tx_build()
  @callback set_sequence_number(tx_build(), sequence_number()) :: tx_build()
  @callback add_operation(tx_build(), operation()) :: tx_build()
  @callback add_operations(tx_build(), operations()) :: tx_build()
  @callback sign(tx_build(), signatures()) :: tx_build()
  @callback build(tx_build()) :: tx_build()
  @callback envelope(tx_build()) :: tx_envelope()
  @callback sign_envelope(envelope(), signatures()) :: tx_envelope()
  @callback hash(tx_build()) :: tx_hash()

  @optional_callbacks add_memo: 2,
                      set_base_fee: 2,
                      set_time_bounds: 2,
                      set_preconditions: 2,
                      set_sequence_number: 2
end