defmodule Stellar.TxBuild.BaseFee do
@moduledoc """
`BaseFee` struct definition.
"""
alias StellarBase.XDR.UInt32
@behaviour Stellar.TxBuild.XDR
@type t :: %__MODULE__{fee: non_neg_integer(), multiplier: non_neg_integer()}
defstruct [:fee, multiplier: 0]
@impl true
def new(fee \\ nil, opts \\ [])
def new(nil, _opts), do: %__MODULE__{fee: base_fee()}
def new(fee, _opts) when is_integer(fee), do: %__MODULE__{fee: fee}
def new(_fee, _opts), do: {:error, :invalid_fee}
@impl true
def to_xdr(%__MODULE__{fee: fee, multiplier: 0}), do: UInt32.new(fee)
def to_xdr(%__MODULE__{fee: fee, multiplier: multiplier}), do: UInt32.new(fee * multiplier)
@spec increment(base_fee :: t(), times :: non_neg_integer()) :: t()
def increment(base_fee, times \\ 1)
def increment(%__MODULE__{multiplier: multiplier} = base_fee, times)
when is_integer(times) and times >= 0 do
%{base_fee | multiplier: multiplier + times}
end
def increment(_base_fee, _times), do: {:error, :invalid_fee}
@spec base_fee() :: non_neg_integer()
defp base_fee, do: 100
end