Packages
kujira
0.1.27
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. Default cache 200ms
Clear wth Kujira.Oracle.invalidate(:load_price, denom)
"""
@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,
expires_in: 200
)
end
@doc """
Loads all prices from the on-chain oracle. Default cache 200ms
Clear wth Kujira.Oracle.invalidate(:load_prices)
"""
@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,
expires_in: 200
)
end
def invalidate(:load_price),
do: Memoize.invalidate(__MODULE__, :load_price, [])
def invalidate(:load_prices, denom),
do: Memoize.invalidate(__MODULE__, :load_prices, [denom])
end