Current section
Files
Jump to
Current section
Files
lib/coinbase_pro.ex
defmodule CoinbasePro do
@moduledoc """
General API
"""
defp api_path do
Application.get_env(:coinbase_pro, :api_path, "localhost:8080")
end
defp http_client do
CoinbasePro.Http.Poison
end
@doc """
https://docs.pro.coinbase.com/?ruby#get-products
"""
def products do
(api_path() <> "/products")
|> http_client().get()
end
@doc """
https://docs.pro.coinbase.com/?ruby#get-24hr-stats
"""
def get_24h_stats(product) do
(api_path() <> "/products/" <> product <> "/stats")
|> http_client().get()
end
@doc """
https://docs.pro.coinbase.com/?ruby#list-accounts
"""
def accounts do
path = "/accounts"
headers =
signature_headers(
%{
api_key: Application.get_env(:coinbase_pro, :api_key),
api_passphrase: Application.get_env(:coinbase_pro, :api_passphrase),
secret_key: Application.get_env(:coinbase_pro, :secret_key)
},
%{path: path, body: "", timestamp: System.system_time(:second), method: "GET"}
)
(api_path() <> path)
|> http_client().get(headers)
end
@doc """
https://docs.pro.coinbase.com/?ruby#place-a-new-order
"""
def buy_btc_on(%{eur: eur_amount}) do
path = "/orders"
body =
%{
type: "market",
side: "buy",
product_id: "BTC-EUR",
funds: eur_amount
}
|> Jason.encode!()
headers =
signature_headers(
%{
api_key: Application.get_env(:coinbase_pro, :api_key),
api_passphrase: Application.get_env(:coinbase_pro, :api_passphrase),
secret_key: Application.get_env(:coinbase_pro, :secret_key)
},
%{
path: path,
body: body,
timestamp: System.system_time(:second),
method: "POST"
}
)
(api_path() <> path)
|> http_client().post(body, headers)
end
# see https://docs.pro.coinbase.com/?python#signing-a-message
def signature_headers(
%{api_key: api_key, api_passphrase: api_passphrase, secret_key: secret_key},
%{
path: path,
body: body,
timestamp: timestamp,
method: method
}
) do
method = String.upcase(method)
data = "#{timestamp}#{method}#{path}" <> body
hmac_key = :base64.decode(secret_key)
sign = :crypto.hmac(:sha256, hmac_key, data) |> :base64.encode()
[
{"CB-ACCESS-KEY", api_key},
{"CB-ACCESS-SIGN", "#{sign}"},
{"CB-ACCESS-TIMESTAMP", timestamp},
{"CB-ACCESS-PASSPHRASE", api_passphrase},
{"Content-Type", "application/json"}
]
end
end