defmodule Circlex.Api.Core.Addresses do
@moduledoc """
API Client to the Circle Core Addresses API.
For example, to create a deposit address:
```elixir
> Circlex.Api.Core.Addresses.generate_deposit_address("USD", "ETH")
{:ok,
%{
address: "0x6a9DE7dF6a986a0398348EFB0ECD91f341547b31",
chain: "ETH",
currency: "USD"
}}
```
To get a list of deposit addresses:
```elixir
> Circlex.Api.Core.Addresses.list_deposit_addresses()
{
:ok,
[
%{address: "0x522C4caaf435FDF1822C7b6A081858344623Cf84", chain: "ETH", currency: "USD"},
%{address: "mpLQ2waXiQW6aAtnp9XMWh52R42k3QVjtU", chain: "BTC", currency: "BTC"},
%{address: "0x6a9DE7dF6a986a0398348EFB0ECD91f341547b31", chain: "ETH", currency: "USD"}
]
}
```
Or to add a recipient address:
```elixir
> Circlex.Api.Core.Addresses.add_recipient_address("0x9999999999999999999999999999999999999999", "USD", "ETH", "Nines", host: host)
{:ok,
%Circlex.Struct.Recipient{
address: "0x9999999999999999999999999999999999999999",
chain: "ETH",
currency: "USD",
description: "Nines",
id: "a033a6d8-05ae-11ed-9e62-6a1733211c00"
}}
```
Reference: https://developers.circle.com/reference/generatebusinessaccountdepositaddress
"""
import Circlex.Api.Tooling
alias Circlex.Struct.{Address, Recipient}
@doc ~S"""
Generates a new blockchain address for a wallet for a given currency/chain pair.
Reference: https://developers.circle.com/reference/generatebusinessaccountdepositaddress
## Examples
iex> host = Circlex.Test.start_server()
iex> Circlex.Api.Core.Addresses.generate_deposit_address("USD", "ETH", host: host)
{:ok,
%Circlex.Struct.Address{
address: "0x5d2e4a271103100c8dd463a3229e9fbb7e079f50",
chain: "ETH",
currency: "USD"
}}
"""
def generate_deposit_address(currency, chain, opts \\ []) do
idempotency_key = Keyword.get(opts, :idempotency_key, UUID.uuid1())
with {:ok, address} <-
api_post(
"/v1/businessAccount/wallets/addresses/deposit",
%{idempotencyKey: idempotency_key, currency: currency, chain: chain},
opts
) do
{:ok, Address.deserialize(address)}
end
end
@doc ~S"""
Get a list of deposit addresses.
Reference: https://developers.circle.com/reference/getbusinessaccountdepositaddresses
## Examples
iex> host = Circlex.Test.start_server()
iex> Circlex.Api.Core.Addresses.list_deposit_addresses(host: host)
{
:ok,
[
%{address: "0x522c4caaf435fdf1822c7b6a081858344623cf84", chain: "ETH", currency: "USD"},
%{address: "mpLQ2waXiQW6aAtnp9XMWh52R42k3QVjtU", chain: "BTC", currency: "BTC"},
%{address: "0x6a9de7df6a986a0398348efb0ecd91f341547b31", chain: "ETH", currency: "USD"}
]
}
"""
def list_deposit_addresses(opts \\ []) do
with {:ok, addresses} <- api_get("/v1/businessAccount/wallets/addresses/deposit", opts) do
{:ok,
Enum.map(addresses, fn %{
"address" => address,
"chain" => chain,
"currency" => currency
} ->
%{address: address, chain: chain, currency: currency}
end)}
end
end
@doc ~S"""
Stores an external blockchain address.
Reference: https://developers.circle.com/reference/createbusinessaccountrecipientaddress
## Examples
iex> host = Circlex.Test.start_server()
iex> Circlex.Api.Core.Addresses.add_recipient_address("0x9999999999999999999999999999999999999999", "USD", "ETH", "Nines", host: host)
{:ok,
%Circlex.Struct.Recipient{
address: "0x9999999999999999999999999999999999999999",
chain: "ETH",
currency: "USD",
description: "Nines",
id: "a033a6d8-05ae-11ed-9e62-6a1733211c00"
}}
"""
def add_recipient_address(address, currency, chain, description, opts \\ []) do
idempotency_key = Keyword.get(opts, :idempotency_key, UUID.uuid1())
case api_post(
"/v1/businessAccount/wallets/addresses/recipient",
%{
idempotencyKey: idempotency_key,
address: address,
currency: currency,
chain: chain,
description: description
},
opts
) do
{:ok,
%{
"id" => id,
"address" => address,
"chain" => chain,
"currency" => currency,
"description" => description
}} ->
{:ok,
%Recipient{
id: id,
address: address,
chain: chain,
currency: currency,
description: description
}}
end
end
@doc ~S"""
Get a list of verified recipient addresses.
Reference: https://developers.circle.com/reference/getbusinessaccountrecipientaddresses
## Examples
iex> host = Circlex.Test.start_server()
iex> Circlex.Api.Core.Addresses.list_recipient_address(host: host)
{
:ok,
[
%Circlex.Struct.Recipient{
address: "0x9dfb4f706a4747355a7ef65cd341a0289034a385",
chain: "ETH",
currency: "USD",
description: "Treasury Adaptor v1",
id: "7bfd6d2a-3682-52b5-a041-714af6913086"
},
%Circlex.Struct.Recipient{
address: "0x2eb953f992d4fa6e769fabf25d8218f21b793558",
chain: "ETH",
currency: "USD",
description: "Fireblocks Address",
id: "b2cef1b0-6c54-52b8-9d62-71b85f5b51ed"
}
]
}
"""
def list_recipient_address(opts \\ []) do
with {:ok, recipients} <- api_get("/v1/businessAccount/wallets/addresses/recipient", opts) do
{:ok,
Enum.map(recipients, fn %{
"id" => id,
"address" => address,
"chain" => chain,
"currency" => currency,
"description" => description
} ->
%Recipient{
id: id,
address: address,
chain: chain,
currency: currency,
description: description
}
end)}
end
end
end