Packages
kujira
0.1.67
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/invalidator.ex
defmodule Kujira.Invalidator do
alias Phoenix.PubSub
use GenServer
require Logger
@impl true
def init(opts) do
PubSub.subscribe(opts[:pubsub], "tendermint/event/Tx")
PubSub.subscribe(opts[:pubsub], "tendermint/event/NewBlockHeader")
{:ok, opts}
end
def subscriptions() do
[
"message.action='/cosmwasm.wasm.v1.MsgExecuteContract'",
# This required to catch blocks that the revenue converter trades in EndBlock
"wasm-trade._contract_address EXISTS"
]
end
def start_link(default) do
GenServer.start_link(__MODULE__, default)
end
@impl true
def handle_info(%{TxResult: %{result: %{events: events}}}, state) do
Enum.flat_map(events, &scan_event/1)
|> Enum.uniq()
|> Enum.map(&invalidate/1)
{:noreply, state}
end
def handle_info(
%{result_end_block: %{events: events}},
state
) do
Enum.flat_map(events, &scan_event/1)
|> Enum.uniq()
|> Enum.map(&invalidate/1)
{:noreply, state}
end
defp scan_event(%{attributes: attributes}) do
scan_attributes(attributes)
end
defp scan_attributes(attributes, collection \\ [])
defp scan_attributes(
[
%{key: "_contract_address", value: value}
| rest
],
collection
) do
# Here we can just invalidate the address for all protocols.
# Only the one where it actually matches the protocol will be affected
scan_attributes(rest, [
{Kujira.Contract, :query_state_all, [value]},
{Kujira.Contract, :query_state_smart, [value, :_]},
{Kujira.Bow, :load_pool, [value]} | collection
])
end
defp scan_attributes([_ | rest], collection), do: scan_attributes(rest, collection)
defp scan_attributes([], collection), do: collection
defp invalidate({module, function, args}) do
Logger.debug("#{__MODULE__} invalidating #{module}.#{function} #{Enum.join(args, ",")}")
Memoize.invalidate(module, function, args)
end
end