defmodule Stellar.TxBuild.CreateAccount do
@moduledoc """
Creates and funds a new account with the specified starting balance.
"""
import Stellar.TxBuild.Validations,
only: [validate_account_id: 1, validate_amount: 1, validate_optional_account: 1]
alias Stellar.TxBuild.{AccountID, Amount, OptionalAccount}
alias StellarBase.XDR.{OperationBody, OperationType, Operations.CreateAccount}
@behaviour Stellar.TxBuild.XDR
@type t :: %__MODULE__{
destination: AccountID.t(),
starting_balance: Amount.t(),
source_account: OptionalAccount.t()
}
defstruct [:destination, :starting_balance, :source_account]
@impl true
def new(args, opts \\ [])
def new(args, _opts) when is_list(args) do
destination = Keyword.get(args, :destination)
starting_balance = Keyword.get(args, :starting_balance)
source_account = Keyword.get(args, :source_account)
with {:ok, destination} <- validate_account_id({:destination, destination}),
{:ok, starting_balance} <- validate_amount({:starting_balance, starting_balance}),
{:ok, source_account} <- validate_optional_account({:source_account, source_account}) do
%__MODULE__{
destination: destination,
starting_balance: starting_balance,
source_account: source_account
}
end
end
def new(_args, _opts), do: {:error, :invalid_operation_attributes}
@impl true
def to_xdr(%__MODULE__{destination: destination, starting_balance: starting_balance}) do
op_type = OperationType.new(:CREATE_ACCOUNT)
destination = AccountID.to_xdr(destination)
amount = Amount.to_xdr(starting_balance)
destination
|> CreateAccount.new(amount)
|> OperationBody.new(op_type)
end
end