Merge pull request #7859 from blockscout/token-total-supply-updater
Add TokenTotalSupplyUpdaterpull/7873/head
commit
62d531052f
@ -0,0 +1,69 @@ |
|||||||
|
defmodule Indexer.Fetcher.TokenTotalSupplyUpdater do |
||||||
|
@moduledoc """ |
||||||
|
Periodically updates tokens total_supply |
||||||
|
""" |
||||||
|
|
||||||
|
use GenServer |
||||||
|
|
||||||
|
alias Explorer.{Chain, Repo} |
||||||
|
alias Explorer.Chain.Token |
||||||
|
alias Explorer.Counters.AverageBlockTime |
||||||
|
alias Explorer.Token.MetadataRetriever |
||||||
|
alias Timex.Duration |
||||||
|
|
||||||
|
@default_update_interval :timer.seconds(10) |
||||||
|
|
||||||
|
def start_link(_) do |
||||||
|
GenServer.start_link(__MODULE__, :ok, name: __MODULE__) |
||||||
|
end |
||||||
|
|
||||||
|
def init(_) do |
||||||
|
schedule_next_update() |
||||||
|
|
||||||
|
{:ok, []} |
||||||
|
end |
||||||
|
|
||||||
|
def add_tokens(contract_address_hashes) do |
||||||
|
GenServer.cast(__MODULE__, {:add_tokens, contract_address_hashes}) |
||||||
|
end |
||||||
|
|
||||||
|
def handle_cast({:add_tokens, contract_address_hashes}, state) do |
||||||
|
{:noreply, Enum.uniq(List.wrap(contract_address_hashes) ++ state)} |
||||||
|
end |
||||||
|
|
||||||
|
def handle_info(:update, contract_address_hashes) do |
||||||
|
Enum.each(contract_address_hashes, &update_token/1) |
||||||
|
|
||||||
|
schedule_next_update() |
||||||
|
|
||||||
|
{:noreply, []} |
||||||
|
end |
||||||
|
|
||||||
|
defp schedule_next_update do |
||||||
|
update_interval = |
||||||
|
case AverageBlockTime.average_block_time() do |
||||||
|
{:error, :disabled} -> @default_update_interval |
||||||
|
block_time -> round(Duration.to_milliseconds(block_time)) |
||||||
|
end |
||||||
|
|
||||||
|
Process.send_after(self(), :update, update_interval) |
||||||
|
end |
||||||
|
|
||||||
|
defp update_token(nil), do: :ok |
||||||
|
|
||||||
|
defp update_token(address_hash_string) do |
||||||
|
{:ok, address_hash} = Chain.string_to_address_hash(address_hash_string) |
||||||
|
|
||||||
|
token = Repo.get_by(Token, contract_address_hash: address_hash) |
||||||
|
|
||||||
|
if token && !token.skip_metadata do |
||||||
|
token_params = MetadataRetriever.get_total_supply_of(address_hash_string) |
||||||
|
|
||||||
|
if token_params !== %{} do |
||||||
|
{:ok, _} = Chain.update_token(token, token_params) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
:ok |
||||||
|
end |
||||||
|
end |
Loading…
Reference in new issue