lib/auth.ex

defmodule ExDeltaExchange.Auth do
  @type api_secret :: ExDeltaExchange.Credentials.api_secret()

  @spec timestamp :: integer
  def timestamp, do: DateTime.utc_now() |> DateTime.to_unix(:second)

  @spec sign(String.t(), integer, String.t(), String.t(), String.t(), api_secret) :: String.t()
  def sign(verb, ts, path, query_string, request_body, api_secret) do
    payload = "#{verb}#{ts}#{path}#{query_string}#{request_body}"

    :hmac
    |> :crypto.mac(:sha256, api_secret, payload)
    |> Base.encode16(case: :lower)
  end
end