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.ex
defmodule Kujira do
@moduledoc """
Documentation for `Kujira`.
"""
import Cosmos.Tx.V1beta1.Service.Stub
alias Cosmos.Tx.V1beta1.GetTxsEventRequest
alias Cosmos.Tx.V1beta1.GetTxsEventResponse
alias Cosmos.Base.Query.V1beta1.PageRequest
alias Cosmos.Tx.V1beta1.OrderBy
alias Cosmos.Tx.V1beta1.Tx
@doc """
Get transactions where the sender is `address`
"""
@spec txs_by_sender(
GRPC.Channel.t(),
String.t(),
keyword(
pagination: PageRequest.t(),
order_by: OrderBy.t(),
page: number(),
limit: number()
)
) ::
{:ok, GetTxsEventResponse} | {:error, GRPC.RPCError.t()}
def txs_by_sender(channel, address, opts \\ []) do
pagination = Keyword.get(opts, :pagination)
order_by = Keyword.get(opts, :order_by)
page = Keyword.get(opts, :page)
limit = Keyword.get(opts, :limit)
get_txs_event(
channel,
GetTxsEventRequest.new(
events: ["message.sender='#{address}'"],
pagination: pagination,
order_by: order_by,
page: page,
limit: limit
)
)
end
@doc """
Decodes an Any (eg sdk.Tx, PubKey etc to the Elixir defined type)
"""
def decode_any(%Google.Protobuf.Any{
type_url: type_url,
value: value
}) do
module = to_module(type_url)
module.decode(value)
end
defp to_module("/" <> type_url) do
parts =
type_url
|> String.split(".")
|> Enum.map(&capitalize/1)
|> Enum.join(".")
String.to_existing_atom("Elixir." <> parts)
end
defp capitalize(string) do
with <<c::utf8, rest::binary>> <- string,
do: String.upcase(<<c>>) <> rest
end
def tx_hash(%Tx{} = tx) do
tx_hash(Tx.encode(tx))
end
def tx_hash(bytes) do
Base.encode16(:crypto.hash(:sha256, bytes))
end
def decode_tx(tx) do
with {:ok, json} <- Jason.decode(tx) do
json
else
{:error, _} ->
%Tx{body: %{messages: messages} = body} = tx = Tx.decode(tx)
%{tx | body: %{body | messages: Enum.map(messages, &decode_any/1)}}
end
end
end