defmodule Circlex.Emulator.Api.Accounts.WalletsApi do @moduledoc """ Mounted under `/v1/wallets`. """ use Circlex.Emulator.Api alias Circlex.Emulator.State.WalletState alias Circlex.Struct.{Address, Wallet} # https://developers.circle.com/reference/accounts-wallets-get @route "/" def list_wallets(%{}) do {:ok, Enum.map(WalletState.all_wallets(), &Wallet.serialize(&1, false))} end # https://developers.circle.com/reference/accounts-wallets-create @route path: "/", method: :post def create_wallet(%{idempotencyKey: idempotency_key, description: description}) do # TODO: Check idempotency key with {:ok, wallet} <- WalletState.new_wallet(:end_user_wallet, description) do :ok = WalletState.add_wallet(wallet) {:ok, Wallet.serialize(wallet, false)} end end # https://developers.circle.com/reference/accounts-wallets-get-id @route "/:wallet_id" def get_wallet(%{wallet_id: wallet_id}) do with {:ok, wallet} <- WalletState.get_wallet(wallet_id) do {:ok, Wallet.serialize(wallet, false)} end end # https://developers.circle.com/reference/accounts-wallets-addresses-create @route path: "/:wallet_id/addresses", method: :post def generate_blockchain_address(%{ wallet_id: wallet_id, idempotencyKey: idempotency_key, currency: currency, chain: chain }) do # TODO: Check idempotency key with {:ok, address} <- WalletState.new_address(chain, currency) do :ok = WalletState.add_address_to_wallet(wallet_id, address) {:ok, Address.serialize(address, false)} end end # https://developers.circle.com/reference/accounts-wallets-addresses-get @route "/:wallet_id/addresses" def list_addresses(%{wallet_id: wallet_id}) do with {:ok, wallet} <- WalletState.get_wallet(wallet_id) do {:ok, Enum.map(wallet.addresses, fn address -> Address.serialize(address, false) end)} end end end