defmodule Stellar.TxBuild.BeginSponsoringFutureReserves do
@moduledoc """
Initiates a sponsorship.
There must be a corresponding EndSponsoringFutureReserves operation in the same transaction.
"""
import Stellar.TxBuild.Validations, only: [validate_account_id: 1, validate_optional_account: 1]
alias Stellar.TxBuild.{AccountID, OptionalAccount}
alias StellarBase.XDR.{OperationBody, OperationType, Operations.BeginSponsoringFutureReserves}
@behaviour Stellar.TxBuild.XDR
@type t :: %__MODULE__{
sponsored_id: AccountID.t(),
source_account: OptionalAccount.t()
}
defstruct [:sponsored_id, :source_account]
@impl true
def new(args, opts \\ [])
def new(args, _opts) when is_list(args) do
sponsored_id = Keyword.get(args, :sponsored_id)
source_account = Keyword.get(args, :source_account)
with {:ok, sponsored_id} <- validate_account_id({:sponsored_id, sponsored_id}),
{:ok, source_account} <- validate_optional_account({:source_account, source_account}) do
%__MODULE__{sponsored_id: sponsored_id, source_account: source_account}
end
end
def new(_args, _opts), do: {:error, :invalid_operation_attributes}
@impl true
def to_xdr(%__MODULE__{sponsored_id: sponsored_id}) do
op_type = OperationType.new(:BEGIN_SPONSORING_FUTURE_RESERVES)
sponsored_id
|> AccountID.to_xdr()
|> BeginSponsoringFutureReserves.new()
|> OperationBody.new(op_type)
end
end