Packages
kujira
0.1.49
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.74
0.1.73
0.1.72
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Elixir interfaces to Kujira dApps, for building indexers, APIs and bots
Current section
Files
Jump to
Current section
Files
lib/kujira/oracle.ex
defmodule Kujira.Oracle do
@moduledoc """
Utility functions for querying the on-chain oracle
"""
alias Kujira.Oracle.Query.Stub
alias Kujira.Oracle.QueryExchangeRateRequest
alias Kujira.Oracle.QueryExchangeRateResponse
alias Kujira.Oracle.QueryExchangeRatesRequest
alias Kujira.Oracle.QueryExchangeRatesResponse
@doc """
Loads the price for a specfic price from the on-chain oracle
"""
@spec load_price(GRPC.Channel.t(), any()) :: {:ok, Decimal.t()} | {:error, GRPC.RPCError.t()}
def load_price(channel, denom) do
Memoize.Cache.get_or_run(
{__MODULE__, :load_price, [denom]},
fn ->
with {:ok, %QueryExchangeRateResponse{exchange_rate: exchange_rate}} <-
Stub.exchange_rate(channel, QueryExchangeRateRequest.new(denom: denom)),
{rate, ""} <- Decimal.parse(exchange_rate) do
{:ok, Decimal.div(rate, Decimal.new(10 ** 18))}
else
err -> err
end
end
)
end
@doc """
Loads all prices from the on-chain oracle
"""
@spec load_prices(GRPC.Channel.t()) :: {:ok, map()} | {:error, GRPC.RPCError.t()}
def load_prices(channel) do
Memoize.Cache.get_or_run(
{__MODULE__, :load_prices, []},
fn ->
with {:ok, %QueryExchangeRatesResponse{exchange_rates: rates}} <-
Stub.exchange_rates(channel, QueryExchangeRatesRequest.new()),
{:ok, rates} <-
Enum.reduce(rates, {:ok, %{}}, fn
el, {:ok, acc} ->
case Decimal.parse(el.amount) do
{dec, ""} ->
{:ok, Map.put(acc, el.denom, Decimal.div(dec, Decimal.new(10 ** 18)))}
_ ->
:error
end
_, err ->
err
end) do
{:ok, rates}
else
err -> err
end
end
)
end
end