defmodule Circlex.Emulator.Actor.TransferActor do @moduledoc """ Handles a transfer, either in or out, specifically handling: ```md 1. Blockchain -> Wallet 2. Wallet -> Wallet 3. Wallet -> Blockchain ``` """ use GenServer alias Circlex.Emulator alias Circlex.Emulator.Notifier alias Circlex.Emulator.State alias Circlex.Emulator.State.TransferState alias Circlex.Emulator.Logic.TransferLogic def start_link(transfer_id) do GenServer.start_link( __MODULE__, {transfer_id, Process.get(:state_pid), Process.get(:signer_proc)} ) end @impl true def init({transfer_id, state_pid, signer_proc}) do Process.put(:state_pid, state_pid) if not is_nil(signer_proc), do: Process.put(:signer_proc, signer_proc) Notifier.notify_transfer(transfer_id) Process.send_after(self(), :accept_transfer, Emulator.action_delay()) {:ok, %{transfer_id: transfer_id}} end @impl true def handle_info(:accept_transfer, state = %{transfer_id: transfer_id}) do # TODO: Maybe check transfer tx id? {:ok, transfer} = TransferState.get_transfer(transfer_id) case transfer.status do "pending" -> # We've accepted the transfer in, set state and send notification State.update_st(fn st -> st |> TransferLogic.process_transfer(transfer.id) end) Notifier.notify_transfer(transfer.id) end {:noreply, state} end end