diff --git a/CHANGELOG.md b/CHANGELOG.md index aa7f4b23d6..4dbd72f807 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,12 +2,18 @@ ### Features +- [#1739](https://github.com/poanetwork/blockscout/pull/1739) - highlight decompiled source code + ### Fixes -- [#1727](https://github.com/poanetwork/blockscout/pull/1727) - add logs pagination in rpc api + - [#1724](https://github.com/poanetwork/blockscout/pull/1724) - Remove internal tx and token balance fetching from realtime fetcher + - [#1727](https://github.com/poanetwork/blockscout/pull/1727) - add logs pagination in rpc api + - [#1740](https://github.com/poanetwork/blockscout/pull/1740) - fix empty block time ### Chore + - [#1718](https://github.com/poanetwork/blockscout/pull/1718) - Flatten indexer module hierarchy and supervisor tree + ## 1.3.9-beta diff --git a/apps/block_scout_web/assets/css/_code.scss b/apps/block_scout_web/assets/css/_code.scss index 2676913146..429ddc879e 100644 --- a/apps/block_scout_web/assets/css/_code.scss +++ b/apps/block_scout_web/assets/css/_code.scss @@ -6,6 +6,22 @@ pre { white-space: pre-wrap; } +.pre-decompiled code { + white-space: pre-wrap; + counter-increment: line; +} + +.pre-decompiled code::before { + content: counter(line); + display: inline-block; + width: 2.5em; /* Fixed width */ + border-right: 1px solid #ddd; + padding: 0 .5em; + margin-right: .5em; + color: #888; + -webkit-user-select: none; +} + .pre-scrollable-shorty { max-height: $pre-scrollable-max-height / 7; } diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_coin_balance_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_coin_balance_controller.ex index 0c837ab45f..312edffcca 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_coin_balance_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_coin_balance_controller.ex @@ -11,7 +11,7 @@ defmodule BlockScoutWeb.AddressCoinBalanceController do alias BlockScoutWeb.AddressCoinBalanceView alias Explorer.{Chain, Market} alias Explorer.ExchangeRates.Token - alias Indexer.CoinBalance.OnDemandFetcher + alias Indexer.Fetcher.CoinBalanceOnDemand alias Phoenix.View def index(conn, %{"address_id" => address_hash_string, "type" => "JSON"} = params) do @@ -62,7 +62,7 @@ defmodule BlockScoutWeb.AddressCoinBalanceController do {:ok, address} <- Chain.hash_to_address(address_hash) do render(conn, "index.html", address: address, - coin_balance_status: OnDemandFetcher.trigger_fetch(address), + coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address), exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(), transaction_count: transaction_count(address), validation_count: validation_count(address), diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_controller.ex index f3f0c8655b..34238a018d 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_controller.ex @@ -5,7 +5,7 @@ defmodule BlockScoutWeb.AddressContractController do alias Explorer.{Chain, Market} alias Explorer.ExchangeRates.Token - alias Indexer.CoinBalance.OnDemandFetcher + alias Indexer.Fetcher.CoinBalanceOnDemand def index(conn, %{"address_id" => address_hash_string}) do with {:ok, address_hash} <- Chain.string_to_address_hash(address_hash_string), @@ -14,7 +14,7 @@ defmodule BlockScoutWeb.AddressContractController do conn, "index.html", address: address, - coin_balance_status: OnDemandFetcher.trigger_fetch(address), + coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address), exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(), transaction_count: transaction_count(address), validation_count: validation_count(address) diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_decompiled_contract_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_decompiled_contract_controller.ex index b0ae0e3d4d..ddee462ba2 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_decompiled_contract_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_decompiled_contract_controller.ex @@ -5,7 +5,7 @@ defmodule BlockScoutWeb.AddressDecompiledContractController do alias Explorer.{Chain, Market} alias Explorer.ExchangeRates.Token - alias Indexer.CoinBalance.OnDemandFetcher + alias Indexer.Fetcher.CoinBalanceOnDemand def index(conn, %{"address_id" => address_hash_string}) do with {:ok, address_hash} <- Chain.string_to_address_hash(address_hash_string), @@ -14,7 +14,7 @@ defmodule BlockScoutWeb.AddressDecompiledContractController do conn, "index.html", address: address, - coin_balance_status: OnDemandFetcher.trigger_fetch(address), + coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address), exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(), transaction_count: transaction_count(address), validation_count: validation_count(address) diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_internal_transaction_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_internal_transaction_controller.ex index 5163e57795..c4f9b11c3b 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_internal_transaction_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_internal_transaction_controller.ex @@ -11,7 +11,7 @@ defmodule BlockScoutWeb.AddressInternalTransactionController do alias BlockScoutWeb.InternalTransactionView alias Explorer.{Chain, Market} alias Explorer.ExchangeRates.Token - alias Indexer.CoinBalance.OnDemandFetcher + alias Indexer.Fetcher.CoinBalanceOnDemand alias Phoenix.View def index(conn, %{"address_id" => address_hash_string, "type" => "JSON"} = params) do @@ -67,7 +67,7 @@ defmodule BlockScoutWeb.AddressInternalTransactionController do conn, "index.html", address: address, - coin_balance_status: OnDemandFetcher.trigger_fetch(address), + coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address), current_path: current_path(conn), exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(), filter: params["filter"], diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_read_contract_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_read_contract_controller.ex index adf5febf78..a9a30cc0d0 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_read_contract_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_read_contract_controller.ex @@ -10,7 +10,7 @@ defmodule BlockScoutWeb.AddressReadContractController do alias Explorer.{Chain, Market} alias Explorer.ExchangeRates.Token - alias Indexer.CoinBalance.OnDemandFetcher + alias Indexer.Fetcher.CoinBalanceOnDemand import BlockScoutWeb.AddressController, only: [transaction_count: 1, validation_count: 1] @@ -21,7 +21,7 @@ defmodule BlockScoutWeb.AddressReadContractController do conn, "index.html", address: address, - coin_balance_status: OnDemandFetcher.trigger_fetch(address), + coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address), exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(), transaction_count: transaction_count(address), validation_count: validation_count(address) diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_token_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_token_controller.ex index 7023cbca76..77db1b363f 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_token_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_token_controller.ex @@ -3,7 +3,7 @@ defmodule BlockScoutWeb.AddressTokenController do alias Explorer.{Chain, Market} alias Explorer.ExchangeRates.Token - alias Indexer.CoinBalance.OnDemandFetcher + alias Indexer.Fetcher.CoinBalanceOnDemand import BlockScoutWeb.AddressController, only: [transaction_count: 1, validation_count: 1] import BlockScoutWeb.Chain, only: [next_page_params: 3, paging_options: 1, split_list_by_page: 1] @@ -18,7 +18,7 @@ defmodule BlockScoutWeb.AddressTokenController do conn, "index.html", address: address, - coin_balance_status: OnDemandFetcher.trigger_fetch(address), + coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address), exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(), transaction_count: transaction_count(address), validation_count: validation_count(address), diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_token_transfer_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_token_transfer_controller.ex index 40c2131bfd..2a1e47b295 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_token_transfer_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_token_transfer_controller.ex @@ -4,7 +4,7 @@ defmodule BlockScoutWeb.AddressTokenTransferController do alias BlockScoutWeb.TransactionView alias Explorer.ExchangeRates.Token alias Explorer.{Chain, Market} - alias Indexer.CoinBalance.OnDemandFetcher + alias Indexer.Fetcher.CoinBalanceOnDemand alias Phoenix.View import BlockScoutWeb.AddressController, only: [transaction_count: 1, validation_count: 1] @@ -81,7 +81,7 @@ defmodule BlockScoutWeb.AddressTokenTransferController do conn, "index.html", address: address, - coin_balance_status: OnDemandFetcher.trigger_fetch(address), + coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address), exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(), current_path: current_path(conn), token: token, diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_transaction_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_transaction_controller.ex index 65a3bdf134..da22b8c042 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_transaction_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_transaction_controller.ex @@ -11,7 +11,7 @@ defmodule BlockScoutWeb.AddressTransactionController do alias BlockScoutWeb.TransactionView alias Explorer.{Chain, Market} alias Explorer.ExchangeRates.Token - alias Indexer.CoinBalance.OnDemandFetcher + alias Indexer.Fetcher.CoinBalanceOnDemand alias Phoenix.View @transaction_necessity_by_association [ @@ -91,7 +91,7 @@ defmodule BlockScoutWeb.AddressTransactionController do conn, "index.html", address: address, - coin_balance_status: OnDemandFetcher.trigger_fetch(address), + coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address), exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(), filter: params["filter"], transaction_count: transaction_count(address), diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_validation_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_validation_controller.ex index 87fb70ca40..42170cbfc9 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_validation_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_validation_controller.ex @@ -12,7 +12,7 @@ defmodule BlockScoutWeb.AddressValidationController do alias BlockScoutWeb.BlockView alias Explorer.ExchangeRates.Token alias Explorer.{Chain, Market} - alias Indexer.CoinBalance.OnDemandFetcher + alias Indexer.Fetcher.CoinBalanceOnDemand alias Phoenix.View def index(conn, %{"address_id" => address_hash_string, "type" => "JSON"} = params) do @@ -76,7 +76,7 @@ defmodule BlockScoutWeb.AddressValidationController do conn, "index.html", address: address, - coin_balance_status: OnDemandFetcher.trigger_fetch(address), + coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address), current_path: current_path(conn), transaction_count: transaction_count(address), validation_count: validation_count(address), diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_decompiled_contract/index.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_decompiled_contract/index.html.eex index 2252db512f..1bc815fefc 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_decompiled_contract/index.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_decompiled_contract/index.html.eex @@ -18,7 +18,7 @@
-
<%= contract.decompiled_source_code %>
+
<%= raw(highlight_decompiled_code(contract.decompiled_source_code)) %>
diff --git a/apps/block_scout_web/lib/block_scout_web/views/address_decompiled_contract_view.ex b/apps/block_scout_web/lib/block_scout_web/views/address_decompiled_contract_view.ex index 74713cdcde..348df51152 100644 --- a/apps/block_scout_web/lib/block_scout_web/views/address_decompiled_contract_view.ex +++ b/apps/block_scout_web/lib/block_scout_web/views/address_decompiled_contract_view.ex @@ -1,3 +1,38 @@ defmodule BlockScoutWeb.AddressDecompiledContractView do use BlockScoutWeb, :view + + @colors %{ + "\e[95m" => "136, 0, 0", + # red + "\e[91m" => "236, 89, 58", + # gray + "\e[38;5;8m" => "111, 110, 111", + # green + "\e[32m" => "57, 115, 0", + # yellowgreen + "\e[93m" => "57, 115, 0", + # yellow + "\e[92m" => "119, 232, 81", + # purple + "\e[94m" => "136, 0, 0" + } + + def highlight_decompiled_code(code) do + @colors + |> Enum.reduce(code, fn {symbol, rgb}, acc -> + String.replace(acc, symbol, "") + end) + |> String.replace("\e[1m", "") + |> String.replace("ยป", "»") + |> String.replace("\e[0m", "") + |> add_line_numbers() + end + + defp add_line_numbers(code) do + code + |> String.split("\n") + |> Enum.reduce("", fn line, acc -> + acc <> "#{line}\n" + end) + end end diff --git a/apps/block_scout_web/test/block_scout_web/views/address_decompiled_code_test.exs b/apps/block_scout_web/test/block_scout_web/views/address_decompiled_code_test.exs new file mode 100644 index 0000000000..8d94d9f724 --- /dev/null +++ b/apps/block_scout_web/test/block_scout_web/views/address_decompiled_code_test.exs @@ -0,0 +1,62 @@ +defmodule BlockScoutWeb.AddressDecompiledContractViewTest do + use BlockScoutWeb.ConnCase, async: true + + alias BlockScoutWeb.AddressDecompiledContractView + + describe "highlight_decompiled_code/1" do + test "generate correct html code" do + code = """ + # + # eveem.org 6 Feb 2019 + # Decompiled source of 0x00Bd9e214FAb74d6fC21bf1aF34261765f57e875 + # + # Let's make the world open source + #  + # + # I failed with these: + # - unknowne77c646d(?) + # - transferFromWithData(address _from, address _to, uint256 _value, bytes _data) + # All the rest is below. + # + + + # Storage definitions and getters + + def storage: + allowance is uint256 => uint256 # mask(256, 0) at storage #2 + stor4 is uint256 => uint8 # mask(8, 0) at storage #4 + + def allowance(address _owner, address _spender) payable:  + require (calldata.size - 4) >= 64 + return allowance[sha3(((320 - 1) and (320 - 1) and _owner), 1), ((320 - 1) and _spender and (320 - 1))] + + + # + # Regular functions - see Tutorial for understanding quirks of the code + # + + + # folder failed in this function - may be terribly long, sorry + def unknownc47d033b(?) payable:  + if (calldata.size - 4) < 32: + revert + else: + if not (320 - 1) or not cd[4]: + revert + else: + mem[0] = (320 - 1) and (320 - 1) and cd[4] + mem[32] = 4 + mem[96] = bool(stor4[((320 - 1) and (320 - 1) and cd[4])]) + return bool(stor4[((320 - 1) and (320 - 1) and cd[4])]) + + def _fallback() payable: # default function + revert + """ + + result = AddressDecompiledContractView.highlight_decompiled_code(code) + + assert result == + " #\n # eveem.org 6 Feb 2019\n # Decompiled source of 0x00Bd9e214FAb74d6fC21bf1aF34261765f57e875\n #\n # Let's make the world open source\n # \n #\n # I failed with these:\n # - unknowne77c646d(?)\n # - transferFromWithData(address _from, address _to, uint256 _value, bytes _data)\n # All the rest is below.\n #\n\n\n # Storage definitions and getters\n\n def storage:\n allowance is uint256 => uint256 # mask(256, 0) at storage #2\n stor4 is uint256 => uint8 # mask(8, 0) at storage #4\n\n def allowance(address _owner, address _spender) payable: \n require (calldata.size - 4) >= 64\n return allowance[sha3(((320 - 1) and (320 - 1) and _owner), 1), ((320 - 1) and _spender and (320 - 1))]\n\n\n #\n # Regular functions - see Tutorial for understanding quirks of the code\n #\n\n\n # folder failed in this function - may be terribly long, sorry\n def unknownc47d033b(?) payable: \n if (calldata.size - 4) < 32:\n revert\n else:\n if not (320 - 1) or not cd[4]:\n revert\n else:\n mem[0] = (320 - 1) and (320 - 1) and cd[4]\n mem[32] = 4\n mem[96] = bool(stor4[((320 - 1) and (320 - 1) and cd[4])])\n return bool(stor4[((320 - 1) and (320 - 1) and cd[4])])\n\n def _fallback() payable: # default function\n revert\n\n" + end + end +end diff --git a/apps/indexer/config/config.exs b/apps/indexer/config/config.exs index e95f3f421c..0024da8909 100644 --- a/apps/indexer/config/config.exs +++ b/apps/indexer/config/config.exs @@ -5,8 +5,8 @@ use Mix.Config import Bitwise block_transformers = %{ - "clique" => Indexer.Block.Transform.Clique, - "base" => Indexer.Block.Transform.Base + "clique" => Indexer.Transform.Blocks.Clique, + "base" => Indexer.Transform.Blocks.Base } # Compile time environment variable access requires recompilation. @@ -36,8 +36,8 @@ config :indexer, memory_limit: 1 <<< 30, first_block: System.get_env("FIRST_BLOCK") || 0 -# config :indexer, Indexer.ReplacedTransaction.Supervisor, disabled?: true -# config :indexer, Indexer.Block.Reward.Supervisor, disabled?: true +# config :indexer, Indexer.Fetcher.ReplacedTransaction.Supervisor, disabled?: true +# config :indexer, Indexer.Fetcher.BlockReward.Supervisor, disabled?: true config :indexer, Indexer.Tracer, service: :indexer, diff --git a/apps/indexer/lib/indexer/application.ex b/apps/indexer/lib/indexer/application.ex index 2e2f747c31..cb696567b7 100644 --- a/apps/indexer/lib/indexer/application.ex +++ b/apps/indexer/lib/indexer/application.ex @@ -5,10 +5,7 @@ defmodule Indexer.Application do use Application - alias Indexer.{ - Memory, - Shrinkable - } + alias Indexer.Memory @impl Application def start(_type, _args) do @@ -22,13 +19,13 @@ defmodule Indexer.Application do children = [ {Memory.Monitor, [memory_monitor_options, [name: memory_monitor_name]]}, - {Shrinkable.Supervisor, [%{memory_monitor: memory_monitor_name}]} + {Indexer.Supervisor, [%{memory_monitor: memory_monitor_name}]} ] opts = [ # If the `Memory.Monitor` dies, it needs all the `Shrinkable`s to re-register, so restart them. strategy: :rest_for_one, - name: Indexer.Supervisor + name: Indexer.Application ] Supervisor.start_link(children, opts) diff --git a/apps/indexer/lib/indexer/block/catchup/fetcher.ex b/apps/indexer/lib/indexer/block/catchup/fetcher.ex index 23836d8cbe..7a1eeea620 100644 --- a/apps/indexer/lib/indexer/block/catchup/fetcher.ex +++ b/apps/indexer/lib/indexer/block/catchup/fetcher.ex @@ -11,16 +11,19 @@ defmodule Indexer.Block.Catchup.Fetcher do only: [ async_import_block_rewards: 1, async_import_coin_balances: 2, + async_import_created_contract_codes: 1, + async_import_internal_transactions: 2, + async_import_replaced_transactions: 1, async_import_tokens: 1, + async_import_token_balances: 1, async_import_uncles: 1, - fetch_and_import_range: 2, - async_import_replaced_transactions: 1 + fetch_and_import_range: 2 ] alias Ecto.Changeset alias Explorer.Chain - alias Explorer.Chain.{Hash, Transaction} - alias Indexer.{Block, Code, InternalTransaction, Sequence, TokenBalance, Tracer} + alias Indexer.{Block, Tracer} + alias Indexer.Block.Catchup.Sequence alias Indexer.Memory.Shrinkable @behaviour Block.Fetcher @@ -31,7 +34,6 @@ defmodule Indexer.Block.Catchup.Fetcher do @blocks_batch_size 10 @blocks_concurrency 10 @sequence_name :block_catchup_sequencer - @geth_block_limit 128 defstruct blocks_batch_size: @blocks_batch_size, blocks_concurrency: @blocks_concurrency, @@ -157,60 +159,6 @@ defmodule Indexer.Block.Catchup.Fetcher do async_import_replaced_transactions(imported) end - defp async_import_created_contract_codes(%{transactions: transactions}) do - transactions - |> Enum.flat_map(fn - %Transaction{ - block_number: block_number, - hash: hash, - created_contract_address_hash: %Hash{} = created_contract_address_hash, - created_contract_code_indexed_at: nil, - internal_transactions_indexed_at: nil - } -> - [%{block_number: block_number, hash: hash, created_contract_address_hash: created_contract_address_hash}] - - %Transaction{internal_transactions_indexed_at: %DateTime{}} -> - [] - - %Transaction{created_contract_address_hash: nil} -> - [] - end) - |> Code.Fetcher.async_fetch(10_000) - end - - defp async_import_created_contract_codes(_), do: :ok - - defp async_import_internal_transactions(%{blocks: blocks}, EthereumJSONRPC.Parity) do - blocks - |> Enum.map(fn %Chain.Block{number: block_number} -> %{number: block_number} end) - |> InternalTransaction.Fetcher.async_block_fetch(10_000) - end - - defp async_import_internal_transactions(%{transactions: transactions}, EthereumJSONRPC.Geth) do - {_, max_block_number} = Chain.fetch_min_and_max_block_numbers() - - transactions - |> Enum.flat_map(fn - %Transaction{block_number: block_number, index: index, hash: hash, internal_transactions_indexed_at: nil} -> - [%{block_number: block_number, index: index, hash: hash}] - - %Transaction{internal_transactions_indexed_at: %DateTime{}} -> - [] - end) - |> Enum.filter(fn %{block_number: block_number} -> - max_block_number - block_number < @geth_block_limit - end) - |> InternalTransaction.Fetcher.async_fetch(10_000) - end - - defp async_import_internal_transactions(_, _), do: :ok - - defp async_import_token_balances(%{address_token_balances: token_balances}) do - TokenBalance.Fetcher.async_fetch(token_balances) - end - - defp async_import_token_balances(_), do: :ok - defp stream_fetch_and_import(%__MODULE__{blocks_concurrency: blocks_concurrency} = state, sequence) when is_pid(sequence) do sequence diff --git a/apps/indexer/lib/indexer/sequence.ex b/apps/indexer/lib/indexer/block/catchup/sequence.ex similarity index 98% rename from apps/indexer/lib/indexer/sequence.ex rename to apps/indexer/lib/indexer/block/catchup/sequence.ex index e017d926a1..c46fec5c53 100644 --- a/apps/indexer/lib/indexer/sequence.ex +++ b/apps/indexer/lib/indexer/block/catchup/sequence.ex @@ -1,4 +1,4 @@ -defmodule Indexer.Sequence do +defmodule Indexer.Block.Catchup.Sequence do @moduledoc false use GenServer @@ -71,11 +71,11 @@ defmodule Indexer.Sequence do Infinite sequence - Indexer.Sequence.start_link(first: 100, step: 10) + Indexer.Block.Catchup.Sequence.start_link(first: 100, step: 10) Finite sequence - Indexer.Sequence.start_link(ranges: [100..0]) + Indexer.Block.Catchup.Sequence.start_link(ranges: [100..0]) """ @spec start_link(options(), Keyword.t()) :: GenServer.on_start() diff --git a/apps/indexer/lib/indexer/block/fetcher.ex b/apps/indexer/lib/indexer/block/fetcher.ex index 73e4643a62..241142f4f6 100644 --- a/apps/indexer/lib/indexer/block/fetcher.ex +++ b/apps/indexer/lib/indexer/block/fetcher.ex @@ -10,11 +10,32 @@ defmodule Indexer.Block.Fetcher do import EthereumJSONRPC, only: [quantity_to_integer: 1] alias EthereumJSONRPC.{Blocks, FetchedBeneficiaries} + alias Explorer.Chain alias Explorer.Chain.{Address, Block, Hash, Import, Transaction} - alias Indexer.{AddressExtraction, CoinBalance, MintTransfer, ReplacedTransaction, Token, TokenTransfers, Tracer} - alias Indexer.Address.{CoinBalances, TokenBalances} alias Indexer.Block.Fetcher.Receipts - alias Indexer.Block.{Reward, Transform} + + alias Indexer.Fetcher.{ + BlockReward, + CoinBalance, + ContractCode, + InternalTransaction, + ReplacedTransaction, + Token, + TokenBalance, + UncleBlock + } + + alias Indexer.Tracer + + alias Indexer.Transform.{ + AddressCoinBalances, + Addresses, + AddressTokenBalances, + MintTransfers, + TokenTransfers + } + + alias Indexer.Transform.Blocks, as: TransformBlocks @type address_hash_to_fetched_balance_block_number :: %{String.t() => Block.block_number()} @@ -46,6 +67,7 @@ defmodule Indexer.Block.Fetcher do @receipts_batch_size 250 @receipts_concurrency 10 + @geth_block_limit 128 @doc false def default_receipts_batch_size, do: @receipts_batch_size @@ -102,16 +124,16 @@ defmodule Indexer.Block.Fetcher do block_second_degree_relations_params: block_second_degree_relations_params, errors: blocks_errors }}} <- {:blocks, EthereumJSONRPC.fetch_blocks_by_range(range, json_rpc_named_arguments)}, - blocks = Transform.transform_blocks(blocks_params), + blocks = TransformBlocks.transform_blocks(blocks_params), {:receipts, {:ok, receipt_params}} <- {:receipts, Receipts.fetch(state, transactions_params_without_receipts)}, %{logs: logs, receipts: receipts} = receipt_params, transactions_with_receipts = Receipts.put(transactions_params_without_receipts, receipts), %{token_transfers: token_transfers, tokens: tokens} = TokenTransfers.parse(logs), - %{mint_transfers: mint_transfers} = MintTransfer.parse(logs), + %{mint_transfers: mint_transfers} = MintTransfers.parse(logs), %FetchedBeneficiaries{params_set: beneficiary_params_set, errors: beneficiaries_errors} = fetch_beneficiaries(blocks, json_rpc_named_arguments), addresses = - AddressExtraction.extract_addresses(%{ + Addresses.extract_addresses(%{ block_reward_contract_beneficiaries: MapSet.to_list(beneficiary_params_set), blocks: blocks, logs: logs, @@ -126,12 +148,12 @@ defmodule Indexer.Block.Fetcher do logs_params: logs, transactions_params: transactions_with_receipts } - |> CoinBalances.params_set(), + |> AddressCoinBalances.params_set(), beneficiaries_with_gas_payment <- beneficiary_params_set |> add_gas_payments(transactions_with_receipts) - |> Reward.Fetcher.reduce_uncle_rewards(), - address_token_balances = TokenBalances.params_set(%{token_transfers_params: token_transfers}), + |> BlockReward.reduce_uncle_rewards(), + address_token_balances = AddressTokenBalances.params_set(%{token_transfers_params: token_transfers}), {:ok, inserted} <- __MODULE__.import( state, @@ -180,7 +202,7 @@ defmodule Indexer.Block.Fetcher do def async_import_block_rewards(errors) when is_list(errors) do errors |> block_reward_errors_to_block_numbers() - |> Indexer.Block.Reward.Fetcher.async_fetch() + |> BlockReward.async_fetch() end def async_import_coin_balances(%{addresses: addresses}, %{ @@ -191,23 +213,77 @@ defmodule Indexer.Block.Fetcher do block_number = Map.fetch!(address_hash_to_block_number, to_string(address_hash)) %{address_hash: address_hash, block_number: block_number} end) - |> CoinBalance.Fetcher.async_fetch_balances() + |> CoinBalance.async_fetch_balances() end def async_import_coin_balances(_, _), do: :ok + def async_import_created_contract_codes(%{transactions: transactions}) do + transactions + |> Enum.flat_map(fn + %Transaction{ + block_number: block_number, + hash: hash, + created_contract_address_hash: %Hash{} = created_contract_address_hash, + created_contract_code_indexed_at: nil, + internal_transactions_indexed_at: nil + } -> + [%{block_number: block_number, hash: hash, created_contract_address_hash: created_contract_address_hash}] + + %Transaction{internal_transactions_indexed_at: %DateTime{}} -> + [] + + %Transaction{created_contract_address_hash: nil} -> + [] + end) + |> ContractCode.async_fetch(10_000) + end + + def async_import_created_contract_codes(_), do: :ok + + def async_import_internal_transactions(%{blocks: blocks}, EthereumJSONRPC.Parity) do + blocks + |> Enum.map(fn %Block{number: block_number} -> %{number: block_number} end) + |> InternalTransaction.async_block_fetch(10_000) + end + + def async_import_internal_transactions(%{transactions: transactions}, EthereumJSONRPC.Geth) do + {_, max_block_number} = Chain.fetch_min_and_max_block_numbers() + + transactions + |> Enum.flat_map(fn + %Transaction{block_number: block_number, index: index, hash: hash, internal_transactions_indexed_at: nil} -> + [%{block_number: block_number, index: index, hash: hash}] + + %Transaction{internal_transactions_indexed_at: %DateTime{}} -> + [] + end) + |> Enum.filter(fn %{block_number: block_number} -> + max_block_number - block_number < @geth_block_limit + end) + |> InternalTransaction.async_fetch(10_000) + end + + def async_import_internal_transactions(_, _), do: :ok + def async_import_tokens(%{tokens: tokens}) do tokens |> Enum.map(& &1.contract_address_hash) - |> Token.Fetcher.async_fetch() + |> Token.async_fetch() end def async_import_tokens(_), do: :ok + def async_import_token_balances(%{address_token_balances: token_balances}) do + TokenBalance.async_fetch(token_balances) + end + + def async_import_token_balances(_), do: :ok + def async_import_uncles(%{block_second_degree_relations: block_second_degree_relations}) do block_second_degree_relations |> Enum.map(& &1.uncle_hash) - |> Indexer.Block.Uncle.Fetcher.async_fetch_blocks() + |> UncleBlock.async_fetch_blocks() end def async_import_uncles(_), do: :ok @@ -221,7 +297,7 @@ defmodule Indexer.Block.Fetcher do %Transaction{block_hash: nil} -> [] end) - |> ReplacedTransaction.Fetcher.async_fetch(10_000) + |> ReplacedTransaction.async_fetch(10_000) end def async_import_replaced_transactions(_), do: :ok diff --git a/apps/indexer/lib/indexer/block/realtime/fetcher.ex b/apps/indexer/lib/indexer/block/realtime/fetcher.ex index fe486f62c2..ff99545fa0 100644 --- a/apps/indexer/lib/indexer/block/realtime/fetcher.ex +++ b/apps/indexer/lib/indexer/block/realtime/fetcher.ex @@ -14,20 +14,22 @@ defmodule Indexer.Block.Realtime.Fetcher do import Indexer.Block.Fetcher, only: [ async_import_block_rewards: 1, + async_import_created_contract_codes: 1, + async_import_internal_transactions: 2, + async_import_replaced_transactions: 1, async_import_tokens: 1, + async_import_token_balances: 1, async_import_uncles: 1, - fetch_and_import_range: 2, - async_import_replaced_transactions: 1 + fetch_and_import_range: 2 ] - alias ABI.TypeDecoder alias Ecto.Changeset alias EthereumJSONRPC.{FetchedBalances, Subscription} alias Explorer.Chain - alias Explorer.Chain.TokenTransfer alias Explorer.Counters.AverageBlockTime - alias Indexer.{AddressExtraction, Block, TokenBalances, Tracer} + alias Indexer.{Block, Tracer} alias Indexer.Block.Realtime.TaskSupervisor + alias Indexer.Transform.Addresses alias Timex.Duration @behaviour Block.Fetcher @@ -159,42 +161,21 @@ defmodule Indexer.Block.Realtime.Fetcher do @impl Block.Fetcher def import( - block_fetcher, + %Block.Fetcher{json_rpc_named_arguments: json_rpc_named_arguments} = block_fetcher, %{ address_coin_balances: %{params: address_coin_balances_params}, address_hash_to_fetched_balance_block_number: address_hash_to_block_number, - address_token_balances: %{params: address_token_balances_params}, addresses: %{params: addresses_params}, - blocks: %{params: blocks_params}, - block_rewards: block_rewards, - transactions: %{params: transactions_params}, - token_transfers: %{params: token_transfers_params} + block_rewards: block_rewards } = options ) do - with {:internal_transactions, - {:ok, - %{ - addresses_params: internal_transactions_addresses_params, - internal_transactions_params: internal_transactions_params, - internal_transactions_indexed_at_blocks_params: internal_transactions_indexed_at_blocks_params - }}} <- - {:internal_transactions, - internal_transactions(block_fetcher, %{ - addresses_params: addresses_params, - blocks_params: blocks_params, - token_transfers_params: token_transfers_params, - transactions_params: transactions_params - })}, - {:balances, {:ok, %{addresses_params: balances_addresses_params, balances_params: balances_params}}} <- + with {:balances, {:ok, %{addresses_params: balances_addresses_params, balances_params: balances_params}}} <- {:balances, balances(block_fetcher, %{ address_hash_to_block_number: address_hash_to_block_number, - addresses_params: internal_transactions_addresses_params, + addresses_params: addresses_params, balances_params: address_coin_balances_params })}, - {:address_token_balances, {:ok, address_token_balances}} <- - {:address_token_balances, fetch_token_balances(address_token_balances_params)}, - address_current_token_balances = TokenBalances.to_address_current_token_balances(address_token_balances), {block_reward_errors, chain_import_block_rewards} = Map.pop(block_rewards, :errors), chain_import_options = options @@ -202,16 +183,14 @@ defmodule Indexer.Block.Realtime.Fetcher do |> put_in([:addresses, :params], balances_addresses_params) |> put_in([:blocks, :params, Access.all(), :consensus], true) |> put_in([:block_rewards], chain_import_block_rewards) - |> put_in([Access.key(:address_coin_balances, %{}), :params], balances_params) - |> put_in([Access.key(:address_current_token_balances, %{}), :params], address_current_token_balances) - |> put_in([Access.key(:address_token_balances), :params], address_token_balances) - |> put_in([Access.key(:internal_transactions, %{}), :params], internal_transactions_params) - |> put_in([:internal_transactions_indexed_at_blocks], %{ - params: internal_transactions_indexed_at_blocks_params, - with: :number_only_changeset - }), + |> put_in([Access.key(:address_coin_balances, %{}), :params], balances_params), {:import, {:ok, imported} = ok} <- {:import, Chain.import(chain_import_options)} do - async_import_remaining_block_data(imported, %{block_rewards: %{errors: block_reward_errors}}) + async_import_remaining_block_data( + imported, + %{block_rewards: %{errors: block_reward_errors}}, + json_rpc_named_arguments + ) + ok end end @@ -354,147 +333,20 @@ defmodule Indexer.Block.Realtime.Fetcher do Enum.any?(changesets, &(Map.get(&1, :message) == "Unknown block number")) end - defp async_import_remaining_block_data(imported, %{block_rewards: %{errors: block_reward_errors}}) do + defp async_import_remaining_block_data( + imported, + %{block_rewards: %{errors: block_reward_errors}}, + json_rpc_named_arguments + ) do async_import_block_rewards(block_reward_errors) + async_import_created_contract_codes(imported) + async_import_internal_transactions(imported, Keyword.get(json_rpc_named_arguments, :variant)) async_import_tokens(imported) + async_import_token_balances(imported) async_import_uncles(imported) async_import_replaced_transactions(imported) end - defp internal_transactions( - %Block.Fetcher{json_rpc_named_arguments: json_rpc_named_arguments}, - %{ - addresses_params: addresses_params, - blocks_params: blocks_params, - token_transfers_params: token_transfers_params, - transactions_params: transactions_params - } - ) do - variant = Keyword.fetch!(json_rpc_named_arguments, :variant) - - internal_transactions_indexed_at_blocks_params = - case variant do - EthereumJSONRPC.Parity -> blocks_params - _ -> [] - end - - variant - |> case do - EthereumJSONRPC.Parity -> - blocks_params - |> Enum.map(fn %{number: block_number} -> block_number end) - |> EthereumJSONRPC.fetch_block_internal_transactions(json_rpc_named_arguments) - - _ -> - transactions_params - |> transactions_params_to_fetch_internal_transactions_params(token_transfers_params, json_rpc_named_arguments) - |> EthereumJSONRPC.fetch_internal_transactions(json_rpc_named_arguments) - end - |> case do - {:ok, internal_transactions_params} -> - merged_addresses_params = - %{internal_transactions: internal_transactions_params} - |> AddressExtraction.extract_addresses() - |> Kernel.++(addresses_params) - |> AddressExtraction.merge_addresses() - - {:ok, - %{ - addresses_params: merged_addresses_params, - internal_transactions_params: internal_transactions_params, - internal_transactions_indexed_at_blocks_params: internal_transactions_indexed_at_blocks_params - }} - - :ignore -> - {:ok, - %{ - addresses_params: addresses_params, - internal_transactions_params: [], - internal_transactions_indexed_at_blocks_params: [] - }} - - {:error, _reason} = error -> - error - end - end - - defp transactions_params_to_fetch_internal_transactions_params( - transactions_params, - token_transfers_params, - json_rpc_named_arguments - ) do - token_transfer_transaction_hash_set = MapSet.new(token_transfers_params, & &1.transaction_hash) - - Enum.flat_map( - transactions_params, - &transaction_params_to_fetch_internal_transaction_params_list( - &1, - token_transfer_transaction_hash_set, - json_rpc_named_arguments - ) - ) - end - - defp transaction_params_to_fetch_internal_transaction_params_list( - %{block_number: block_number, transaction_index: transaction_index, hash: hash} = transaction_params, - token_transfer_transaction_hash_set, - json_rpc_named_arguments - ) - when is_integer(block_number) and is_integer(transaction_index) and is_binary(hash) do - token_transfer? = hash in token_transfer_transaction_hash_set - - if fetch_internal_transactions?(transaction_params, token_transfer?, json_rpc_named_arguments) do - [%{block_number: block_number, transaction_index: transaction_index, hash_data: hash}] - else - [] - end - end - - # 0xa9059cbb - signature of the transfer(address,uint256) function from the ERC-20 token specification. - # Although transaction input data can be faked we use this heuristics to filter simple token transfer internal transactions from indexing because they slow down realtime fetcher - defp fetch_internal_transactions?( - %{ - status: :ok, - created_contract_address_hash: nil, - input: unquote(TokenTransfer.transfer_function_signature()) <> params, - value: 0 - }, - _, - _ - ) do - types = [:address, {:uint, 256}] - - try do - [_address, _value] = - params - |> Base.decode16!(case: :mixed) - |> TypeDecoder.decode_raw(types) - - false - rescue - _ -> true - end - end - - defp fetch_internal_transactions?( - %{ - status: :ok, - created_contract_address_hash: nil, - input: "0x", - to_address_hash: to_address_hash, - block_number: block_number - }, - _, - json_rpc_named_arguments - ) do - Chain.contract_address?(to_address_hash, block_number, json_rpc_named_arguments) - end - - # Token transfers not transferred during contract creation don't need internal transactions as the token transfers - # derive completely from the logs. - defp fetch_internal_transactions?(%{status: :ok, created_contract_address_hash: nil}, true, _), do: false - defp fetch_internal_transactions?(_, _, _), do: true - defp balances( %Block.Fetcher{json_rpc_named_arguments: json_rpc_named_arguments}, %{addresses_params: addresses_params} = options @@ -505,9 +357,9 @@ defmodule Indexer.Block.Realtime.Fetcher do {:ok, %FetchedBalances{params_list: params_list, errors: []}} -> merged_addresses_params = %{address_coin_balances: params_list} - |> AddressExtraction.extract_addresses() + |> Addresses.extract_addresses() |> Kernel.++(addresses_params) - |> AddressExtraction.merge_addresses() + |> Addresses.merge_addresses() value_fetched_at = DateTime.utc_now() @@ -557,10 +409,4 @@ defmodule Indexer.Block.Realtime.Fetcher do %{hash_data: address_hash, block_quantity: integer_to_quantity(block_number)} end) end - - defp fetch_token_balances(address_token_balances_params) do - address_token_balances_params - |> MapSet.to_list() - |> TokenBalances.fetch_token_balances_from_blockchain() - end end diff --git a/apps/indexer/lib/indexer/block/reward/supervisor.ex b/apps/indexer/lib/indexer/block/reward/supervisor.ex deleted file mode 100644 index 9dab2269a2..0000000000 --- a/apps/indexer/lib/indexer/block/reward/supervisor.ex +++ /dev/null @@ -1,46 +0,0 @@ -defmodule Indexer.Block.Reward.Supervisor do - @moduledoc """ - Supervises `Indexer.Block.Reward.Fetcher` and its batch tasks through `Indexer.Block.Reward.TaskSupervisor` - """ - - use Supervisor - - alias Indexer.Block.Reward.Fetcher - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(arguments, gen_server_options \\ []) do - if disabled?() do - :ignore - else - Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) - end - end - - def disabled?() do - Application.get_env(:indexer, __MODULE__, [])[:disabled?] == true - end - - @impl Supervisor - def init(fetcher_arguments) do - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.Block.Reward.TaskSupervisor}, - {Fetcher, [fetcher_arguments, [name: Fetcher]]} - ], - strategy: :one_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/block/supervisor.ex b/apps/indexer/lib/indexer/block/supervisor.ex deleted file mode 100644 index 50b24a6dd5..0000000000 --- a/apps/indexer/lib/indexer/block/supervisor.ex +++ /dev/null @@ -1,78 +0,0 @@ -defmodule Indexer.Block.Supervisor do - @moduledoc """ - Supervises `Indexer.Block.Catchup.Supervisor` and `Indexer.Block.Realtime.Supervisor`. - """ - - alias Indexer.Block - alias Indexer.Block.{Catchup, Realtime, Reward, Uncle} - alias Indexer.Temporary.{AddressesWithoutCode, FailedCreatedAddresses} - - use Supervisor - - def start_link([arguments, gen_server_options]) do - Supervisor.start_link(__MODULE__, arguments, gen_server_options) - end - - @impl Supervisor - def init( - %{ - block_interval: block_interval, - json_rpc_named_arguments: json_rpc_named_arguments, - subscribe_named_arguments: subscribe_named_arguments, - realtime_overrides: realtime_overrides - } = named_arguments - ) do - block_fetcher = - named_arguments - |> Map.drop(~w(block_interval memory_monitor subscribe_named_arguments realtime_overrides)a) - |> Block.Fetcher.new() - - fixing_realtime_fetcher = %Block.Fetcher{ - broadcast: false, - callback_module: Realtime.Fetcher, - json_rpc_named_arguments: json_rpc_named_arguments - } - - realtime_block_fetcher = - named_arguments - |> Map.drop(~w(block_interval memory_monitor subscribe_named_arguments realtime_overrides)a) - |> Map.merge(Enum.into(realtime_overrides, %{})) - |> Block.Fetcher.new() - - realtime_subscribe_named_arguments = realtime_overrides[:subscribe_named_arguments] || subscribe_named_arguments - - memory_monitor = Map.get(named_arguments, :memory_monitor) - - Supervisor.init( - [ - {Catchup.Supervisor, - [ - %{block_fetcher: block_fetcher, block_interval: block_interval, memory_monitor: memory_monitor}, - [name: Catchup.Supervisor] - ]}, - {Realtime.Supervisor, - [ - %{block_fetcher: realtime_block_fetcher, subscribe_named_arguments: realtime_subscribe_named_arguments}, - [name: Realtime.Supervisor] - ]}, - {Uncle.Supervisor, [[block_fetcher: block_fetcher, memory_monitor: memory_monitor], [name: Uncle.Supervisor]]}, - {Reward.Supervisor, - [ - [json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor], - [name: Reward.Supervisor] - ]}, - {FailedCreatedAddresses.Supervisor, - [ - json_rpc_named_arguments, - [name: FailedCreatedAddresses.Supervisor] - ]}, - {AddressesWithoutCode.Supervisor, - [ - fixing_realtime_fetcher, - [name: AddressesWithoutCode.Supervisor] - ]} - ], - strategy: :one_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/block/transform.ex b/apps/indexer/lib/indexer/block/transform.ex deleted file mode 100644 index cf4f5b43a4..0000000000 --- a/apps/indexer/lib/indexer/block/transform.ex +++ /dev/null @@ -1,21 +0,0 @@ -defmodule Indexer.Block.Transform do - @moduledoc """ - Protocol for transforming blocks. - """ - - @type block :: map() - - @doc """ - Transforms a block. - """ - @callback transform(block :: block()) :: block() - - @doc """ - Runs a list of blocks through the configured block transformer. - """ - def transform_blocks(blocks) when is_list(blocks) do - transformer = Application.get_env(:indexer, :block_transformer) - - Enum.map(blocks, &transformer.transform/1) - end -end diff --git a/apps/indexer/lib/indexer/block/uncle/supervisor.ex b/apps/indexer/lib/indexer/block/uncle/supervisor.ex deleted file mode 100644 index 87daf8bdc6..0000000000 --- a/apps/indexer/lib/indexer/block/uncle/supervisor.ex +++ /dev/null @@ -1,38 +0,0 @@ -defmodule Indexer.Block.Uncle.Supervisor do - @moduledoc """ - Supervises `Indexer.Block.Uncle.Fetcher`. - """ - - use Supervisor - - alias Indexer.Block.Uncle.Fetcher - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(arguments, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, arguments, gen_server_options) - end - - @impl Supervisor - def init(fetcher_arguments) do - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.Block.Uncle.TaskSupervisor}, - {Fetcher, [fetcher_arguments, [name: Fetcher]]} - ], - strategy: :rest_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/code/supervisor.ex b/apps/indexer/lib/indexer/code/supervisor.ex deleted file mode 100644 index e7cf228866..0000000000 --- a/apps/indexer/lib/indexer/code/supervisor.ex +++ /dev/null @@ -1,39 +0,0 @@ -defmodule Indexer.Code.Supervisor do - @moduledoc """ - Supervises `Indexer.Code.Fetcher` and its batch tasks through - `Indexer.Code.TaskSupervisor`. - """ - - use Supervisor - - alias Indexer.Code.Fetcher - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(arguments, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) - end - - @impl Supervisor - def init(fetcher_arguments) do - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.Code.TaskSupervisor}, - {Fetcher, [fetcher_arguments, [name: Fetcher]]} - ], - strategy: :one_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/coin_balance/supervisor.ex b/apps/indexer/lib/indexer/coin_balance/supervisor.ex deleted file mode 100644 index 6624ee1bec..0000000000 --- a/apps/indexer/lib/indexer/coin_balance/supervisor.ex +++ /dev/null @@ -1,39 +0,0 @@ -defmodule Indexer.CoinBalance.Supervisor do - @moduledoc """ - Supervises `Indexer.CoinBalance.Fetcher` and its batch tasks through `Indexer.CoinBalance.TaskSupervisor` - """ - - use Supervisor - - alias Indexer.CoinBalance.{Fetcher, OnDemandFetcher} - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(arguments, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) - end - - @impl Supervisor - def init(fetcher_arguments) do - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.CoinBalance.TaskSupervisor}, - {Fetcher, [fetcher_arguments, [name: Fetcher]]}, - {OnDemandFetcher, [fetcher_arguments[:json_rpc_named_arguments], [name: OnDemandFetcher]]} - ], - strategy: :one_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/fetcher.ex b/apps/indexer/lib/indexer/fetcher.ex new file mode 100644 index 0000000000..b31e81c2e2 --- /dev/null +++ b/apps/indexer/lib/indexer/fetcher.ex @@ -0,0 +1,77 @@ +defmodule Indexer.Fetcher do + @moduledoc """ + General fetcher infrastructure. + """ + + alias Macro.Env + + defmacro __using__(opts \\ []) do + quote do + require Indexer.Fetcher + + Indexer.Fetcher.defsupervisor(unquote(opts)) + end + end + + # credo:disable-for-next-line Credo.Check.Refactor.CyclomaticComplexity + defmacro defsupervisor(opts \\ []) do + quote location: :keep do + opts = unquote(opts) + + strategy = Keyword.get(opts, :strategy, :one_for_one) + fetcher = __MODULE__ + supervisor = Keyword.get(opts, :supervisor, Module.concat(fetcher, Supervisor)) + task_supervisor = Keyword.get(opts, :task_supervisor, Module.concat(fetcher, TaskSupervisor)) + + Module.create( + supervisor, + quote bind_quoted: [strategy: strategy, fetcher: fetcher, task_supervisor: task_supervisor] do + use Supervisor + + def child_spec([]), do: child_spec([[], []]) + def child_spec([init_arguments]), do: child_spec([init_arguments, []]) + + def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do + default = %{ + id: __MODULE__, + start: {__MODULE__, :start_link, start_link_arguments}, + restart: :transient, + type: :supervisor + } + + Supervisor.child_spec(default, []) + end + + def start_link(arguments, gen_server_options \\ []) do + if disabled?() do + :ignore + else + Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) + end + end + + def disabled?() do + Application.get_env(:indexer, __MODULE__, [])[:disabled?] == true + end + + @impl Supervisor + def init(fetcher_arguments) do + children = [ + {Task.Supervisor, name: unquote(task_supervisor)}, + {unquote(fetcher), [put_supervisor_when_is_list(fetcher_arguments), [name: unquote(fetcher)]]} + ] + + Supervisor.init(children, strategy: unquote(strategy)) + end + + defp put_supervisor_when_is_list(arguments) when is_list(arguments) do + Keyword.put(arguments, :supervisor, self()) + end + + defp put_supervisor_when_is_list(arguments), do: arguments + end, + Env.location(__ENV__) + ) + end + end +end diff --git a/apps/indexer/lib/indexer/block/reward/fetcher.ex b/apps/indexer/lib/indexer/fetcher/block_reward.ex similarity index 92% rename from apps/indexer/lib/indexer/block/reward/fetcher.ex rename to apps/indexer/lib/indexer/fetcher/block_reward.ex index 2329392a7b..4a59eb1cbe 100644 --- a/apps/indexer/lib/indexer/block/reward/fetcher.ex +++ b/apps/indexer/lib/indexer/fetcher/block_reward.ex @@ -1,4 +1,4 @@ -defmodule Indexer.Block.Reward.Fetcher do +defmodule Indexer.Fetcher.BlockReward do @moduledoc """ Fetches `t:Explorer.Chain.Block.Reward.t/0` for a given `t:Explorer.Chain.Block.block_number/0`. @@ -6,6 +6,7 @@ defmodule Indexer.Block.Reward.Fetcher do retrieved from the database and compared against that returned from `EthereumJSONRPC.` """ + use Indexer.Fetcher use Spandex.Decorators require Logger @@ -16,9 +17,10 @@ defmodule Indexer.Block.Reward.Fetcher do alias EthereumJSONRPC.FetchedBeneficiaries alias Explorer.Chain alias Explorer.Chain.{Block, Wei} - alias Indexer.Address.CoinBalances - alias Indexer.{AddressExtraction, BufferedTask, CoinBalance, Tracer} - alias Indexer.Block.Reward.Supervisor, as: BlockRewardSupervisor + alias Indexer.{BufferedTask, Tracer} + alias Indexer.Fetcher.BlockReward.Supervisor, as: BlockRewardSupervisor + alias Indexer.Fetcher.CoinBalance + alias Indexer.Transform.{AddressCoinBalances, Addresses} @behaviour BufferedTask @@ -26,7 +28,7 @@ defmodule Indexer.Block.Reward.Fetcher do flush_interval: :timer.seconds(3), max_batch_size: 10, max_concurrency: 4, - task_supervisor: Indexer.Block.Reward.TaskSupervisor, + task_supervisor: Indexer.Fetcher.BlockReward.TaskSupervisor, metadata: [fetcher: :block_reward] ] @@ -72,7 +74,7 @@ defmodule Indexer.Block.Reward.Fetcher do end @impl BufferedTask - @decorate trace(name: "fetch", resource: "Indexer.Block.Reward.Fetcher.run/2", service: :indexer, tracer: Tracer) + @decorate trace(name: "fetch", resource: "Indexer.Fetcher.BlockReward.run/2", service: :indexer, tracer: Tracer) def run(entries, json_rpc_named_arguments) do hash_string_by_number = entries @@ -129,7 +131,7 @@ defmodule Indexer.Block.Reward.Fetcher do |> import_block_reward_params() |> case do {:ok, %{address_coin_balances: address_coin_balances}} -> - CoinBalance.Fetcher.async_fetch_balances(address_coin_balances) + CoinBalance.async_fetch_balances(address_coin_balances) retry_errors(errors) @@ -237,8 +239,8 @@ defmodule Indexer.Block.Reward.Fetcher do end defp import_block_reward_params(block_rewards_params) when is_list(block_rewards_params) do - addresses_params = AddressExtraction.extract_addresses(%{block_reward_contract_beneficiaries: block_rewards_params}) - address_coin_balances_params_set = CoinBalances.params_set(%{beneficiary_params: block_rewards_params}) + addresses_params = Addresses.extract_addresses(%{block_reward_contract_beneficiaries: block_rewards_params}) + address_coin_balances_params_set = AddressCoinBalances.params_set(%{beneficiary_params: block_rewards_params}) Chain.import(%{ addresses: %{params: addresses_params}, diff --git a/apps/indexer/lib/indexer/coin_balance/fetcher.ex b/apps/indexer/lib/indexer/fetcher/coin_balance.ex similarity index 96% rename from apps/indexer/lib/indexer/coin_balance/fetcher.ex rename to apps/indexer/lib/indexer/fetcher/coin_balance.ex index 9320e78e69..e9930d0e0e 100644 --- a/apps/indexer/lib/indexer/coin_balance/fetcher.ex +++ b/apps/indexer/lib/indexer/fetcher/coin_balance.ex @@ -1,9 +1,10 @@ -defmodule Indexer.CoinBalance.Fetcher do +defmodule Indexer.Fetcher.CoinBalance do @moduledoc """ Fetches `t:Explorer.Chain.Address.CoinBalance.t/0` and updates `t:Explorer.Chain.Address.t/0` `fetched_coin_balance` and `fetched_coin_balance_block_number` to value at max `t:Explorer.Chain.Address.CoinBalance.t/0` `block_number` for the given `t:Explorer.Chain.Address.t/` `hash`. """ + use Indexer.Fetcher use Spandex.Decorators require Logger @@ -21,7 +22,7 @@ defmodule Indexer.CoinBalance.Fetcher do flush_interval: :timer.seconds(3), max_batch_size: 500, max_concurrency: 4, - task_supervisor: Indexer.CoinBalance.TaskSupervisor, + task_supervisor: Indexer.Fetcher.CoinBalance.TaskSupervisor, metadata: [fetcher: :coin_balance] ] @@ -69,7 +70,7 @@ defmodule Indexer.CoinBalance.Fetcher do end @impl BufferedTask - @decorate trace(name: "fetch", resource: "Indexer.CoinBalance.Fetcher.run/2", service: :indexer, tracer: Tracer) + @decorate trace(name: "fetch", resource: "Indexer.Fetcher.CoinBalance.run/2", service: :indexer, tracer: Tracer) def run(entries, json_rpc_named_arguments) do # the same address may be used more than once in the same block, but we only want one `Balance` for a given # `{address, block}`, so take unique params only diff --git a/apps/indexer/lib/indexer/coin_balance/on_demand_fetcher.ex b/apps/indexer/lib/indexer/fetcher/coin_balance_on_demand.ex similarity index 90% rename from apps/indexer/lib/indexer/coin_balance/on_demand_fetcher.ex rename to apps/indexer/lib/indexer/fetcher/coin_balance_on_demand.ex index 06d0780307..75af9c9bfc 100644 --- a/apps/indexer/lib/indexer/coin_balance/on_demand_fetcher.ex +++ b/apps/indexer/lib/indexer/fetcher/coin_balance_on_demand.ex @@ -1,4 +1,4 @@ -defmodule Indexer.CoinBalance.OnDemandFetcher do +defmodule Indexer.Fetcher.CoinBalanceOnDemand do @moduledoc """ Ensures that we have a reasonably up to date coin balance for a given address. @@ -10,6 +10,7 @@ defmodule Indexer.CoinBalance.OnDemandFetcher do @latest_balance_stale_threshold :timer.hours(24) use GenServer + use Indexer.Fetcher import Ecto.Query, only: [from: 2] import EthereumJSONRPC, only: [integer_to_quantity: 1] @@ -19,7 +20,7 @@ defmodule Indexer.CoinBalance.OnDemandFetcher do alias Explorer.Chain.{Address, BlockNumberCache} alias Explorer.Chain.Address.CoinBalance alias Explorer.Counters.AverageBlockTime - alias Indexer.CoinBalance.Fetcher + alias Indexer.Fetcher.CoinBalance, as: CoinBalanceFetcher alias Timex.Duration @type block_number :: integer @@ -42,7 +43,7 @@ defmodule Indexer.CoinBalance.OnDemandFetcher do latest_block_number = latest_block_number() case stale_balance_window(latest_block_number) do - {:error, :no_average_block_time} -> + {:error, _} -> :current stale_balance_window -> @@ -134,7 +135,7 @@ defmodule Indexer.CoinBalance.OnDemandFetcher do :ok {:ok, %{params_list: params_list}} -> - address_params = Fetcher.balances_params_to_address_params(params_list) + address_params = CoinBalanceFetcher.balances_params_to_address_params(params_list) Chain.import(%{ addresses: %{params: address_params, with: :balance_changeset}, @@ -153,7 +154,7 @@ defmodule Indexer.CoinBalance.OnDemandFetcher do end defp do_import(%FetchedBalances{} = fetched_balances) do - case Fetcher.import_fetched_balances(fetched_balances, :on_demand) do + case CoinBalanceFetcher.import_fetched_balances(fetched_balances, :on_demand) do {:ok, %{addresses: [address]}} -> {:ok, address} _ -> :error end @@ -174,7 +175,11 @@ defmodule Indexer.CoinBalance.OnDemandFetcher do |> Duration.to_milliseconds() |> round() - block_number - div(@latest_balance_stale_threshold, average_block_time) + if average_block_time == 0 do + {:error, :empty_database} + else + block_number - div(@latest_balance_stale_threshold, average_block_time) + end end end end diff --git a/apps/indexer/lib/indexer/code/fetcher.ex b/apps/indexer/lib/indexer/fetcher/contract_code.ex similarity index 91% rename from apps/indexer/lib/indexer/code/fetcher.ex rename to apps/indexer/lib/indexer/fetcher/contract_code.ex index f22c3f0746..bc95dd0d8e 100644 --- a/apps/indexer/lib/indexer/code/fetcher.ex +++ b/apps/indexer/lib/indexer/fetcher/contract_code.ex @@ -1,8 +1,9 @@ -defmodule Indexer.Code.Fetcher do +defmodule Indexer.Fetcher.ContractCode do @moduledoc """ Fetches `contract_code` `t:Explorer.Chain.Address.t/0`. """ + use Indexer.Fetcher use Spandex.Decorators require Logger @@ -11,7 +12,8 @@ defmodule Indexer.Code.Fetcher do alias Explorer.Chain alias Explorer.Chain.{Block, Hash} - alias Indexer.{AddressExtraction, BufferedTask, Tracer} + alias Indexer.{BufferedTask, Tracer} + alias Indexer.Transform.Addresses @behaviour BufferedTask @@ -21,7 +23,7 @@ defmodule Indexer.Code.Fetcher do flush_interval: :timer.seconds(3), max_concurrency: @max_concurrency, max_batch_size: @max_batch_size, - task_supervisor: Indexer.Code.TaskSupervisor, + task_supervisor: Indexer.Fetcher.ContractCode.TaskSupervisor, metadata: [fetcher: :code] ] @@ -85,7 +87,7 @@ defmodule Indexer.Code.Fetcher do @impl BufferedTask @decorate trace( name: "fetch", - resource: "Indexer.Code.Fetcher.run/2", + resource: "Indexer.Fetcher.ContractCode.run/2", service: :indexer, tracer: Tracer ) @@ -97,7 +99,7 @@ defmodule Indexer.Code.Fetcher do |> EthereumJSONRPC.fetch_codes(json_rpc_named_arguments) |> case do {:ok, create_address_codes} -> - addresses_params = AddressExtraction.extract_addresses(%{codes: create_address_codes.params_list}) + addresses_params = Addresses.extract_addresses(%{codes: create_address_codes.params_list}) import_with_balances(addresses_params, entries, json_rpc_named_arguments) @@ -118,7 +120,7 @@ defmodule Indexer.Code.Fetcher do {:ok, fetched_balances} -> balance_addresses_params = balances_params_to_address_params(fetched_balances.params_list) - merged_addresses_params = AddressExtraction.merge_addresses(addresses_params ++ balance_addresses_params) + merged_addresses_params = Addresses.merge_addresses(addresses_params ++ balance_addresses_params) case Chain.import(%{ addresses: %{params: merged_addresses_params}, diff --git a/apps/indexer/lib/indexer/internal_transaction/fetcher.ex b/apps/indexer/lib/indexer/fetcher/internal_transaction.ex similarity index 96% rename from apps/indexer/lib/indexer/internal_transaction/fetcher.ex rename to apps/indexer/lib/indexer/fetcher/internal_transaction.ex index f720d3b183..3b9746b838 100644 --- a/apps/indexer/lib/indexer/internal_transaction/fetcher.ex +++ b/apps/indexer/lib/indexer/fetcher/internal_transaction.ex @@ -1,10 +1,11 @@ -defmodule Indexer.InternalTransaction.Fetcher do +defmodule Indexer.Fetcher.InternalTransaction do @moduledoc """ Fetches and indexes `t:Explorer.Chain.InternalTransaction.t/0`. See `async_fetch/1` for details on configuring limits. """ + use Indexer.Fetcher use Spandex.Decorators require Logger @@ -13,7 +14,8 @@ defmodule Indexer.InternalTransaction.Fetcher do alias Explorer.Chain alias Explorer.Chain.{Block, Hash} - alias Indexer.{AddressExtraction, BufferedTask, Tracer} + alias Indexer.{BufferedTask, Tracer} + alias Indexer.Transform.Addresses @behaviour BufferedTask @@ -23,7 +25,7 @@ defmodule Indexer.InternalTransaction.Fetcher do flush_interval: :timer.seconds(3), max_concurrency: @max_concurrency, max_batch_size: @max_batch_size, - task_supervisor: Indexer.InternalTransaction.TaskSupervisor, + task_supervisor: Indexer.Fetcher.InternalTransaction.TaskSupervisor, metadata: [fetcher: :internal_transaction] ] @@ -141,7 +143,7 @@ defmodule Indexer.InternalTransaction.Fetcher do @impl BufferedTask @decorate trace( name: "fetch", - resource: "Indexer.InternalTransaction.Fetcher.run/2", + resource: "Indexer.Fetcher.InternalTransaction.run/2", service: :indexer, tracer: Tracer ) @@ -177,7 +179,7 @@ defmodule Indexer.InternalTransaction.Fetcher do internal_transactions_params_without_failed_creations = remove_failed_creations(internal_transactions_params) addresses_params = - AddressExtraction.extract_addresses(%{ + Addresses.extract_addresses(%{ internal_transactions: internal_transactions_params_without_failed_creations }) diff --git a/apps/indexer/lib/indexer/pending_transaction/fetcher.ex b/apps/indexer/lib/indexer/fetcher/pending_transaction.ex similarity index 85% rename from apps/indexer/lib/indexer/pending_transaction/fetcher.ex rename to apps/indexer/lib/indexer/fetcher/pending_transaction.ex index 3c6e0dc620..7576d384d8 100644 --- a/apps/indexer/lib/indexer/pending_transaction/fetcher.ex +++ b/apps/indexer/lib/indexer/fetcher/pending_transaction.ex @@ -1,4 +1,4 @@ -defmodule Indexer.PendingTransaction.Fetcher do +defmodule Indexer.Fetcher.PendingTransaction do @moduledoc """ Fetches pending transactions and imports them. @@ -6,6 +6,7 @@ defmodule Indexer.PendingTransaction.Fetcher do validated version that may make it to the database first. """ use GenServer + use Indexer.Fetcher require Logger @@ -13,7 +14,8 @@ defmodule Indexer.PendingTransaction.Fetcher do alias Ecto.Changeset alias Explorer.Chain - alias Indexer.{AddressExtraction, PendingTransaction} + alias Indexer.Fetcher.PendingTransaction + alias Indexer.Transform.Addresses @chunk_size 250 @@ -70,7 +72,7 @@ defmodule Indexer.PendingTransaction.Fetcher do |> Keyword.merge(opts) state = - %PendingTransaction.Fetcher{ + %__MODULE__{ json_rpc_named_arguments: Keyword.fetch!(opts, :json_rpc_named_arguments), interval: opts[:pending_transaction_interval] || @default_interval } @@ -80,12 +82,12 @@ defmodule Indexer.PendingTransaction.Fetcher do end @impl GenServer - def handle_info(:fetch, %PendingTransaction.Fetcher{} = state) do + def handle_info(:fetch, %__MODULE__{} = state) do task = Task.Supervisor.async_nolink(PendingTransaction.TaskSupervisor, fn -> task(state) end) - {:noreply, %PendingTransaction.Fetcher{state | task: task}} + {:noreply, %__MODULE__{state | task: task}} end - def handle_info({ref, result}, %PendingTransaction.Fetcher{task: %Task{ref: ref}} = state) do + def handle_info({ref, result}, %__MODULE__{task: %Task{ref: ref}} = state) do Process.demonitor(ref, [:flush]) case result do @@ -99,19 +101,19 @@ defmodule Indexer.PendingTransaction.Fetcher do def handle_info( {:DOWN, ref, :process, pid, reason}, - %PendingTransaction.Fetcher{task: %Task{pid: pid, ref: ref}} = state + %__MODULE__{task: %Task{pid: pid, ref: ref}} = state ) do Logger.error(fn -> "pending transaction fetcher task exited due to #{inspect(reason)}. Rescheduling." end) {:noreply, schedule_fetch(state)} end - defp schedule_fetch(%PendingTransaction.Fetcher{interval: interval} = state) do + defp schedule_fetch(%__MODULE__{interval: interval} = state) do Process.send_after(self(), :fetch, interval) - %PendingTransaction.Fetcher{state | task: nil} + %__MODULE__{state | task: nil} end - defp task(%PendingTransaction.Fetcher{json_rpc_named_arguments: json_rpc_named_arguments} = _state) do + defp task(%__MODULE__{json_rpc_named_arguments: json_rpc_named_arguments} = _state) do Logger.metadata(fetcher: :pending_transaction) case fetch_pending_transactions(json_rpc_named_arguments) do @@ -136,7 +138,7 @@ defmodule Indexer.PendingTransaction.Fetcher do end defp import_chunk(transactions_params) do - addresses_params = AddressExtraction.extract_addresses(%{transactions: transactions_params}, pending: true) + addresses_params = Addresses.extract_addresses(%{transactions: transactions_params}, pending: true) # There's no need to queue up fetching the address balance since theses are pending transactions and cannot have # affected the address balance yet since address balance is a balance at a given block and these transactions are diff --git a/apps/indexer/lib/indexer/replaced_transaction/fetcher.ex b/apps/indexer/lib/indexer/fetcher/replaced_transaction.ex similarity index 91% rename from apps/indexer/lib/indexer/replaced_transaction/fetcher.ex rename to apps/indexer/lib/indexer/fetcher/replaced_transaction.ex index 803c0f275a..26585cc9aa 100644 --- a/apps/indexer/lib/indexer/replaced_transaction/fetcher.ex +++ b/apps/indexer/lib/indexer/fetcher/replaced_transaction.ex @@ -1,8 +1,9 @@ -defmodule Indexer.ReplacedTransaction.Fetcher do +defmodule Indexer.Fetcher.ReplacedTransaction do @moduledoc """ Finds and updates replaced transactions. """ + use Indexer.Fetcher use Spandex.Decorators require Logger @@ -10,7 +11,7 @@ defmodule Indexer.ReplacedTransaction.Fetcher do alias Explorer.Chain alias Explorer.Chain.Hash alias Indexer.{BufferedTask, Tracer} - alias Indexer.ReplacedTransaction.Supervisor, as: ReplacedTransactionSupervisor + alias Indexer.Fetcher.ReplacedTransaction.Supervisor, as: ReplacedTransactionSupervisor @behaviour BufferedTask @@ -20,7 +21,7 @@ defmodule Indexer.ReplacedTransaction.Fetcher do flush_interval: :timer.seconds(3), max_concurrency: @max_concurrency, max_batch_size: @max_batch_size, - task_supervisor: Indexer.ReplacedTransaction.TaskSupervisor, + task_supervisor: Indexer.Fetcher.ReplacedTransaction.TaskSupervisor, metadata: [fetcher: :replaced_transaction] ] @@ -94,7 +95,7 @@ defmodule Indexer.ReplacedTransaction.Fetcher do @impl BufferedTask @decorate trace( name: "fetch", - resource: "Indexer.ReplacedTransaction.Fetcher.run/2", + resource: "Indexer.Fetcher.ReplacedTransaction.run/2", service: :indexer, tracer: Tracer ) diff --git a/apps/indexer/lib/indexer/token/fetcher.ex b/apps/indexer/lib/indexer/fetcher/token.ex similarity index 90% rename from apps/indexer/lib/indexer/token/fetcher.ex rename to apps/indexer/lib/indexer/fetcher/token.ex index 818f27f138..d6d17f9a3e 100644 --- a/apps/indexer/lib/indexer/token/fetcher.ex +++ b/apps/indexer/lib/indexer/fetcher/token.ex @@ -1,8 +1,9 @@ -defmodule Indexer.Token.Fetcher do +defmodule Indexer.Fetcher.Token do @moduledoc """ Fetches information about a token. """ + use Indexer.Fetcher use Spandex.Decorators alias Explorer.Chain @@ -17,7 +18,7 @@ defmodule Indexer.Token.Fetcher do flush_interval: 300, max_batch_size: 1, max_concurrency: 10, - task_supervisor: Indexer.Token.TaskSupervisor + task_supervisor: Indexer.Fetcher.Token.TaskSupervisor ] @doc false @@ -49,7 +50,7 @@ defmodule Indexer.Token.Fetcher do end @impl BufferedTask - @decorate trace(name: "fetch", resource: "Indexer.Token.Fetcher.run/2", service: :indexer, tracer: Tracer) + @decorate trace(name: "fetch", resource: "Indexer.Fetcher.Token.run/2", service: :indexer, tracer: Tracer) def run([token_contract_address], _json_rpc_named_arguments) do case Chain.token_from_address_hash(token_contract_address) do {:ok, %Token{} = token} -> diff --git a/apps/indexer/lib/indexer/token_balance/fetcher.ex b/apps/indexer/lib/indexer/fetcher/token_balance.ex similarity index 95% rename from apps/indexer/lib/indexer/token_balance/fetcher.ex rename to apps/indexer/lib/indexer/fetcher/token_balance.ex index d1fd0c1bd9..bbad8c4d66 100644 --- a/apps/indexer/lib/indexer/token_balance/fetcher.ex +++ b/apps/indexer/lib/indexer/fetcher/token_balance.ex @@ -1,4 +1,4 @@ -defmodule Indexer.TokenBalance.Fetcher do +defmodule Indexer.Fetcher.TokenBalance do @moduledoc """ Fetches token balances and send the ones that were fetched to be imported in `Address.CurrentTokenBalance` and `Address.TokenBalance`. @@ -13,6 +13,7 @@ defmodule Indexer.TokenBalance.Fetcher do that always raise errors interacting with the Smart Contract. """ + use Indexer.Fetcher use Spandex.Decorators require Logger @@ -27,7 +28,7 @@ defmodule Indexer.TokenBalance.Fetcher do flush_interval: 300, max_batch_size: 100, max_concurrency: 10, - task_supervisor: Indexer.TokenBalance.TaskSupervisor + task_supervisor: Indexer.Fetcher.TokenBalance.TaskSupervisor ] @max_retries 3 @@ -75,7 +76,7 @@ defmodule Indexer.TokenBalance.Fetcher do when reading their balance in the Smart Contract. """ @impl BufferedTask - @decorate trace(name: "fetch", resource: "Indexer.TokenBalance.Fetcher.run/2", tracer: Tracer, service: :indexer) + @decorate trace(name: "fetch", resource: "Indexer.Fetcher.TokenBalance.run/2", tracer: Tracer, service: :indexer) def run(entries, _json_rpc_named_arguments) do result = entries diff --git a/apps/indexer/lib/indexer/token/metadata_updater.ex b/apps/indexer/lib/indexer/fetcher/token_updater.ex similarity index 85% rename from apps/indexer/lib/indexer/token/metadata_updater.ex rename to apps/indexer/lib/indexer/fetcher/token_updater.ex index 6c3e0f1357..a155ed4be2 100644 --- a/apps/indexer/lib/indexer/token/metadata_updater.ex +++ b/apps/indexer/lib/indexer/fetcher/token_updater.ex @@ -1,16 +1,17 @@ -defmodule Indexer.Token.MetadataUpdater do +defmodule Indexer.Fetcher.TokenUpdater do @moduledoc """ Updates metadata for cataloged tokens """ use GenServer + use Indexer.Fetcher alias Explorer.Chain alias Explorer.Chain.Token alias Explorer.Token.MetadataRetriever - def start_link(initial_state) do - GenServer.start_link(__MODULE__, initial_state, name: __MODULE__) + def start_link([initial_state, gen_server_options]) do + GenServer.start_link(__MODULE__, initial_state, gen_server_options) end @impl true diff --git a/apps/indexer/lib/indexer/block/uncle/fetcher.ex b/apps/indexer/lib/indexer/fetcher/uncle_block.ex similarity index 88% rename from apps/indexer/lib/indexer/block/uncle/fetcher.ex rename to apps/indexer/lib/indexer/fetcher/uncle_block.ex index 166dae71bb..c74ee7ec89 100644 --- a/apps/indexer/lib/indexer/block/uncle/fetcher.ex +++ b/apps/indexer/lib/indexer/fetcher/uncle_block.ex @@ -1,9 +1,10 @@ -defmodule Indexer.Block.Uncle.Fetcher do +defmodule Indexer.Fetcher.UncleBlock do @moduledoc """ Fetches `t:Explorer.Chain.Block.t/0` by `hash` and updates `t:Explorer.Chain.Block.SecondDegreeRelation.t/0` `uncle_fetched_at` where the `uncle_hash` matches `hash`. """ + use Indexer.Fetcher use Spandex.Decorators require Logger @@ -12,7 +13,9 @@ defmodule Indexer.Block.Uncle.Fetcher do alias EthereumJSONRPC.Blocks alias Explorer.Chain alias Explorer.Chain.Hash - alias Indexer.{AddressExtraction, Block, BufferedTask, Tracer} + alias Indexer.{Block, BufferedTask, Tracer} + alias Indexer.Fetcher.UncleBlock + alias Indexer.Transform.Addresses @behaviour Block.Fetcher @behaviour BufferedTask @@ -21,7 +24,7 @@ defmodule Indexer.Block.Uncle.Fetcher do flush_interval: :timer.seconds(3), max_batch_size: 10, max_concurrency: 10, - task_supervisor: Indexer.Block.Uncle.TaskSupervisor, + task_supervisor: Indexer.Fetcher.UncleBlock.TaskSupervisor, metadata: [fetcher: :block_uncle] ] @@ -70,7 +73,7 @@ defmodule Indexer.Block.Uncle.Fetcher do end @impl BufferedTask - @decorate trace(name: "fetch", resource: "Indexer.Block.Uncle.Fetcher.run/2", service: :indexer, tracer: Tracer) + @decorate trace(name: "fetch", resource: "Indexer.Fetcher.UncleBlock.run/2", service: :indexer, tracer: Tracer) def run(hashes, %Block.Fetcher{json_rpc_named_arguments: json_rpc_named_arguments} = block_fetcher) do # the same block could be included as an uncle on multiple blocks, but we only want to fetch it once unique_hashes = Enum.uniq(hashes) @@ -108,7 +111,7 @@ defmodule Indexer.Block.Uncle.Fetcher do block_fetcher, original_entries ) do - addresses_params = AddressExtraction.extract_addresses(%{blocks: blocks_params, transactions: transactions_params}) + addresses_params = Addresses.extract_addresses(%{blocks: blocks_params, transactions: transactions_params}) case Block.Fetcher.import(block_fetcher, %{ addresses: %{params: addresses_params}, @@ -149,15 +152,15 @@ defmodule Indexer.Block.Uncle.Fetcher do |> uncle_blocks() |> fork_transactions() |> Chain.import() do - # * CoinBalance.Fetcher.async_fetch_balances is not called because uncles don't affect balances - # * InternalTransaction.Fetcher.async_fetch is not called because internal transactions are based on transaction + # * CoinBalance.async_fetch_balances is not called because uncles don't affect balances + # * InternalTransaction.async_fetch is not called because internal transactions are based on transaction # hash, which is shared with transaction on consensus blocks. - # * Token.Fetcher.async_fetch is not called because the tokens only matter on consensus blocks - # * TokenBalance.Fetcher.async_fetch is not called because it uses block numbers from consensus, not uncles + # * Token.async_fetch is not called because the tokens only matter on consensus blocks + # * TokenBalance.async_fetch is not called because it uses block numbers from consensus, not uncles block_second_degree_relations |> Enum.map(& &1.uncle_hash) - |> Block.Uncle.Fetcher.async_fetch_blocks() + |> UncleBlock.async_fetch_blocks() ok end diff --git a/apps/indexer/lib/indexer/internal_transaction/supervisor.ex b/apps/indexer/lib/indexer/internal_transaction/supervisor.ex deleted file mode 100644 index b21bdae5d7..0000000000 --- a/apps/indexer/lib/indexer/internal_transaction/supervisor.ex +++ /dev/null @@ -1,39 +0,0 @@ -defmodule Indexer.InternalTransaction.Supervisor do - @moduledoc """ - Supervises `Indexer.InternalTransaction.Fetcher` and its batch tasks through - `Indexer.InternalTransaction.TaskSupervisor`. - """ - - use Supervisor - - alias Indexer.InternalTransaction.Fetcher - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(arguments, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) - end - - @impl Supervisor - def init(fetcher_arguments) do - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.InternalTransaction.TaskSupervisor}, - {Fetcher, [fetcher_arguments, [name: Fetcher]]} - ], - strategy: :one_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/pending_transaction/supervisor.ex b/apps/indexer/lib/indexer/pending_transaction/supervisor.ex deleted file mode 100644 index 50a5d1e882..0000000000 --- a/apps/indexer/lib/indexer/pending_transaction/supervisor.ex +++ /dev/null @@ -1,39 +0,0 @@ -defmodule Indexer.PendingTransaction.Supervisor do - @moduledoc """ - Supervises `Indexer.PendingTransaction.Fetcher` and its batch tasks through - `Indexer.PendingTransaction.TaskSupervisor`. - """ - - use Supervisor - - alias Indexer.PendingTransaction.Fetcher - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(arguments, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) - end - - @impl Supervisor - def init(fetcher_arguments) do - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.PendingTransaction.TaskSupervisor}, - {Fetcher, [fetcher_arguments, [name: Fetcher]]} - ], - strategy: :one_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/replaced_transaction/supervisor.ex b/apps/indexer/lib/indexer/replaced_transaction/supervisor.ex deleted file mode 100644 index fc58f8f274..0000000000 --- a/apps/indexer/lib/indexer/replaced_transaction/supervisor.ex +++ /dev/null @@ -1,47 +0,0 @@ -defmodule Indexer.ReplacedTransaction.Supervisor do - @moduledoc """ - Supervises `Indexer.ReplacedTransaction.Fetcher` and its batch tasks through - `Indexer.ReplacedTransaction.TaskSupervisor`. - """ - - use Supervisor - - alias Indexer.ReplacedTransaction.Fetcher - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(arguments, gen_server_options \\ []) do - if disabled?() do - :ignore - else - Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) - end - end - - def disabled?() do - Application.get_env(:indexer, __MODULE__, [])[:disabled?] == true - end - - @impl Supervisor - def init(fetcher_arguments) do - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.ReplacedTransaction.TaskSupervisor}, - {Fetcher, [fetcher_arguments, [name: Fetcher]]} - ], - strategy: :one_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/shrinkable/supervisor.ex b/apps/indexer/lib/indexer/shrinkable/supervisor.ex deleted file mode 100644 index 6135b7f9e0..0000000000 --- a/apps/indexer/lib/indexer/shrinkable/supervisor.ex +++ /dev/null @@ -1,97 +0,0 @@ -defmodule Indexer.Shrinkable.Supervisor do - @moduledoc """ - Supervisor of all supervision trees that depend on `Indexer.Alarm.Supervisor`. - """ - - use Supervisor - - alias Indexer.{ - Block, - Code, - CoinBalance, - InternalTransaction, - PendingTransaction, - ReplacedTransaction, - Token, - TokenBalance, - TokenTransfer - } - - def child_spec([]) do - child_spec([[]]) - end - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(arguments, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) - end - - @impl Supervisor - def init(%{memory_monitor: memory_monitor}) do - json_rpc_named_arguments = Application.fetch_env!(:indexer, :json_rpc_named_arguments) - - block_fetcher_supervisor_named_arguments = - :indexer - |> Application.get_all_env() - |> Keyword.take( - ~w(blocks_batch_size blocks_concurrency block_interval json_rpc_named_arguments receipts_batch_size - receipts_concurrency subscribe_named_arguments realtime_overrides)a - ) - |> Enum.into(%{}) - |> Map.put(:memory_monitor, memory_monitor) - |> Map.put_new(:realtime_overrides, %{}) - - Supervisor.init( - [ - {CoinBalance.Supervisor, - [ - [json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor], - [name: CoinBalance.Supervisor] - ]}, - {PendingTransaction.Supervisor, - [[json_rpc_named_arguments: json_rpc_named_arguments], [name: PendingTransactionFetcher]]}, - {Code.Supervisor, - [ - [json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor], - [name: Code.Supervisor] - ]}, - {ReplacedTransaction.Supervisor, - [ - [memory_monitor: memory_monitor], - [name: ReplacedTransaction.Supervisor] - ]}, - {InternalTransaction.Supervisor, - [ - [json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor], - [name: InternalTransaction.Supervisor] - ]}, - {Token.Supervisor, - [ - [json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor], - [name: Token.Supervisor] - ]}, - {TokenBalance.Supervisor, - [ - [json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor], - [name: TokenBalance.Supervisor] - ]}, - {Block.Supervisor, [block_fetcher_supervisor_named_arguments, [name: Block.Supervisor]]}, - {TokenTransfer.Uncataloged.Supervisor, [[], [name: TokenTransfer.Uncataloged.Supervisor]]} - ], - strategy: :one_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/supervisor.ex b/apps/indexer/lib/indexer/supervisor.ex new file mode 100644 index 0000000000..3626c31240 --- /dev/null +++ b/apps/indexer/lib/indexer/supervisor.ex @@ -0,0 +1,137 @@ +defmodule Indexer.Supervisor do + @moduledoc """ + Supervisor of all indexer worker supervision trees + """ + + use Supervisor + + alias Indexer.Block + alias Indexer.Block.{Catchup, Realtime} + + alias Indexer.Fetcher.{ + BlockReward, + CoinBalance, + CoinBalanceOnDemand, + ContractCode, + InternalTransaction, + PendingTransaction, + ReplacedTransaction, + Token, + TokenBalance, + TokenUpdater, + UncleBlock + } + + alias Indexer.Temporary.{ + AddressesWithoutCode, + FailedCreatedAddresses, + UncatalogedTokenTransfers + } + + def child_spec([]) do + child_spec([[]]) + end + + def child_spec([init_arguments]) do + child_spec([init_arguments, []]) + end + + def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do + default = %{ + id: __MODULE__, + start: {__MODULE__, :start_link, start_link_arguments}, + type: :supervisor + } + + Supervisor.child_spec(default, []) + end + + def start_link(arguments, gen_server_options \\ []) do + Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) + end + + @impl Supervisor + def init(%{memory_monitor: memory_monitor}) do + json_rpc_named_arguments = Application.fetch_env!(:indexer, :json_rpc_named_arguments) + + named_arguments = + :indexer + |> Application.get_all_env() + |> Keyword.take( + ~w(blocks_batch_size blocks_concurrency block_interval json_rpc_named_arguments receipts_batch_size + receipts_concurrency subscribe_named_arguments realtime_overrides)a + ) + |> Enum.into(%{}) + |> Map.put(:memory_monitor, memory_monitor) + |> Map.put_new(:realtime_overrides, %{}) + + %{ + block_interval: block_interval, + realtime_overrides: realtime_overrides, + subscribe_named_arguments: subscribe_named_arguments + } = named_arguments + + metadata_updater_inverval = Application.get_env(:indexer, :metadata_updater_days_interval) + + block_fetcher = + named_arguments + |> Map.drop(~w(block_interval memory_monitor subscribe_named_arguments realtime_overrides)a) + |> Block.Fetcher.new() + + fixing_realtime_fetcher = %Block.Fetcher{ + broadcast: false, + callback_module: Realtime.Fetcher, + json_rpc_named_arguments: json_rpc_named_arguments + } + + realtime_block_fetcher = + named_arguments + |> Map.drop(~w(block_interval memory_monitor subscribe_named_arguments realtime_overrides)a) + |> Map.merge(Enum.into(realtime_overrides, %{})) + |> Block.Fetcher.new() + + realtime_subscribe_named_arguments = realtime_overrides[:subscribe_named_arguments] || subscribe_named_arguments + + Supervisor.init( + [ + # Root fetchers + {PendingTransaction.Supervisor, [[json_rpc_named_arguments: json_rpc_named_arguments]]}, + {Realtime.Supervisor, + [ + %{block_fetcher: realtime_block_fetcher, subscribe_named_arguments: realtime_subscribe_named_arguments}, + [name: Realtime.Supervisor] + ]}, + {Catchup.Supervisor, + [ + %{block_fetcher: block_fetcher, block_interval: block_interval, memory_monitor: memory_monitor}, + [name: Catchup.Supervisor] + ]}, + + # Async catchup fetchers + {UncleBlock.Supervisor, [[block_fetcher: block_fetcher, memory_monitor: memory_monitor]]}, + {BlockReward.Supervisor, + [[json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor]]}, + {InternalTransaction.Supervisor, + [[json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor]]}, + {CoinBalance.Supervisor, + [[json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor]]}, + {Token.Supervisor, [[json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor]]}, + {ContractCode.Supervisor, + [[json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor]]}, + {TokenBalance.Supervisor, + [[json_rpc_named_arguments: json_rpc_named_arguments, memory_monitor: memory_monitor]]}, + {ReplacedTransaction.Supervisor, [[memory_monitor: memory_monitor]]}, + + # Out-of-band fetchers + {CoinBalanceOnDemand.Supervisor, [json_rpc_named_arguments]}, + {TokenUpdater.Supervisor, [%{update_interval: metadata_updater_inverval}]}, + + # Temporary workers + {AddressesWithoutCode.Supervisor, [fixing_realtime_fetcher]}, + {FailedCreatedAddresses.Supervisor, [json_rpc_named_arguments]}, + {UncatalogedTokenTransfers.Supervisor, [[]]} + ], + strategy: :one_for_one + ) + end +end diff --git a/apps/indexer/lib/indexer/temporary/addresses_without_code.ex b/apps/indexer/lib/indexer/temporary/addresses_without_code.ex index 781656d45d..4aa36ce0b6 100644 --- a/apps/indexer/lib/indexer/temporary/addresses_without_code.ex +++ b/apps/indexer/lib/indexer/temporary/addresses_without_code.ex @@ -4,6 +4,7 @@ defmodule Indexer.Temporary.AddressesWithoutCode do """ use GenServer + use Indexer.Fetcher require Logger diff --git a/apps/indexer/lib/indexer/temporary/addresses_without_code/supervisor.ex b/apps/indexer/lib/indexer/temporary/addresses_without_code/supervisor.ex deleted file mode 100644 index 9cfd84893e..0000000000 --- a/apps/indexer/lib/indexer/temporary/addresses_without_code/supervisor.ex +++ /dev/null @@ -1,38 +0,0 @@ -defmodule Indexer.Temporary.AddressesWithoutCode.Supervisor do - @moduledoc """ - Supervises `Indexer.Temporary.FailedCreatedAddresses`. - """ - - use Supervisor - - alias Indexer.Temporary.AddressesWithoutCode - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(fetcher, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, fetcher, gen_server_options) - end - - @impl Supervisor - def init(fetcher) do - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.Temporary.AddressesWithoutCode.TaskSupervisor}, - {AddressesWithoutCode, [fetcher, [name: FailedCreatedAddresses]]} - ], - strategy: :rest_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/temporary/failed_created_addresses.ex b/apps/indexer/lib/indexer/temporary/failed_created_addresses.ex index 3c11b468b0..a80cf657cd 100644 --- a/apps/indexer/lib/indexer/temporary/failed_created_addresses.ex +++ b/apps/indexer/lib/indexer/temporary/failed_created_addresses.ex @@ -3,6 +3,7 @@ defmodule Indexer.Temporary.FailedCreatedAddresses do Temporary module to fix internal transactions and their created transactions if a parent transaction has failed. """ use GenServer + use Indexer.Fetcher require Logger @@ -10,6 +11,7 @@ defmodule Indexer.Temporary.FailedCreatedAddresses do alias Explorer.Chain.{Address, Data, InternalTransaction, Transaction} alias Explorer.Repo + alias Indexer.Fetcher.ContractCode alias Indexer.Temporary.FailedCreatedAddresses.TaskSupervisor @task_options [max_concurrency: 3, timeout: :infinity] @@ -97,7 +99,7 @@ defmodule Indexer.Temporary.FailedCreatedAddresses do :ok = internal_transaction |> code_entry() - |> Indexer.Code.Fetcher.run(json_rpc_named_arguments) + |> ContractCode.run(json_rpc_named_arguments) end) Logger.debug( diff --git a/apps/indexer/lib/indexer/temporary/failed_created_addresses/supervisor.ex b/apps/indexer/lib/indexer/temporary/failed_created_addresses/supervisor.ex deleted file mode 100644 index 9ec54e7812..0000000000 --- a/apps/indexer/lib/indexer/temporary/failed_created_addresses/supervisor.ex +++ /dev/null @@ -1,38 +0,0 @@ -defmodule Indexer.Temporary.FailedCreatedAddresses.Supervisor do - @moduledoc """ - Supervises `Indexer.Temporary.FailedCreatedAddresses`. - """ - - use Supervisor - - alias Indexer.Temporary.FailedCreatedAddresses - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(json_rpc_named_arguments, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, json_rpc_named_arguments, gen_server_options) - end - - @impl Supervisor - def init(json_rpc_named_arguments) do - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.Temporary.FailedCreatedAddresses.TaskSupervisor}, - {FailedCreatedAddresses, [json_rpc_named_arguments, [name: FailedCreatedAddresses]]} - ], - strategy: :rest_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/token_transfer/uncataloged/worker.ex b/apps/indexer/lib/indexer/temporary/uncataloged_token_transfers.ex similarity index 91% rename from apps/indexer/lib/indexer/token_transfer/uncataloged/worker.ex rename to apps/indexer/lib/indexer/temporary/uncataloged_token_transfers.ex index 8bc689cf9d..8b0d62628b 100644 --- a/apps/indexer/lib/indexer/token_transfer/uncataloged/worker.ex +++ b/apps/indexer/lib/indexer/temporary/uncataloged_token_transfers.ex @@ -1,4 +1,4 @@ -defmodule Indexer.TokenTransfer.Uncataloged.Worker do +defmodule Indexer.Temporary.UncatalogedTokenTransfers do @moduledoc """ Catalogs token tranfer logs missing an accompanying token transfer record. @@ -8,12 +8,13 @@ defmodule Indexer.TokenTransfer.Uncataloged.Worker do """ use GenServer + use Indexer.Fetcher require Logger alias Explorer.Chain alias Indexer.Block.Catchup.Fetcher - alias Indexer.TokenTransfer.Uncataloged + alias Indexer.Temporary.UncatalogedTokenTransfers def child_spec([init_arguments]) do child_spec([init_arguments, []]) @@ -93,6 +94,6 @@ defmodule Indexer.TokenTransfer.Uncataloged.Worker do end defp async_push_front(block_numbers) do - Task.Supervisor.async_nolink(Uncataloged.TaskSupervisor, Fetcher, :push_front, [block_numbers]) + Task.Supervisor.async_nolink(UncatalogedTokenTransfers.TaskSupervisor, Fetcher, :push_front, [block_numbers]) end end diff --git a/apps/indexer/lib/indexer/token/supervisor.ex b/apps/indexer/lib/indexer/token/supervisor.ex deleted file mode 100644 index 2e7d1b6360..0000000000 --- a/apps/indexer/lib/indexer/token/supervisor.ex +++ /dev/null @@ -1,41 +0,0 @@ -defmodule Indexer.Token.Supervisor do - @moduledoc """ - Supervises `Indexer.Token.Fetcher` and its batch tasks through `Indexer.Token.TaskSupervisor`. - """ - - use Supervisor - - alias Indexer.Token.{Fetcher, MetadataUpdater} - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(arguments, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) - end - - @impl Supervisor - def init(fetcher_arguments) do - metadata_updater_inverval = Application.get_env(:indexer, :metadata_updater_days_interval) - - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.Token.TaskSupervisor}, - {Fetcher, [fetcher_arguments, [name: Fetcher]]}, - {MetadataUpdater, %{update_interval: metadata_updater_inverval}} - ], - strategy: :one_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/token_balance/supervisor.ex b/apps/indexer/lib/indexer/token_balance/supervisor.ex deleted file mode 100644 index e95828babb..0000000000 --- a/apps/indexer/lib/indexer/token_balance/supervisor.ex +++ /dev/null @@ -1,38 +0,0 @@ -defmodule Indexer.TokenBalance.Supervisor do - @moduledoc """ - Supervises `Indexer.TokenBalance.Fetcher` and its batch tasks through `Indexer.TokenBalance.TaskSupervisor` - """ - - use Supervisor - - alias Indexer.TokenBalance.Fetcher - - def child_spec([init_arguments]) do - child_spec([init_arguments, []]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - default = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - type: :supervisor - } - - Supervisor.child_spec(default, []) - end - - def start_link(arguments, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, arguments, Keyword.put_new(gen_server_options, :name, __MODULE__)) - end - - @impl Supervisor - def init(fetcher_arguments) do - Supervisor.init( - [ - {Task.Supervisor, name: Indexer.TokenBalance.TaskSupervisor}, - {Fetcher, [fetcher_arguments, [name: Fetcher]]} - ], - strategy: :one_for_one - ) - end -end diff --git a/apps/indexer/lib/indexer/token_balances.ex b/apps/indexer/lib/indexer/token_balances.ex index c3a88a05b1..ebec3d34a5 100644 --- a/apps/indexer/lib/indexer/token_balances.ex +++ b/apps/indexer/lib/indexer/token_balances.ex @@ -10,13 +10,14 @@ defmodule Indexer.TokenBalances do alias Explorer.Chain alias Explorer.Token.BalanceReader - alias Indexer.{TokenBalance, Tracer} + alias Indexer.Fetcher.TokenBalance + alias Indexer.Tracer @doc """ Fetches TokenBalances from specific Addresses and Blocks in the Blockchain In case an exception is raised during the RPC call the particular TokenBalance request - is ignored and sent to `TokenBalance.Fetcher` to be fetched again. + is ignored and sent to `TokenBalance` to be fetched again. ## token_balances @@ -84,7 +85,7 @@ defmodule Indexer.TokenBalances do block_number: token_balance.block_number }) end) - |> TokenBalance.Fetcher.async_fetch() + |> TokenBalance.async_fetch() end defp ignore_request_with_errors(%{value: nil, value_fetched_at: nil, error: _error}), do: false diff --git a/apps/indexer/lib/indexer/token_transfer/uncataloged/supervisor.ex b/apps/indexer/lib/indexer/token_transfer/uncataloged/supervisor.ex deleted file mode 100644 index 555e536579..0000000000 --- a/apps/indexer/lib/indexer/token_transfer/uncataloged/supervisor.ex +++ /dev/null @@ -1,44 +0,0 @@ -defmodule Indexer.TokenTransfer.Uncataloged.Supervisor do - @moduledoc """ - Supervises process for ensuring uncataloged token transfers get queued for indexing. - """ - - use Supervisor - - alias Indexer.TokenTransfer.Uncataloged.Worker - - def child_spec([]) do - child_spec([[]]) - end - - def child_spec([init_arguments]) do - child_spec([init_arguments, [name: __MODULE__]]) - end - - def child_spec([_init_arguments, _gen_server_options] = start_link_arguments) do - spec = %{ - id: __MODULE__, - start: {__MODULE__, :start_link, start_link_arguments}, - restart: :transient, - type: :supervisor - } - - Supervisor.child_spec(spec, []) - end - - def start_link(init_arguments, gen_server_options \\ []) do - Supervisor.start_link(__MODULE__, init_arguments, gen_server_options) - end - - @impl Supervisor - def init(_) do - children = [ - {Worker, [[supervisor: self()], [name: Worker]]}, - {Task.Supervisor, name: Indexer.TokenTransfer.Uncataloged.TaskSupervisor} - ] - - opts = [strategy: :one_for_all] - - Supervisor.init(children, opts) - end -end diff --git a/apps/indexer/lib/indexer/token_transfers.ex b/apps/indexer/lib/indexer/token_transfers.ex deleted file mode 100644 index 54dada1910..0000000000 --- a/apps/indexer/lib/indexer/token_transfers.ex +++ /dev/null @@ -1,9 +0,0 @@ -defmodule Indexer.TokenTransfers do - @moduledoc """ - Context for working with token transfers. - """ - - alias Indexer.TokenTransfer.Parser - - defdelegate parse(items), to: Parser -end diff --git a/apps/indexer/lib/indexer/address/coin_balances.ex b/apps/indexer/lib/indexer/transform/address_coin_balances.ex similarity index 98% rename from apps/indexer/lib/indexer/address/coin_balances.ex rename to apps/indexer/lib/indexer/transform/address_coin_balances.ex index 83441927c1..cd71508bc2 100644 --- a/apps/indexer/lib/indexer/address/coin_balances.ex +++ b/apps/indexer/lib/indexer/transform/address_coin_balances.ex @@ -1,4 +1,4 @@ -defmodule Indexer.Address.CoinBalances do +defmodule Indexer.Transform.AddressCoinBalances do @moduledoc """ Extracts `Explorer.Chain.Address.CoinBalance` params from other schema's params. """ diff --git a/apps/indexer/lib/indexer/address/token_balances.ex b/apps/indexer/lib/indexer/transform/address_token_balances.ex similarity index 97% rename from apps/indexer/lib/indexer/address/token_balances.ex rename to apps/indexer/lib/indexer/transform/address_token_balances.ex index f75c8ab197..ff87ba7d57 100644 --- a/apps/indexer/lib/indexer/address/token_balances.ex +++ b/apps/indexer/lib/indexer/transform/address_token_balances.ex @@ -1,4 +1,4 @@ -defmodule Indexer.Address.TokenBalances do +defmodule Indexer.Transform.AddressTokenBalances do @moduledoc """ Extracts `Explorer.Address.TokenBalance` params from other schema's params. """ diff --git a/apps/indexer/lib/indexer/address_extraction.ex b/apps/indexer/lib/indexer/transform/addresses.ex similarity index 97% rename from apps/indexer/lib/indexer/address_extraction.ex rename to apps/indexer/lib/indexer/transform/addresses.ex index 5fba0da10c..1bc23dd033 100644 --- a/apps/indexer/lib/indexer/address_extraction.ex +++ b/apps/indexer/lib/indexer/transform/addresses.ex @@ -1,4 +1,4 @@ -defmodule Indexer.AddressExtraction do +defmodule Indexer.Transform.Addresses do @moduledoc """ Extract Addresses from data fetched from the Blockchain and structured as Blocks, InternalTransactions, Transactions and Logs. @@ -154,7 +154,7 @@ defmodule Indexer.AddressExtraction do Blocks have their `miner_hash` extracted. - iex> Indexer.AddressExtraction.extract_addresses( + iex> Indexer.Addresses.extract_addresses( ...> %{ ...> blocks: [ ...> %{ @@ -174,7 +174,7 @@ defmodule Indexer.AddressExtraction do Internal transactions can have their `from_address_hash`, `to_address_hash` and/or `created_contract_address_hash` extracted. - iex> Indexer.AddressExtraction.extract_addresses( + iex> Indexer.Addresses.extract_addresses( ...> %{ ...> internal_transactions: [ ...> %{ @@ -211,7 +211,7 @@ defmodule Indexer.AddressExtraction do Transactions can have their `from_address_hash` and/or `to_address_hash` extracted. - iex> Indexer.AddressExtraction.extract_addresses( + iex> Indexer.Addresses.extract_addresses( ...> %{ ...> transactions: [ ...> %{ @@ -247,7 +247,7 @@ defmodule Indexer.AddressExtraction do Logs can have their `address_hash` extracted. - iex> Indexer.AddressExtraction.extract_addresses( + iex> Indexer.Addresses.extract_addresses( ...> %{ ...> logs: [ ...> %{ @@ -266,7 +266,7 @@ defmodule Indexer.AddressExtraction do When the same address is mentioned multiple times, the greatest `block_number` is used - iex> Indexer.AddressExtraction.extract_addresses( + iex> Indexer.Addresses.extract_addresses( ...> %{ ...> blocks: [ ...> %{ @@ -319,7 +319,7 @@ defmodule Indexer.AddressExtraction do When a contract is created and then used in internal transactions and transaction in the same fetched data, the `created_contract_code` is merged with the greatest `block_number` - iex> Indexer.AddressExtraction.extract_addresses( + iex> Indexer.Addresses.extract_addresses( ...> %{ ...> internal_transactions: [ ...> %{ diff --git a/apps/indexer/lib/indexer/block/util.ex b/apps/indexer/lib/indexer/transform/blocks.ex similarity index 82% rename from apps/indexer/lib/indexer/block/util.ex rename to apps/indexer/lib/indexer/transform/blocks.ex index fbf0d77997..c55c9a9974 100644 --- a/apps/indexer/lib/indexer/block/util.ex +++ b/apps/indexer/lib/indexer/transform/blocks.ex @@ -1,8 +1,24 @@ -defmodule Indexer.Block.Util do +defmodule Indexer.Transform.Blocks do @moduledoc """ - Helper functions for parsing block information. + Protocol for transforming blocks. """ + @type block :: map() + + @doc """ + Transforms a block. + """ + @callback transform(block :: block()) :: block() + + @doc """ + Runs a list of blocks through the configured block transformer. + """ + def transform_blocks(blocks) when is_list(blocks) do + transformer = Application.get_env(:indexer, :block_transformer) + + Enum.map(blocks, &transformer.transform/1) + end + @doc """ Calculates the signer's address by recovering the ECDSA public key. diff --git a/apps/indexer/lib/indexer/block/transform/base.ex b/apps/indexer/lib/indexer/transform/blocks/base.ex similarity index 53% rename from apps/indexer/lib/indexer/block/transform/base.ex rename to apps/indexer/lib/indexer/transform/blocks/base.ex index c094f9b1bc..815a9fe177 100644 --- a/apps/indexer/lib/indexer/block/transform/base.ex +++ b/apps/indexer/lib/indexer/transform/blocks/base.ex @@ -1,13 +1,13 @@ -defmodule Indexer.Block.Transform.Base do +defmodule Indexer.Transform.Blocks.Base do @moduledoc """ Default block transformer to be used. """ - alias Indexer.Block.Transform + alias Indexer.Transform.Blocks - @behaviour Transform + @behaviour Blocks - @impl Transform + @impl Blocks def transform(block) when is_map(block) do block end diff --git a/apps/indexer/lib/indexer/block/transform/clique.ex b/apps/indexer/lib/indexer/transform/blocks/clique.ex similarity index 57% rename from apps/indexer/lib/indexer/block/transform/clique.ex rename to apps/indexer/lib/indexer/transform/blocks/clique.ex index 564db966e3..664d49f8c9 100644 --- a/apps/indexer/lib/indexer/block/transform/clique.ex +++ b/apps/indexer/lib/indexer/transform/blocks/clique.ex @@ -1,17 +1,17 @@ -defmodule Indexer.Block.Transform.Clique do +defmodule Indexer.Transform.Blocks.Clique do @moduledoc """ Handles block transforms for Clique chain. """ - alias Indexer.Block.{Transform, Util} + alias Indexer.Transform.Blocks - @behaviour Transform + @behaviour Blocks - @impl Transform + @impl Blocks def transform(%{number: 0} = block), do: block def transform(block) when is_map(block) do - miner_address = Util.signer(block) + miner_address = Blocks.signer(block) %{block | miner_hash: miner_address} end diff --git a/apps/indexer/lib/indexer/mint_transfer.ex b/apps/indexer/lib/indexer/transform/mint_transfers.ex similarity index 95% rename from apps/indexer/lib/indexer/mint_transfer.ex rename to apps/indexer/lib/indexer/transform/mint_transfers.ex index 352fedc007..e57a9841a7 100644 --- a/apps/indexer/lib/indexer/mint_transfer.ex +++ b/apps/indexer/lib/indexer/transform/mint_transfers.ex @@ -1,4 +1,4 @@ -defmodule Indexer.MintTransfer do +defmodule Indexer.Transform.MintTransfers do @moduledoc """ Helper functions to parse addresses from mint transfers. @@ -14,7 +14,7 @@ defmodule Indexer.MintTransfer do ## Examples - iex> Indexer.MintTransfer.parse([ + iex> Indexer.Transform.MintTransfers.parse([ ...> %{ ...> address_hash: "0x867305d19606aadba405ce534e303d0e225f9556", ...> block_number: 137_194, diff --git a/apps/indexer/lib/indexer/token_transfer/parser.ex b/apps/indexer/lib/indexer/transform/token_transfers.ex similarity index 98% rename from apps/indexer/lib/indexer/token_transfer/parser.ex rename to apps/indexer/lib/indexer/transform/token_transfers.ex index 499819e2a9..58ea1e57ef 100644 --- a/apps/indexer/lib/indexer/token_transfer/parser.ex +++ b/apps/indexer/lib/indexer/transform/token_transfers.ex @@ -1,4 +1,4 @@ -defmodule Indexer.TokenTransfer.Parser do +defmodule Indexer.Transform.TokenTransfers do @moduledoc """ Helper functions for transforming data for ERC-20 and ERC-721 token transfers. """ diff --git a/apps/indexer/test/indexer/block/catchup/bound_interval_supervisor_test.exs b/apps/indexer/test/indexer/block/catchup/bound_interval_supervisor_test.exs index 6f4d9fb743..556abf69bd 100644 --- a/apps/indexer/test/indexer/block/catchup/bound_interval_supervisor_test.exs +++ b/apps/indexer/test/indexer/block/catchup/bound_interval_supervisor_test.exs @@ -7,8 +7,18 @@ defmodule Indexer.Block.Catchup.BoundIntervalSupervisorTest do import EthereumJSONRPC, only: [integer_to_quantity: 1] alias Explorer.Chain.Block - alias Indexer.{BoundInterval, Code, CoinBalance, InternalTransaction, ReplacedTransaction, Token, TokenBalance} - alias Indexer.Block.{Catchup, Uncle} + alias Indexer.BoundInterval + alias Indexer.Block.Catchup + + alias Indexer.Fetcher.{ + CoinBalance, + ContractCode, + InternalTransaction, + ReplacedTransaction, + Token, + TokenBalance, + UncleBlock + } @moduletag capture_log: true @@ -204,12 +214,12 @@ defmodule Indexer.Block.Catchup.BoundIntervalSupervisorTest do CoinBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) InternalTransaction.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) - Code.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) + ContractCode.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) Token.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) TokenBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) ReplacedTransaction.Supervisor.Case.start_supervised!() - Uncle.Supervisor.Case.start_supervised!( + UncleBlock.Supervisor.Case.start_supervised!( block_fetcher: %Indexer.Block.Fetcher{json_rpc_named_arguments: json_rpc_named_arguments} ) @@ -410,7 +420,7 @@ defmodule Indexer.Block.Catchup.BoundIntervalSupervisorTest do start_supervised!({Task.Supervisor, name: Indexer.Block.Catchup.TaskSupervisor}) CoinBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) - Code.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) + ContractCode.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) InternalTransaction.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) Token.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) TokenBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) @@ -504,12 +514,12 @@ defmodule Indexer.Block.Catchup.BoundIntervalSupervisorTest do start_supervised({Task.Supervisor, name: Indexer.Block.Catchup.TaskSupervisor}) CoinBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) InternalTransaction.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) - Code.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) + ContractCode.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) Token.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) TokenBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) ReplacedTransaction.Supervisor.Case.start_supervised!() - Uncle.Supervisor.Case.start_supervised!( + UncleBlock.Supervisor.Case.start_supervised!( block_fetcher: %Indexer.Block.Fetcher{json_rpc_named_arguments: json_rpc_named_arguments} ) diff --git a/apps/indexer/test/indexer/block/catchup/fetcher_test.exs b/apps/indexer/test/indexer/block/catchup/fetcher_test.exs index 851064e365..9588e0423d 100644 --- a/apps/indexer/test/indexer/block/catchup/fetcher_test.exs +++ b/apps/indexer/test/indexer/block/catchup/fetcher_test.exs @@ -7,8 +7,9 @@ defmodule Indexer.Block.Catchup.FetcherTest do alias Explorer.Chain alias Explorer.Chain.Block.Reward - alias Indexer.{Block, CoinBalance, InternalTransaction, Token, TokenBalance} + alias Indexer.Block alias Indexer.Block.Catchup.Fetcher + alias Indexer.Fetcher.{BlockReward, CoinBalance, InternalTransaction, Token, TokenBalance, UncleBlock} @moduletag capture_log: true @@ -48,7 +49,7 @@ defmodule Indexer.Block.Catchup.FetcherTest do end end) - Process.register(pid, Block.Uncle.Fetcher) + Process.register(pid, UncleBlock) nephew_hash = block_hash() |> to_string() uncle_hash = block_hash() |> to_string() @@ -315,7 +316,7 @@ defmodule Indexer.Block.Catchup.FetcherTest do end end) - Process.register(pid, Indexer.Block.Reward.Fetcher) + Process.register(pid, BlockReward) assert %{first_block_number: ^block_number, missing_block_count: 1, shrunk: false} = Fetcher.task(%Fetcher{ @@ -414,7 +415,7 @@ defmodule Indexer.Block.Catchup.FetcherTest do end end) - Process.register(pid, Indexer.Block.Reward.Fetcher) + Process.register(pid, BlockReward) assert %{first_block_number: ^block_number, missing_block_count: 1, shrunk: false} = Fetcher.task(%Fetcher{ diff --git a/apps/indexer/test/indexer/sequence_test.exs b/apps/indexer/test/indexer/block/catchup/sequence_test.exs similarity index 98% rename from apps/indexer/test/indexer/sequence_test.exs rename to apps/indexer/test/indexer/block/catchup/sequence_test.exs index 49933c85fb..ea46d6e159 100644 --- a/apps/indexer/test/indexer/sequence_test.exs +++ b/apps/indexer/test/indexer/block/catchup/sequence_test.exs @@ -1,8 +1,8 @@ -defmodule Indexer.SequenceTest do +defmodule Indexer.Block.Catchup.SequenceTest do use ExUnit.Case + alias Indexer.Block.Catchup.Sequence alias Indexer.Memory.Shrinkable - alias Indexer.Sequence describe "start_link/1" do test "without :ranges with :first with positive step pops infinitely" do diff --git a/apps/indexer/test/indexer/block/fetcher_test.exs b/apps/indexer/test/indexer/block/fetcher_test.exs index 542b278df2..3b7dd4bcff 100644 --- a/apps/indexer/test/indexer/block/fetcher_test.exs +++ b/apps/indexer/test/indexer/block/fetcher_test.exs @@ -9,8 +9,18 @@ defmodule Indexer.Block.FetcherTest do alias Explorer.Chain alias Explorer.Chain.{Address, Log, Transaction, Wei} - alias Indexer.{CoinBalance, BufferedTask, Code, InternalTransaction, ReplacedTransaction, Token, TokenBalance} - alias Indexer.Block.{Fetcher, Uncle} + alias Indexer.Block.Fetcher + alias Indexer.BufferedTask + + alias Indexer.Fetcher.{ + CoinBalance, + ContractCode, + InternalTransaction, + ReplacedTransaction, + Token, + TokenBalance, + UncleBlock + } @moduletag capture_log: true @@ -41,13 +51,13 @@ defmodule Indexer.Block.FetcherTest do describe "import_range/2" do setup %{json_rpc_named_arguments: json_rpc_named_arguments} do CoinBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) - Code.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) + ContractCode.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) InternalTransaction.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) Token.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) TokenBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) ReplacedTransaction.Supervisor.Case.start_supervised!() - Uncle.Supervisor.Case.start_supervised!( + UncleBlock.Supervisor.Case.start_supervised!( block_fetcher: %Fetcher{json_rpc_named_arguments: json_rpc_named_arguments} ) @@ -226,8 +236,8 @@ defmodule Indexer.Block.FetcherTest do errors: [] }} = result - wait_for_tasks(InternalTransaction.Fetcher) - wait_for_tasks(CoinBalance.Fetcher) + wait_for_tasks(InternalTransaction) + wait_for_tasks(CoinBalance) assert Repo.aggregate(Chain.Block, :count, :hash) == 1 assert Repo.aggregate(Address, :count, :hash) == 1 @@ -492,8 +502,8 @@ defmodule Indexer.Block.FetcherTest do ] }} = Fetcher.fetch_and_import_range(block_fetcher, block_number..block_number) - wait_for_tasks(InternalTransaction.Fetcher) - wait_for_tasks(CoinBalance.Fetcher) + wait_for_tasks(InternalTransaction) + wait_for_tasks(CoinBalance) assert Repo.aggregate(Block, :count, :hash) == 1 assert Repo.aggregate(Address, :count, :hash) == 5 @@ -587,8 +597,8 @@ defmodule Indexer.Block.FetcherTest do errors: [] }} = Fetcher.fetch_and_import_range(block_fetcher, block_number..block_number) - wait_for_tasks(InternalTransaction.Fetcher) - wait_for_tasks(CoinBalance.Fetcher) + wait_for_tasks(InternalTransaction) + wait_for_tasks(CoinBalance) assert Repo.aggregate(Chain.Block, :count, :hash) == 1 assert Repo.aggregate(Address, :count, :hash) == 2 diff --git a/apps/indexer/test/indexer/block/realtime/fetcher_test.exs b/apps/indexer/test/indexer/block/realtime/fetcher_test.exs index 82b72d7304..f222805d26 100644 --- a/apps/indexer/test/indexer/block/realtime/fetcher_test.exs +++ b/apps/indexer/test/indexer/block/realtime/fetcher_test.exs @@ -6,8 +6,9 @@ defmodule Indexer.Block.Realtime.FetcherTest do alias Explorer.Chain alias Explorer.Chain.{Address, Transaction} - alias Indexer.{Sequence, Token, TokenBalance, ReplacedTransaction} - alias Indexer.Block.{Realtime, Uncle} + alias Indexer.Block.Catchup.Sequence + alias Indexer.Block.Realtime + alias Indexer.Fetcher.{ContractCode, InternalTransaction, ReplacedTransaction, Token, TokenBalance, UncleBlock} @moduletag capture_log: true @@ -50,7 +51,11 @@ defmodule Indexer.Block.Realtime.FetcherTest do Token.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) - Uncle.Supervisor.Case.start_supervised!( + ContractCode.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) + + InternalTransaction.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) + + UncleBlock.Supervisor.Case.start_supervised!( block_fetcher: %Indexer.Block.Fetcher{json_rpc_named_arguments: json_rpc_named_arguments} ) @@ -200,11 +205,18 @@ defmodule Indexer.Block.Realtime.FetcherTest do } ]} end) - |> expect(:json_rpc, fn [%{method: "trace_block"}, %{method: "trace_block"}] = requests, _options -> - responses = Enum.map(requests, fn %{id: id} -> %{id: id, result: []} end) - {:ok, responses} - end) |> expect(:json_rpc, 2, fn + [ + %{id: 0, jsonrpc: "2.0", method: "trace_block", params: ["0x3C365F"]}, + %{id: 1, jsonrpc: "2.0", method: "trace_block", params: ["0x3C3660"]} + ], + _ -> + {:ok, + [ + %{id: 0, jsonrpc: "2.0", result: []}, + %{id: 1, jsonrpc: "2.0", result: []} + ]} + [ %{ id: 0, @@ -346,28 +358,22 @@ defmodule Indexer.Block.Realtime.FetcherTest do id: 0, jsonrpc: "2.0", method: "eth_getBalance", - params: ["0x11c4469d974f8af5ba9ec99f3c42c07c848c861c", "0x3C365F"] - }, - %{ - id: 1, - jsonrpc: "2.0", - method: "eth_getBalance", params: ["0x40b18103537c0f15d5e137dd8ddd019b84949d16", "0x3C365F"] }, %{ - id: 2, + id: 1, jsonrpc: "2.0", method: "eth_getBalance", params: ["0x5ee341ac44d344ade1ca3a771c59b98eb2a77df2", "0x3C365F"] }, %{ - id: 3, + id: 2, jsonrpc: "2.0", method: "eth_getBalance", params: ["0x66c9343c7e8ca673a1fedf9dbf2cd7936dbbf7e3", "0x3C3660"] }, %{ - id: 4, + id: 3, jsonrpc: "2.0", method: "eth_getBalance", params: ["0x698bf6943bab687b2756394624aa183f434f65da", "0x3C365F"] @@ -376,11 +382,10 @@ defmodule Indexer.Block.Realtime.FetcherTest do _ -> {:ok, [ - %{id: 0, jsonrpc: "2.0", result: "0x49e3de5187cf037d127"}, - %{id: 1, jsonrpc: "2.0", result: "0x148adc763b603291685"}, - %{id: 2, jsonrpc: "2.0", result: "0x53474fa377a46000"}, - %{id: 3, jsonrpc: "2.0", result: "0x53507afe51f28000"}, - %{id: 4, jsonrpc: "2.0", result: "0x3e1a95d7517dc197108"} + %{id: 0, jsonrpc: "2.0", result: "0x148adc763b603291685"}, + %{id: 1, jsonrpc: "2.0", result: "0x53474fa377a46000"}, + %{id: 2, jsonrpc: "2.0", result: "0x53507afe51f28000"}, + %{id: 3, jsonrpc: "2.0", result: "0x3e1a95d7517dc197108"} ]} end) end @@ -391,9 +396,8 @@ defmodule Indexer.Block.Realtime.FetcherTest do addresses: [ %Address{hash: first_address_hash, fetched_coin_balance_block_number: 3_946_079}, %Address{hash: second_address_hash, fetched_coin_balance_block_number: 3_946_079}, - %Address{hash: third_address_hash, fetched_coin_balance_block_number: 3_946_079}, - %Address{hash: fourth_address_hash, fetched_coin_balance_block_number: 3_946_080}, - %Address{hash: fifth_address_hash, fetched_coin_balance_block_number: 3_946_079} + %Address{hash: third_address_hash, fetched_coin_balance_block_number: 3_946_080}, + %Address{hash: fourth_address_hash, fetched_coin_balance_block_number: 3_946_079} ], address_coin_balances: [ %{ @@ -406,26 +410,14 @@ defmodule Indexer.Block.Realtime.FetcherTest do }, %{ address_hash: third_address_hash, - block_number: 3_946_079 - }, - %{ - address_hash: fourth_address_hash, block_number: 3_946_080 }, %{ - address_hash: fifth_address_hash, + address_hash: fourth_address_hash, block_number: 3_946_079 } ], blocks: [%Chain.Block{number: 3_946_079}, %Chain.Block{number: 3_946_080}], - internal_transactions: [ - %{index: 0, transaction_hash: transaction_hash}, - %{index: 1, transaction_hash: transaction_hash}, - %{index: 2, transaction_hash: transaction_hash}, - %{index: 3, transaction_hash: transaction_hash}, - %{index: 4, transaction_hash: transaction_hash}, - %{index: 5, transaction_hash: transaction_hash} - ], transactions: [%Transaction{hash: transaction_hash}] }, errors: [] diff --git a/apps/indexer/test/indexer/block/util_test.exs b/apps/indexer/test/indexer/block/util_test.exs deleted file mode 100644 index f0228cb1be..0000000000 --- a/apps/indexer/test/indexer/block/util_test.exs +++ /dev/null @@ -1,40 +0,0 @@ -defmodule Indexer.Block.UtilTest do - use ExUnit.Case - - alias Indexer.Block.Util - - test "signer/1" do - data = %{ - difficulty: 1, - extra_data: - "0xd68301080d846765746886676f312e3130856c696e7578000000000000000000773ab2ca8f47904a14739ad80a75b71d9d29b9fff8b7ecdcb73efffa6f74122f17d304b5dc8e6e5f256c9474dd115c8d4dae31b7a3d409e5c3270f8fde41cd8c00", - gas_limit: 7_753_377, - gas_used: 1_810_195, - hash: "0x7004c895e812c55b0c2be8a46d72ca300a683dc27d1d7917ee7742d4d0359c1f", - logs_bloom: - "0x00000000000000020000000000002000000400000000000000000000000000000000000000000000040000080004000020000010000000000000000000000000000000000000000008000008000000000000000000200000000000000000000000000000020000000000000000000800000000000000804000000010080000000800000000000000000000000000000000000000000000800000000000080000000008000400000000404000000000000000000000000200000000000000000000000002000000000000001002000000000000002000000008000000000020000000000000000000000000000000000000000000000000400000800000000000", - miner_hash: "0x0000000000000000000000000000000000000000", - mix_hash: "0x0000000000000000000000000000000000000000000000000000000000000000", - nonce: "0x0000000000000000", - number: 2_848_394, - parent_hash: "0x20350fc367e19d3865be1ea7da72ab81f8f9941c43ac6bb24a34a0a7caa2f3df", - receipts_root: "0x6ade4ac1079ea50cfadcce2b75ffbe4f9b14bf69b4607bbf1739463076ca6246", - sha3_uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - size: 6437, - state_root: "0x23f63347851bcd109059d007d71e19c4f5e73b7f0862bebcd04458333a004d92", - timestamp: DateTime.from_unix!(1_534_796_040), - total_difficulty: 5_353_647, - transactions: [ - "0x7e3bb851fc74a436826d2af6b96e4db9484431811ef0d9c9e78370488d33d4e5", - "0x3976fd1e3d2a715c3cfcfde9bd3210798c26c017b8edb841d319227ecb3322fb", - "0xd8db124005bb8b6fda7b71fd56ac782552a66af58fe843ba3c4930423b87d1d2", - "0x10c1a1ca4d9f4b2bd5b89f7bbcbbc2d69e166fe23662b8db4f6beae0f50ac9fd", - "0xaa58a6545677c796a56b8bc874174c8cfd31a6c6e6ca3a87e086d4f66d52858a" - ], - transactions_root: "0xde8d25c0b9b54310128a21601331094b43f910f9f96102869c2e2dca94884bf4", - uncles: [] - } - - assert Util.signer(data) == "0xfc18cbc391de84dbd87db83b20935d3e89f5dd91" - end -end diff --git a/apps/indexer/test/indexer/block/reward/fetcher_test.exs b/apps/indexer/test/indexer/fetcher/block_reward_test.exs similarity index 93% rename from apps/indexer/test/indexer/block/reward/fetcher_test.exs rename to apps/indexer/test/indexer/fetcher/block_reward_test.exs index 39ba7de998..85d31b6d05 100644 --- a/apps/indexer/test/indexer/block/reward/fetcher_test.exs +++ b/apps/indexer/test/indexer/fetcher/block_reward_test.exs @@ -1,4 +1,4 @@ -defmodule Indexer.Block.Reward.FetcherTest do +defmodule Indexer.Fetcher.BlockRewardTest do # MUST be `async: false` so that {:shared, pid} is set for connection to allow CoinBalanceFetcher's self-send to have # connection allowed immediately. use EthereumJSONRPC.Case, async: false @@ -9,8 +9,8 @@ defmodule Indexer.Block.Reward.FetcherTest do alias Explorer.Chain alias Explorer.Chain.{Block, Hash, Wei} - alias Indexer.Block.Reward alias Indexer.BufferedTask + alias Indexer.Fetcher.BlockReward @moduletag :capture_log @@ -37,32 +37,32 @@ defmodule Indexer.Block.Reward.FetcherTest do describe "init/3" do test "without blocks" do - assert [] = Reward.Fetcher.init([], &[&1 | &2], nil) + assert [] = BlockReward.init([], &[&1 | &2], nil) end test "with consensus block without reward" do %Block{number: block_number} = insert(:block) - assert [^block_number] = Reward.Fetcher.init([], &[&1 | &2], nil) + assert [^block_number] = BlockReward.init([], &[&1 | &2], nil) end test "with consensus block with reward" do block = insert(:block) insert(:reward, address_hash: block.miner_hash, block_hash: block.hash) - assert [] = Reward.Fetcher.init([], &[&1 | &2], nil) + assert [] = BlockReward.init([], &[&1 | &2], nil) end test "with non-consensus block" do insert(:block, consensus: false) - assert [] = Reward.Fetcher.init([], &[&1 | &2], nil) + assert [] = BlockReward.init([], &[&1 | &2], nil) end end describe "async_fetch/1" do setup %{json_rpc_named_arguments: json_rpc_named_arguments} do - Reward.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) + BlockReward.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) block = insert(:block) @@ -130,11 +130,11 @@ defmodule Indexer.Block.Reward.FetcherTest do end end) - Process.register(pid, Indexer.CoinBalance.Fetcher) + Process.register(pid, Indexer.Fetcher.CoinBalance) - assert :ok = Reward.Fetcher.async_fetch([block_number]) + assert :ok = BlockReward.async_fetch([block_number]) - wait_for_tasks(Reward.Fetcher) + wait_for_tasks(BlockReward) assert count(Chain.Block.Reward) == 1 assert_receive {:balance_fields, [{^miner_hash_bytes, ^block_number}]}, 500 @@ -201,11 +201,11 @@ defmodule Indexer.Block.Reward.FetcherTest do end end) - Process.register(pid, Indexer.CoinBalance.Fetcher) + Process.register(pid, Indexer.Fetcher.CoinBalance) - assert :ok = Reward.Fetcher.async_fetch([block_number]) + assert :ok = BlockReward.async_fetch([block_number]) - wait_for_tasks(Reward.Fetcher) + wait_for_tasks(BlockReward) assert count(Chain.Block.Reward) == 1 assert_receive {:balance_fields, [{^miner_hash_bytes, ^block_number}]}, 500 @@ -256,9 +256,9 @@ defmodule Indexer.Block.Reward.FetcherTest do } end) - assert :ok = Reward.Fetcher.async_fetch([block_number]) + assert :ok = BlockReward.async_fetch([block_number]) - wait_for_tasks(Reward.Fetcher) + wait_for_tasks(BlockReward) assert count(Chain.Block.Reward) == 0 end @@ -334,9 +334,9 @@ defmodule Indexer.Block.Reward.FetcherTest do end end) - Process.register(pid, Indexer.CoinBalance.Fetcher) + Process.register(pid, Indexer.Fetcher.CoinBalance) - assert :ok = Reward.Fetcher.run([block_number], json_rpc_named_arguments) + assert :ok = BlockReward.run([block_number], json_rpc_named_arguments) assert count(Chain.Block.Reward) == 1 assert count(Chain.Address.CoinBalance) == 1 @@ -422,9 +422,9 @@ defmodule Indexer.Block.Reward.FetcherTest do end end) - Process.register(pid, Indexer.CoinBalance.Fetcher) + Process.register(pid, Indexer.Fetcher.CoinBalance) - assert :ok = Reward.Fetcher.run([block_number], json_rpc_named_arguments) + assert :ok = BlockReward.run([block_number], json_rpc_named_arguments) assert count(Chain.Block.Reward) == 2 assert count(Chain.Address.CoinBalance) == 2 @@ -504,9 +504,9 @@ defmodule Indexer.Block.Reward.FetcherTest do end end) - Process.register(pid, Indexer.CoinBalance.Fetcher) + Process.register(pid, Indexer.Fetcher.CoinBalance) - assert :ok = Reward.Fetcher.run([block_number], json_rpc_named_arguments) + assert :ok = BlockReward.run([block_number], json_rpc_named_arguments) assert count(Chain.Block.Reward) == 1 assert count(Chain.Address.CoinBalance) == 1 @@ -565,7 +565,7 @@ defmodule Indexer.Block.Reward.FetcherTest do } end) - assert :ok = Reward.Fetcher.run([block_number], json_rpc_named_arguments) + assert :ok = BlockReward.run([block_number], json_rpc_named_arguments) assert count(Chain.Block.Reward) == 0 assert count(Chain.Address.CoinBalance) == 0 @@ -639,10 +639,10 @@ defmodule Indexer.Block.Reward.FetcherTest do end end) - Process.register(pid, Indexer.CoinBalance.Fetcher) + Process.register(pid, Indexer.Fetcher.CoinBalance) assert {:retry, [^error_block_number]} = - Reward.Fetcher.run([block_number, error_block_number], json_rpc_named_arguments) + BlockReward.run([block_number, error_block_number], json_rpc_named_arguments) assert count(Chain.Block.Reward) == 1 assert count(Chain.Address.CoinBalance) == 1 diff --git a/apps/indexer/test/indexer/coin_balance/on_demand_fetcher_test.exs b/apps/indexer/test/indexer/fetcher/coin_balance_on_demand_test.exs similarity index 89% rename from apps/indexer/test/indexer/coin_balance/on_demand_fetcher_test.exs rename to apps/indexer/test/indexer/fetcher/coin_balance_on_demand_test.exs index 590ac6b7da..985b976a81 100644 --- a/apps/indexer/test/indexer/coin_balance/on_demand_fetcher_test.exs +++ b/apps/indexer/test/indexer/fetcher/coin_balance_on_demand_test.exs @@ -1,4 +1,4 @@ -defmodule Indexer.CoinBalance.OnDemandFetcherTest do +defmodule Indexer.Fetcher.CoinBalanceOnDemandTest do # MUST be `async: false` so that {:shared, pid} is set for connection to allow CoinBalanceFetcher's self-send to have # connection allowed immediately. use EthereumJSONRPC.Case, async: false @@ -9,7 +9,7 @@ defmodule Indexer.CoinBalance.OnDemandFetcherTest do alias Explorer.Chain.Events.Subscriber alias Explorer.Chain.Wei alias Explorer.Counters.AverageBlockTime - alias Indexer.CoinBalance.OnDemandFetcher + alias Indexer.Fetcher.CoinBalanceOnDemand @moduletag :capture_log @@ -24,7 +24,7 @@ defmodule Indexer.CoinBalance.OnDemandFetcherTest do start_supervised!({Task.Supervisor, name: Indexer.TaskSupervisor}) start_supervised!(AverageBlockTime) - start_supervised!({OnDemandFetcher, [mocked_json_rpc_named_arguments, [name: OnDemandFetcher]]}) + start_supervised!({CoinBalanceOnDemand, [mocked_json_rpc_named_arguments, [name: CoinBalanceOnDemand]]}) Application.put_env(:explorer, AverageBlockTime, enabled: true) @@ -57,25 +57,25 @@ defmodule Indexer.CoinBalance.OnDemandFetcherTest do test "treats all addresses as current if the average block time is disabled", %{stale_address: address} do Application.put_env(:explorer, AverageBlockTime, enabled: false) - assert OnDemandFetcher.trigger_fetch(address) == :current + assert CoinBalanceOnDemand.trigger_fetch(address) == :current end test "if the address has not been fetched within the last 24 hours of blocks it is considered stale", %{ stale_address: address } do - assert OnDemandFetcher.trigger_fetch(address) == {:stale, 1} + assert CoinBalanceOnDemand.trigger_fetch(address) == {:stale, 1} end test "if the address has been fetched within the last 24 hours of blocks it is considered current", %{ current_address: address } do - assert OnDemandFetcher.trigger_fetch(address) == :current + assert CoinBalanceOnDemand.trigger_fetch(address) == :current end test "if there is an unfetched balance within the window for an address, it is considered pending", %{ pending_address: pending_address } do - assert OnDemandFetcher.trigger_fetch(pending_address) == {:pending, 2} + assert CoinBalanceOnDemand.trigger_fetch(pending_address) == {:pending, 2} end end @@ -111,7 +111,7 @@ defmodule Indexer.CoinBalance.OnDemandFetcherTest do {:ok, [%{id: id, jsonrpc: "2.0", result: "0x02"}]} end) - assert OnDemandFetcher.trigger_fetch(address) == {:stale, 1} + assert CoinBalanceOnDemand.trigger_fetch(address) == {:stale, 1} {:ok, expected_wei} = Wei.cast(2) @@ -138,7 +138,7 @@ defmodule Indexer.CoinBalance.OnDemandFetcherTest do {:ok, [%{id: id, jsonrpc: "2.0", result: "0x02"}]} end) - assert OnDemandFetcher.trigger_fetch(address) == {:pending, 2} + assert CoinBalanceOnDemand.trigger_fetch(address) == {:pending, 2} {:ok, expected_wei} = Wei.cast(2) diff --git a/apps/indexer/test/indexer/coin_balance/fetcher_test.exs b/apps/indexer/test/indexer/fetcher/coin_balance_test.exs similarity index 96% rename from apps/indexer/test/indexer/coin_balance/fetcher_test.exs rename to apps/indexer/test/indexer/fetcher/coin_balance_test.exs index 155e77abb2..94fbf9f774 100644 --- a/apps/indexer/test/indexer/coin_balance/fetcher_test.exs +++ b/apps/indexer/test/indexer/fetcher/coin_balance_test.exs @@ -1,4 +1,4 @@ -defmodule Indexer.CoinBalance.FetcherTest do +defmodule Indexer.Fetcher.CoinBalanceTest do # MUST be `async: false` so that {:shared, pid} is set for connection to allow CoinBalanceFetcher's self-send to have # connection allowed immediately. use EthereumJSONRPC.Case, async: false @@ -8,7 +8,7 @@ defmodule Indexer.CoinBalance.FetcherTest do import Mox alias Explorer.Chain.{Address, Hash, Wei} - alias Indexer.CoinBalance + alias Indexer.Fetcher.CoinBalance @moduletag :capture_log @@ -182,7 +182,7 @@ defmodule Indexer.CoinBalance.FetcherTest do CoinBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) - assert :ok = CoinBalance.Fetcher.async_fetch_balances([%{address_hash: hash, block_number: block_number}]) + assert :ok = CoinBalance.async_fetch_balances([%{address_hash: hash, block_number: block_number}]) address = wait(fn -> @@ -254,7 +254,7 @@ defmodule Indexer.CoinBalance.FetcherTest do {:ok, %Hash{bytes: address_hash_bytes}} = Hash.Address.cast(hash_data) entries = Enum.map(block_quantities, &{address_hash_bytes, quantity_to_integer(&1)}) - case CoinBalance.Fetcher.run(entries, json_rpc_named_arguments) do + case CoinBalance.run(entries, json_rpc_named_arguments) do :ok -> balances = Repo.all(from(balance in Address.CoinBalance, where: balance.address_hash == ^hash_data)) @@ -309,7 +309,7 @@ defmodule Indexer.CoinBalance.FetcherTest do {:ok, [%{id: id, error: %{code: 1, message: "Bad"}}]} end) - assert {:retry, ^entries} = CoinBalance.Fetcher.run(entries, json_rpc_named_arguments) + assert {:retry, ^entries} = CoinBalance.run(entries, json_rpc_named_arguments) end test "retries none if all imported and no fetch errors", %{json_rpc_named_arguments: json_rpc_named_arguments} do @@ -320,7 +320,7 @@ defmodule Indexer.CoinBalance.FetcherTest do {:ok, [%{id: id, result: "0x1"}]} end) - assert :ok = CoinBalance.Fetcher.run(entries, json_rpc_named_arguments) + assert :ok = CoinBalance.run(entries, json_rpc_named_arguments) end test "retries retries fetch errors if all imported", %{json_rpc_named_arguments: json_rpc_named_arguments} do @@ -360,7 +360,7 @@ defmodule Indexer.CoinBalance.FetcherTest do end) assert {:retry, [{^address_hash_bytes, ^bad_block_number}]} = - CoinBalance.Fetcher.run( + CoinBalance.run( [{address_hash_bytes, good_block_number}, {address_hash_bytes, bad_block_number}], json_rpc_named_arguments ) diff --git a/apps/indexer/test/indexer/code/fetcher_test.exs b/apps/indexer/test/indexer/fetcher/contract_code_test.exs similarity index 98% rename from apps/indexer/test/indexer/code/fetcher_test.exs rename to apps/indexer/test/indexer/fetcher/contract_code_test.exs index 0debf679e4..210bafc818 100644 --- a/apps/indexer/test/indexer/code/fetcher_test.exs +++ b/apps/indexer/test/indexer/fetcher/contract_code_test.exs @@ -1,4 +1,4 @@ -defmodule Indexer.Code.FetcherTest do +defmodule Indexer.Fetcher.ContractCodeTest do use EthereumJSONRPC.Case, async: false use Explorer.DataCase @@ -7,7 +7,7 @@ defmodule Indexer.Code.FetcherTest do import Mox alias Explorer.Chain.{Address, Transaction} - alias Indexer.Code + alias Indexer.Fetcher.ContractCode @moduletag :capture_log @@ -83,10 +83,10 @@ defmodule Indexer.Code.FetcherTest do insert(:address, hash: address) insert(:transaction, hash: hash, created_contract_address_hash: address) - Code.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) + ContractCode.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) assert :ok = - Code.Fetcher.async_fetch([ + ContractCode.async_fetch([ %{created_contract_address_hash: address, block_number: block_number, hash: hash} ]) diff --git a/apps/indexer/test/indexer/internal_transaction/fetcher_test.exs b/apps/indexer/test/indexer/fetcher/internal_transaction_test.exs similarity index 94% rename from apps/indexer/test/indexer/internal_transaction/fetcher_test.exs rename to apps/indexer/test/indexer/fetcher/internal_transaction_test.exs index b90e99aac0..4807234df6 100644 --- a/apps/indexer/test/indexer/internal_transaction/fetcher_test.exs +++ b/apps/indexer/test/indexer/fetcher/internal_transaction_test.exs @@ -1,4 +1,4 @@ -defmodule Indexer.InternalTransaction.FetcherTest do +defmodule Indexer.Fetcher.InternalTransactionTest do use EthereumJSONRPC.Case, async: false use Explorer.DataCase @@ -6,8 +6,7 @@ defmodule Indexer.InternalTransaction.FetcherTest do import Mox alias Explorer.Chain.{Address, Hash, Transaction} - - alias Indexer.{CoinBalance, InternalTransaction, PendingTransaction} + alias Indexer.Fetcher.{CoinBalance, InternalTransaction, PendingTransaction} # MUST use global mode because we aren't guaranteed to get PendingTransactionFetcher's pid back fast enough to `allow` # it to use expectations and stubs from test's pid. @@ -17,7 +16,7 @@ defmodule Indexer.InternalTransaction.FetcherTest do @moduletag [capture_log: true, no_geth: true] - test "does not try to fetch pending transactions from Indexer.PendingTransaction.Fetcher", %{ + test "does not try to fetch pending transactions from Indexer.Fetcher.PendingTransaction", %{ json_rpc_named_arguments: json_rpc_named_arguments } do if json_rpc_named_arguments[:transport] == EthereumJSONRPC.Mox do @@ -71,9 +70,9 @@ defmodule Indexer.InternalTransaction.FetcherTest do end) hash_strings = - InternalTransaction.Fetcher.init([], fn hash_string, acc -> [hash_string | acc] end, json_rpc_named_arguments) + InternalTransaction.init([], fn hash_string, acc -> [hash_string | acc] end, json_rpc_named_arguments) - assert :ok = InternalTransaction.Fetcher.run(hash_strings, json_rpc_named_arguments) + assert :ok = InternalTransaction.run(hash_strings, json_rpc_named_arguments) end @tag :no_geth @@ -102,9 +101,9 @@ defmodule Indexer.InternalTransaction.FetcherTest do block_number = 1_000_006 insert(:block, number: block_number) - assert :ok = InternalTransaction.Fetcher.run([block_number], json_rpc_named_arguments) + assert :ok = InternalTransaction.run([block_number], json_rpc_named_arguments) - assert InternalTransaction.Fetcher.init( + assert InternalTransaction.init( [], fn block_number, acc -> [block_number | acc] end, json_rpc_named_arguments @@ -115,7 +114,7 @@ defmodule Indexer.InternalTransaction.FetcherTest do test "does not buffer pending transactions", %{json_rpc_named_arguments: json_rpc_named_arguments} do insert(:transaction) - assert InternalTransaction.Fetcher.init( + assert InternalTransaction.init( [], fn hash_string, acc -> [hash_string | acc] end, json_rpc_named_arguments @@ -133,7 +132,7 @@ defmodule Indexer.InternalTransaction.FetcherTest do |> insert() |> with_block(block) - assert InternalTransaction.Fetcher.init( + assert InternalTransaction.init( [], fn hash_string, acc -> [hash_string | acc] end, json_rpc_named_arguments @@ -148,7 +147,7 @@ defmodule Indexer.InternalTransaction.FetcherTest do |> insert() |> with_block(internal_transactions_indexed_at: DateTime.utc_now()) - assert InternalTransaction.Fetcher.init( + assert InternalTransaction.init( [], fn hash_string, acc -> [hash_string | acc] end, json_rpc_named_arguments @@ -161,7 +160,7 @@ defmodule Indexer.InternalTransaction.FetcherTest do } do block = insert(:block) - assert InternalTransaction.Fetcher.init( + assert InternalTransaction.init( [], fn block_number, acc -> [block_number | acc] end, json_rpc_named_arguments @@ -174,7 +173,7 @@ defmodule Indexer.InternalTransaction.FetcherTest do } do insert(:block, internal_transactions_indexed_at: DateTime.utc_now()) - assert InternalTransaction.Fetcher.init( + assert InternalTransaction.init( [], fn block_number, acc -> [block_number | acc] end, json_rpc_named_arguments @@ -198,7 +197,7 @@ defmodule Indexer.InternalTransaction.FetcherTest do log = capture_log(fn -> - InternalTransaction.Fetcher.run( + InternalTransaction.run( [ {1, bytes, 0}, {1, bytes, 0} @@ -276,7 +275,7 @@ defmodule Indexer.InternalTransaction.FetcherTest do |> with_block() :ok = - InternalTransaction.Fetcher.run( + InternalTransaction.run( [ {7_202_692, bytes, 0} ], @@ -305,7 +304,7 @@ defmodule Indexer.InternalTransaction.FetcherTest do %Transaction{hash: %Hash{bytes: bytes}} = insert(:transaction, hash: "0x0000000000000000000000000000000000000000000000000000000000000001") - assert InternalTransaction.Fetcher.run( + assert InternalTransaction.run( [ {1, bytes, 0}, {1, bytes, 0} diff --git a/apps/indexer/test/indexer/pending_transaction/fetcher_test.exs b/apps/indexer/test/indexer/fetcher/pending_transaction_test.exs similarity index 98% rename from apps/indexer/test/indexer/pending_transaction/fetcher_test.exs rename to apps/indexer/test/indexer/fetcher/pending_transaction_test.exs index 0b45eb4a98..7d4b1c7ea7 100644 --- a/apps/indexer/test/indexer/pending_transaction/fetcher_test.exs +++ b/apps/indexer/test/indexer/fetcher/pending_transaction_test.exs @@ -1,4 +1,4 @@ -defmodule Indexer.PendingTransactionFetcherTest do +defmodule Indexer.Fetcher.PendingTransactionTest do # `async: false` due to use of named GenServer use EthereumJSONRPC.Case, async: false use Explorer.DataCase @@ -6,7 +6,7 @@ defmodule Indexer.PendingTransactionFetcherTest do import Mox alias Explorer.Chain.Transaction - alias Indexer.PendingTransaction + alias Indexer.Fetcher.PendingTransaction # MUST use global mode because we aren't guaranteed to get PendingTransactionFetcher's pid back fast enough to `allow` # it to use expectations and stubs from test's pid. diff --git a/apps/indexer/test/indexer/replaced_transaction/fetcher_test.exs b/apps/indexer/test/indexer/fetcher/replaced_transaction_test.exs similarity index 96% rename from apps/indexer/test/indexer/replaced_transaction/fetcher_test.exs rename to apps/indexer/test/indexer/fetcher/replaced_transaction_test.exs index 8b2b61b80e..ab3da8d1e6 100644 --- a/apps/indexer/test/indexer/replaced_transaction/fetcher_test.exs +++ b/apps/indexer/test/indexer/fetcher/replaced_transaction_test.exs @@ -1,8 +1,8 @@ -defmodule Indexer.ReplacedTransaction.FetcherTest do +defmodule Indexer.Fetcher.ReplacedTransactionTest do use Explorer.DataCase alias Explorer.Chain.{Transaction} - alias Indexer.ReplacedTransaction + alias Indexer.Fetcher.ReplacedTransaction @moduletag :capture_log @@ -71,7 +71,7 @@ defmodule Indexer.ReplacedTransaction.FetcherTest do ReplacedTransaction.Supervisor.Case.start_supervised!() assert :ok = - ReplacedTransaction.Fetcher.async_fetch([ + ReplacedTransaction.async_fetch([ %{ block_hash: mined_transaction.block_hash, nonce: mined_transaction.nonce, @@ -160,7 +160,7 @@ defmodule Indexer.ReplacedTransaction.FetcherTest do ReplacedTransaction.Supervisor.Case.start_supervised!() # assert :ok = - # ReplacedTransaction.Fetcher.async_fetch([ + # ReplacedTransaction.async_fetch([ # %{ # block_hash: mined_transaction.block_hash, # nonce: mined_transaction.nonce, diff --git a/apps/indexer/test/indexer/token_balance/fetcher_test.exs b/apps/indexer/test/indexer/fetcher/token_balance_test.exs similarity index 90% rename from apps/indexer/test/indexer/token_balance/fetcher_test.exs rename to apps/indexer/test/indexer/fetcher/token_balance_test.exs index 9f5d392c15..2602568be8 100644 --- a/apps/indexer/test/indexer/token_balance/fetcher_test.exs +++ b/apps/indexer/test/indexer/fetcher/token_balance_test.exs @@ -1,11 +1,11 @@ -defmodule Indexer.TokenBalance.FetcherTest do +defmodule Indexer.Fetcher.TokenBalanceTest do use EthereumJSONRPC.Case use Explorer.DataCase import Mox alias Explorer.Chain.{Address, Hash} - alias Indexer.TokenBalance + alias Indexer.Fetcher.TokenBalance @moduletag :capture_log @@ -22,7 +22,7 @@ defmodule Indexer.TokenBalance.FetcherTest do insert(:token_balance, value_fetched_at: DateTime.utc_now()) - assert TokenBalance.Fetcher.init([], &[&1 | &2], nil) == [ + assert TokenBalance.init([], &[&1 | &2], nil) == [ {address_hash_bytes, token_contract_address_hash_bytes, block_number, 0} ] end @@ -57,7 +57,7 @@ defmodule Indexer.TokenBalance.FetcherTest do end ) - assert TokenBalance.Fetcher.run( + assert TokenBalance.run( [{address_hash_bytes, token_contract_address_hash_bytes, block_number, 0}], nil ) == :ok @@ -109,13 +109,13 @@ defmodule Indexer.TokenBalance.FetcherTest do } ] - assert TokenBalance.Fetcher.run(token_balances, nil) == :ok + assert TokenBalance.run(token_balances, nil) == :ok end end describe "import_token_balances/1" do test "ignores when it receives a empty list" do - assert TokenBalance.Fetcher.import_token_balances([]) == :ok + assert TokenBalance.import_token_balances([]) == :ok end test "returns :error when the token balances has invalid data" do @@ -131,7 +131,7 @@ defmodule Indexer.TokenBalance.FetcherTest do } ] - assert TokenBalance.Fetcher.import_token_balances(token_balances_params) == :error + assert TokenBalance.import_token_balances(token_balances_params) == :error end test "insert the missing address, import the token balances and return :ok when the address does not exist yet" do @@ -147,7 +147,7 @@ defmodule Indexer.TokenBalance.FetcherTest do ] {:ok, address_hash} = Explorer.Chain.string_to_address_hash("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF") - assert TokenBalance.Fetcher.import_token_balances(token_balances_params) == :ok + assert TokenBalance.import_token_balances(token_balances_params) == :ok assert {:ok, _} = Explorer.Chain.hash_to_address(address_hash) end @@ -169,7 +169,7 @@ defmodule Indexer.TokenBalance.FetcherTest do } ] - assert TokenBalance.Fetcher.import_token_balances(token_balances_params) == :ok + assert TokenBalance.import_token_balances(token_balances_params) == :ok end end end diff --git a/apps/indexer/test/indexer/token/fetcher_test.exs b/apps/indexer/test/indexer/fetcher/token_test.exs similarity index 91% rename from apps/indexer/test/indexer/token/fetcher_test.exs rename to apps/indexer/test/indexer/fetcher/token_test.exs index d3e56d7712..d9494d097f 100644 --- a/apps/indexer/test/indexer/token/fetcher_test.exs +++ b/apps/indexer/test/indexer/fetcher/token_test.exs @@ -1,4 +1,4 @@ -defmodule Indexer.Token.FetcherTest do +defmodule Indexer.Fetcher.TokenTest do use EthereumJSONRPC.Case use Explorer.DataCase @@ -6,7 +6,7 @@ defmodule Indexer.Token.FetcherTest do alias Explorer.Chain alias Explorer.Chain.Token - alias Indexer.Token.Fetcher + alias Indexer.Fetcher.Token, as: TokenFetcher setup :verify_on_exit! @@ -15,7 +15,7 @@ defmodule Indexer.Token.FetcherTest do insert(:token, cataloged: true) %Token{contract_address_hash: uncatalog_address} = insert(:token, cataloged: false) - assert Fetcher.init([], &[&1 | &2], json_rpc_named_arguments) == [uncatalog_address] + assert TokenFetcher.init([], &[&1 | &2], json_rpc_named_arguments) == [uncatalog_address] end end @@ -61,7 +61,7 @@ defmodule Indexer.Token.FetcherTest do end ) - assert Fetcher.run([contract_address_hash], json_rpc_named_arguments) == :ok + assert TokenFetcher.run([contract_address_hash], json_rpc_named_arguments) == :ok expected_supply = Decimal.new(1_000_000_000_000_000_000) diff --git a/apps/indexer/test/indexer/token/metadata_updater_test.exs b/apps/indexer/test/indexer/fetcher/token_updater_test.exs similarity index 94% rename from apps/indexer/test/indexer/token/metadata_updater_test.exs rename to apps/indexer/test/indexer/fetcher/token_updater_test.exs index c57d216aeb..b7b3bfac55 100644 --- a/apps/indexer/test/indexer/token/metadata_updater_test.exs +++ b/apps/indexer/test/indexer/fetcher/token_updater_test.exs @@ -1,11 +1,11 @@ -defmodule Indexer.Token.MetadataUpdaterTest do +defmodule Indexer.Fetcher.TokenUpdaterTest do use Explorer.DataCase import Mox alias Explorer.Chain alias Explorer.Chain.Token - alias Indexer.Token.MetadataUpdater + alias Indexer.Fetcher.TokenUpdater setup :verify_on_exit! setup :set_mox_global @@ -49,7 +49,7 @@ defmodule Indexer.Token.MetadataUpdaterTest do end ) - pid = start_supervised!({MetadataUpdater, %{update_interval: 1}}) + pid = start_supervised!({TokenUpdater, [%{update_interval: 1}, []]}) wait_for_results(fn -> updated = Repo.one!(from(t in Token, where: t.cataloged == true and not is_nil(t.name), limit: 1)) @@ -102,7 +102,7 @@ defmodule Indexer.Token.MetadataUpdaterTest do end ) - MetadataUpdater.update_metadata([token.contract_address_hash]) + TokenUpdater.update_metadata([token.contract_address_hash]) expected_supply = Decimal.new(1_000_000_000_000_000_000) diff --git a/apps/indexer/test/indexer/block/uncle/fetcher_test.exs b/apps/indexer/test/indexer/fetcher/uncle_block_test.exs similarity index 94% rename from apps/indexer/test/indexer/block/uncle/fetcher_test.exs rename to apps/indexer/test/indexer/fetcher/uncle_block_test.exs index 0bb2b0a915..0f8bb75f02 100644 --- a/apps/indexer/test/indexer/block/uncle/fetcher_test.exs +++ b/apps/indexer/test/indexer/fetcher/uncle_block_test.exs @@ -1,4 +1,4 @@ -defmodule Indexer.Block.Uncle.FetcherTest do +defmodule Indexer.Fetcher.UncleBlockTest do # MUST be `async: false` so that {:shared, pid} is set for connection to allow CoinBalanceFetcher's self-send to have # connection allowed immediately. use EthereumJSONRPC.Case, async: false @@ -6,6 +6,7 @@ defmodule Indexer.Block.Uncle.FetcherTest do alias Explorer.Chain alias Indexer.Block + alias Indexer.Fetcher.UncleBlock import Mox @@ -32,10 +33,10 @@ defmodule Indexer.Block.Uncle.FetcherTest do describe "child_spec/1" do test "raises ArgumentError is `json_rpc_named_arguments is not provided" do assert_raise ArgumentError, - ":json_rpc_named_arguments must be provided to `Elixir.Indexer.Block.Uncle.Fetcher.child_spec " <> + ":json_rpc_named_arguments must be provided to `Elixir.Indexer.Fetcher.UncleBlock.child_spec " <> "to allow for json_rpc calls when running.", fn -> - start_supervised({Block.Uncle.Fetcher, [[], []]}) + start_supervised({UncleBlock, [[], []]}) end end end @@ -104,7 +105,7 @@ defmodule Indexer.Block.Uncle.FetcherTest do ]} end) - Block.Uncle.Supervisor.Case.start_supervised!( + UncleBlock.Supervisor.Case.start_supervised!( block_fetcher: %Block.Fetcher{json_rpc_named_arguments: json_rpc_named_arguments} ) diff --git a/apps/indexer/test/indexer/temporary/addresses_without_code_test.exs b/apps/indexer/test/indexer/temporary/addresses_without_code_test.exs index 87a78a4b00..18efd3b557 100644 --- a/apps/indexer/test/indexer/temporary/addresses_without_code_test.exs +++ b/apps/indexer/test/indexer/temporary/addresses_without_code_test.exs @@ -8,11 +8,10 @@ defmodule Indexer.Temporary.AddressesWithoutCodeTest do alias Explorer.Repo alias Explorer.Chain.{Address, Transaction} - alias Indexer.Temporary.AddressesWithoutCode.Supervisor - alias Indexer.CoinBalance alias Indexer.Block.Fetcher alias Indexer.Block.Realtime.Fetcher, as: RealtimeFetcher - alias Indexer.{CoinBalance, Code, InternalTransaction, ReplacedTransaction, Token, TokenBalance} + alias Indexer.Fetcher.{CoinBalance, ContractCode, InternalTransaction, ReplacedTransaction, Token, TokenBalance} + alias Indexer.Temporary.AddressesWithoutCode.Supervisor @moduletag capture_log: true @@ -23,7 +22,7 @@ defmodule Indexer.Temporary.AddressesWithoutCodeTest do describe "run/1" do setup %{json_rpc_named_arguments: json_rpc_named_arguments} do CoinBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) - Code.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) + ContractCode.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) InternalTransaction.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) Token.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) TokenBalance.Supervisor.Case.start_supervised!(json_rpc_named_arguments: json_rpc_named_arguments) diff --git a/apps/indexer/test/indexer/temporary/failed_created_addresses_test.exs b/apps/indexer/test/indexer/temporary/failed_created_addresses_test.exs index b02668e565..ef03376161 100644 --- a/apps/indexer/test/indexer/temporary/failed_created_addresses_test.exs +++ b/apps/indexer/test/indexer/temporary/failed_created_addresses_test.exs @@ -8,8 +8,8 @@ defmodule Indexer.Temporary.FailedCreatedAddressesTest do alias Explorer.Repo alias Explorer.Chain.Address + alias Indexer.Fetcher.CoinBalance alias Indexer.Temporary.FailedCreatedAddresses.Supervisor - alias Indexer.CoinBalance @moduletag capture_log: true diff --git a/apps/indexer/test/indexer/token_transfer/uncataloged/worker_test.exs b/apps/indexer/test/indexer/temporary/uncataloged_token_transfers_test.exs similarity index 69% rename from apps/indexer/test/indexer/token_transfer/uncataloged/worker_test.exs rename to apps/indexer/test/indexer/temporary/uncataloged_token_transfers_test.exs index 3ade853806..dc15ea6b93 100644 --- a/apps/indexer/test/indexer/token_transfer/uncataloged/worker_test.exs +++ b/apps/indexer/test/indexer/temporary/uncataloged_token_transfers_test.exs @@ -1,21 +1,24 @@ -defmodule Indexer.TokenTransfer.Uncataloged.WorkerTest do +defmodule Indexer.Temporary.UncatalogedTokenTransfersTest do use Explorer.DataCase - alias Indexer.Sequence - alias Indexer.TokenTransfer.Uncataloged.{Worker, TaskSupervisor} + alias Indexer.Block.Catchup.Sequence + alias Indexer.Temporary.UncatalogedTokenTransfers @moduletag :capture_log describe "start_link/1" do test "starts the worker" do - assert {:ok, _pid} = Worker.start_link(supervisor: self()) + assert {:ok, _pid} = UncatalogedTokenTransfers.start_link(supervisor: self()) end end describe "init/1" do test "sends message to self" do pid = self() - assert {:ok, %{task_ref: nil, block_numbers: [], sup_pid: ^pid}} = Worker.init(supervisor: self()) + + assert {:ok, %{task_ref: nil, block_numbers: [], sup_pid: ^pid}} = + UncatalogedTokenTransfers.init(supervisor: self()) + assert_received :scan end end @@ -23,7 +26,7 @@ defmodule Indexer.TokenTransfer.Uncataloged.WorkerTest do describe "handle_info with :scan" do test "sends shutdown to supervisor" do state = %{task_ref: nil, block_numbers: [], sup_pid: self()} - Task.async(fn -> Worker.handle_info(:scan, state) end) + Task.async(fn -> UncatalogedTokenTransfers.handle_info(:scan, state) end) assert_receive {_, _, {:terminate, :normal}}, 200 end @@ -49,18 +52,18 @@ defmodule Indexer.TokenTransfer.Uncataloged.WorkerTest do expected_state = %{task_ref: nil, block_numbers: [block_number], retry_interval: 1} state = %{task_ref: nil, block_numbers: [], retry_interval: 1} - assert {:noreply, ^expected_state} = Worker.handle_info(:scan, state) + assert {:noreply, ^expected_state} = UncatalogedTokenTransfers.handle_info(:scan, state) assert_receive :push_front_blocks end end describe "handle_info with :push_front_blocks" do test "starts a task" do - task_sup_pid = start_supervised!({Task.Supervisor, name: TaskSupervisor}) + task_sup_pid = start_supervised!({Task.Supervisor, name: UncatalogedTokenTransfers.TaskSupervisor}) start_supervised!({Sequence, [[ranges: [], step: -1], [name: :block_catchup_sequencer]]}) state = %{task_ref: nil, block_numbers: [1]} - assert {:noreply, %{task_ref: task_ref}} = Worker.handle_info(:push_front_blocks, state) + assert {:noreply, %{task_ref: task_ref}} = UncatalogedTokenTransfers.handle_info(:push_front_blocks, state) assert is_reference(task_ref) refute_receive {^task_ref, {:error, :queue_unavailable}} @@ -74,7 +77,7 @@ defmodule Indexer.TokenTransfer.Uncataloged.WorkerTest do test "sends shutdown to supervisor on success" do ref = Process.monitor(self()) state = %{task_ref: ref, block_numbers: [], sup_pid: self()} - Task.async(fn -> assert Worker.handle_info({ref, :ok}, state) end) + Task.async(fn -> assert UncatalogedTokenTransfers.handle_info({ref, :ok}, state) end) assert_receive {_, _, {:terminate, :normal}} end @@ -82,7 +85,10 @@ defmodule Indexer.TokenTransfer.Uncataloged.WorkerTest do ref = Process.monitor(self()) state = %{task_ref: ref, block_numbers: [1], sup_pid: self(), retry_interval: 1} expected_state = %{state | task_ref: nil} - assert {:noreply, ^expected_state} = Worker.handle_info({ref, {:error, :queue_unavailable}}, state) + + assert {:noreply, ^expected_state} = + UncatalogedTokenTransfers.handle_info({ref, {:error, :queue_unavailable}}, state) + assert_receive :push_front_blocks end end @@ -91,7 +97,10 @@ defmodule Indexer.TokenTransfer.Uncataloged.WorkerTest do test "sends message to self to try again" do ref = Process.monitor(self()) state = %{task_ref: ref, block_numbers: [1], sup_pid: self(), retry_interval: 1} - assert {:noreply, %{task_ref: nil}} = Worker.handle_info({:DOWN, ref, :process, self(), :EXIT}, state) + + assert {:noreply, %{task_ref: nil}} = + UncatalogedTokenTransfers.handle_info({:DOWN, ref, :process, self(), :EXIT}, state) + assert_receive :push_front_blocks end end diff --git a/apps/indexer/test/indexer/token_balances_test.exs b/apps/indexer/test/indexer/token_balances_test.exs index d9bc91080a..6c2eccf373 100644 --- a/apps/indexer/test/indexer/token_balances_test.exs +++ b/apps/indexer/test/indexer/token_balances_test.exs @@ -5,7 +5,7 @@ defmodule Indexer.TokenBalancesTest do doctest Indexer.TokenBalances alias Indexer.TokenBalances - alias Indexer.TokenBalance + alias Indexer.Fetcher.TokenBalance alias Explorer.Chain.Hash import Mox diff --git a/apps/indexer/test/indexer/address/coin_balances_test.exs b/apps/indexer/test/indexer/transform/address_coin_balances_test.exs similarity index 82% rename from apps/indexer/test/indexer/address/coin_balances_test.exs rename to apps/indexer/test/indexer/transform/address_coin_balances_test.exs index 5eae99b22c..6a6627dda7 100644 --- a/apps/indexer/test/indexer/address/coin_balances_test.exs +++ b/apps/indexer/test/indexer/transform/address_coin_balances_test.exs @@ -1,8 +1,8 @@ -defmodule Indexer.Address.CoinBalancesTest do +defmodule Indexer.Transform.AddressCoinBalancesTest do use ExUnit.Case, async: true alias Explorer.Factory - alias Indexer.Address.CoinBalances + alias Indexer.Transform.AddressCoinBalances describe "params_set/1" do test "with block extracts miner_hash" do @@ -12,7 +12,7 @@ defmodule Indexer.Address.CoinBalancesTest do block_number = 1 - params_set = CoinBalances.params_set(%{blocks_params: [%{miner_hash: miner_hash, number: block_number}]}) + params_set = AddressCoinBalances.params_set(%{blocks_params: [%{miner_hash: miner_hash, number: block_number}]}) assert MapSet.size(params_set) == 1 assert %{address_hash: miner_hash, block_number: block_number} @@ -20,7 +20,7 @@ defmodule Indexer.Address.CoinBalancesTest do test "with block second degree relations extracts nothing" do params_set = - CoinBalances.params_set(%{ + AddressCoinBalances.params_set(%{ block_second_degree_relations_params: [%{nephew_hash: Factory.block_hash(), uncle_hash: Factory.block_hash()}] }) @@ -34,7 +34,7 @@ defmodule Indexer.Address.CoinBalancesTest do |> Map.update!(:type, &to_string/1) |> Map.put(:block_number, 1) - params_set = CoinBalances.params_set(%{internal_transactions_params: [internal_transaction_params]}) + params_set = AddressCoinBalances.params_set(%{internal_transactions_params: [internal_transaction_params]}) assert MapSet.size(params_set) == 0 end @@ -47,7 +47,7 @@ defmodule Indexer.Address.CoinBalancesTest do |> Map.put(:block_number, 1) |> Map.put(:error, "illegal operation") - params_set = CoinBalances.params_set(%{internal_transactions_params: [internal_transaction_params]}) + params_set = AddressCoinBalances.params_set(%{internal_transactions_params: [internal_transaction_params]}) assert MapSet.size(params_set) == 0 end @@ -66,7 +66,7 @@ defmodule Indexer.Address.CoinBalancesTest do |> Map.put(:block_number, block_number) |> Map.put(:created_contract_address_hash, created_contract_address_hash) - params_set = CoinBalances.params_set(%{internal_transactions_params: [internal_transaction_params]}) + params_set = AddressCoinBalances.params_set(%{internal_transactions_params: [internal_transaction_params]}) assert MapSet.size(params_set) == 1 assert %{address_hash: created_contract_address_hash, block_number: block_number} @@ -91,7 +91,7 @@ defmodule Indexer.Address.CoinBalancesTest do |> Map.put(:from_address_hash, from_address_hash) |> Map.put(:to_address_hash, to_address_hash) - params_set = CoinBalances.params_set(%{internal_transactions_params: [internal_transaction_params]}) + params_set = AddressCoinBalances.params_set(%{internal_transactions_params: [internal_transaction_params]}) assert MapSet.size(params_set) == 2 assert %{address_hash: from_address_hash, block_number: block_number} @@ -111,7 +111,7 @@ defmodule Indexer.Address.CoinBalancesTest do |> Map.put(:block_number, block_number) |> Map.put(:address_hash, address_hash) - params_set = CoinBalances.params_set(%{logs_params: [log_params]}) + params_set = AddressCoinBalances.params_set(%{logs_params: [log_params]}) assert MapSet.size(params_set) == 1 assert MapSet.new([%{address_hash: address_hash, block_number: block_number}]) == params_set @@ -137,7 +137,7 @@ defmodule Indexer.Address.CoinBalancesTest do |> Map.put(:block_number, block_number) |> Map.put(:address_hash, address_hash) - params_set = CoinBalances.params_set(%{logs_params: [log_params1, log_params2]}) + params_set = AddressCoinBalances.params_set(%{logs_params: [log_params1, log_params2]}) assert MapSet.size(params_set) == 1 assert MapSet.new([%{address_hash: address_hash, block_number: block_number}]) == params_set @@ -156,7 +156,7 @@ defmodule Indexer.Address.CoinBalancesTest do |> Map.put(:block_number, block_number) |> Map.put(:from_address_hash, from_address_hash) - params_set = CoinBalances.params_set(%{transactions_params: [transaction_params]}) + params_set = AddressCoinBalances.params_set(%{transactions_params: [transaction_params]}) assert MapSet.size(params_set) == 1 assert %{address_hash: from_address_hash, block_number: block_number} @@ -180,7 +180,7 @@ defmodule Indexer.Address.CoinBalancesTest do |> Map.put(:from_address_hash, from_address_hash) |> Map.put(:to_address_hash, to_address_hash) - params_set = CoinBalances.params_set(%{transactions_params: [transaction_params]}) + params_set = AddressCoinBalances.params_set(%{transactions_params: [transaction_params]}) assert MapSet.size(params_set) == 2 assert %{address_hash: from_address_hash, block_number: block_number} diff --git a/apps/indexer/test/indexer/address/token_balances_test.exs b/apps/indexer/test/indexer/transform/address_token_balances_test.exs similarity index 86% rename from apps/indexer/test/indexer/address/token_balances_test.exs rename to apps/indexer/test/indexer/transform/address_token_balances_test.exs index 4328e1a9bb..1e22696557 100644 --- a/apps/indexer/test/indexer/address/token_balances_test.exs +++ b/apps/indexer/test/indexer/transform/address_token_balances_test.exs @@ -1,8 +1,8 @@ -defmodule Indexer.Address.TokenBalancesTest do +defmodule Indexer.Transform.AddressTokenBalancesTest do use ExUnit.Case, async: true alias Explorer.Factory - alias Indexer.Address.TokenBalances + alias Indexer.Transform.AddressTokenBalances describe "params_set/1" do test "with token transfer extract from_address, to_address, and token_contract_address_hash" do @@ -27,7 +27,7 @@ defmodule Indexer.Address.TokenBalancesTest do token_contract_address_hash: token_contract_address_hash } - params_set = TokenBalances.params_set(%{token_transfers_params: [token_transfer_params]}) + params_set = AddressTokenBalances.params_set(%{token_transfers_params: [token_transfer_params]}) assert MapSet.size(params_set) == 2 assert %{address_hash: from_address_hash, block_number: block_number} @@ -49,7 +49,7 @@ defmodule Indexer.Address.TokenBalancesTest do token_type: "ERC-721" } - params_set = TokenBalances.params_set(%{token_transfers_params: [token_transfer_params]}) + params_set = AddressTokenBalances.params_set(%{token_transfers_params: [token_transfer_params]}) assert params_set == MapSet.new([ @@ -75,7 +75,7 @@ defmodule Indexer.Address.TokenBalancesTest do token_type: "ERC-721" } - params_set = TokenBalances.params_set(%{token_transfers_params: [token_transfer_params]}) + params_set = AddressTokenBalances.params_set(%{token_transfers_params: [token_transfer_params]}) assert MapSet.size(params_set) == 0 end diff --git a/apps/indexer/test/indexer/address_extraction_test.exs b/apps/indexer/test/indexer/transform/addresses.exs similarity index 87% rename from apps/indexer/test/indexer/address_extraction_test.exs rename to apps/indexer/test/indexer/transform/addresses.exs index 59dd203f29..21d79058ac 100644 --- a/apps/indexer/test/indexer/address_extraction_test.exs +++ b/apps/indexer/test/indexer/transform/addresses.exs @@ -1,13 +1,13 @@ -defmodule Indexer.AddressExtractionTest do +defmodule Indexer.Transform.AddressesTest do use Explorer.DataCase, async: true - alias Indexer.AddressExtraction + alias Indexer.Transform.Addresses - doctest AddressExtraction + doctest Addresses describe "extract_addresses/1" do test "blocks without a `miner_hash` aren't extracted" do - assert Indexer.AddressExtraction.extract_addresses(%{ + assert Addresses.extract_addresses(%{ blocks: [ %{ number: 34 @@ -17,7 +17,7 @@ defmodule Indexer.AddressExtractionTest do end test "blocks without a `number` aren't extracted" do - assert Indexer.AddressExtraction.extract_addresses(%{ + assert Addresses.extract_addresses(%{ blocks: [ %{ miner_hash: "0xe8ddc5c7a2d2f0d7a9798459c0104fdf5e987aca" @@ -27,7 +27,7 @@ defmodule Indexer.AddressExtractionTest do end test "internal_transactions with a `from_address_hash` without a `block_number` aren't extracted" do - assert Indexer.AddressExtraction.extract_addresses(%{ + assert Addresses.extract_addresses(%{ internal_transactions: [ %{ from_address_hash: "0x0000000000000000000000000000000000000001" @@ -37,7 +37,7 @@ defmodule Indexer.AddressExtractionTest do end test "internal_transactions with a `to_address_hash` without a `block_number` aren't extracted" do - assert Indexer.AddressExtraction.extract_addresses(%{ + assert Addresses.extract_addresses(%{ internal_transactions: [ %{ to_address_hash: "0x0000000000000000000000000000000000000002" @@ -48,7 +48,7 @@ defmodule Indexer.AddressExtractionTest do test "internal_transactions with a `created_contract_address_hash` and `created_contract_code` " <> "without a `block_number` aren't extracted" do - assert Indexer.AddressExtraction.extract_addresses(%{ + assert Addresses.extract_addresses(%{ internal_transactions: [ %{ created_contract_address_hash: "0x0000000000000000000000000000000000000003", @@ -59,7 +59,7 @@ defmodule Indexer.AddressExtractionTest do end test "differing contract code is ignored" do - assert Indexer.AddressExtraction.extract_addresses(%{ + assert Addresses.extract_addresses(%{ internal_transactions: [ %{ block_number: 1, @@ -98,7 +98,7 @@ defmodule Indexer.AddressExtractionTest do ] } - assert Indexer.AddressExtraction.extract_addresses(code_params) == [ + assert Addresses.extract_addresses(code_params) == [ %{ contract_code: "0x600160008035811a818181146012578301005b601b6001356025565b8060005260206000f25b600060078202905091905056", @@ -153,7 +153,7 @@ defmodule Indexer.AddressExtractionTest do block_reward_contract_beneficiaries: [beneficiary] } - assert AddressExtraction.extract_addresses(blockchain_data) == [ + assert Addresses.extract_addresses(blockchain_data) == [ %{hash: block.miner_hash, fetched_coin_balance_block_number: block.number}, %{ hash: internal_transaction.from_address_hash, @@ -202,7 +202,7 @@ defmodule Indexer.AddressExtractionTest do logs: [] } - addresses = AddressExtraction.extract_addresses(empty_blockchain_data) + addresses = Addresses.extract_addresses(empty_blockchain_data) assert Enum.empty?(addresses) end @@ -222,7 +222,7 @@ defmodule Indexer.AddressExtractionTest do ] } - assert AddressExtraction.extract_addresses(blockchain_data) == + assert Addresses.extract_addresses(blockchain_data) == [ %{hash: hash, fetched_coin_balance_block_number: 34, contract_code: "code", nonce: 12} ] @@ -234,13 +234,13 @@ defmodule Indexer.AddressExtractionTest do unkown_entity: [%{hash: "0x8bf38d4764929064f2d4d3a56520a76ab3df415b"}] } - assert AddressExtraction.extract_addresses(blockchain_data) == [ + assert Addresses.extract_addresses(blockchain_data) == [ %{fetched_coin_balance_block_number: 34, hash: "0xe8ddc5c7a2d2f0d7a9798459c0104fdf5e987aca"} ] end test "returns an empty list when there isn't a recognized entity" do - addresses = AddressExtraction.extract_addresses(%{}) + addresses = Addresses.extract_addresses(%{}) assert Enum.empty?(addresses) end @@ -258,7 +258,7 @@ defmodule Indexer.AddressExtractionTest do %{field_1: "hash1", field_2: "hash3"} ] - assert AddressExtraction.extract_addresses_from_collection(items, fields_map, %AddressExtraction{pending: false}) == + assert Addresses.extract_addresses_from_collection(items, fields_map, %Addresses{pending: false}) == [ %{hash: "hash1"}, %{hash: "hash2"}, @@ -276,7 +276,7 @@ defmodule Indexer.AddressExtractionTest do item = %{field_1: "hash1", field_2: "hash2"} - response = AddressExtraction.extract_addresses_from_item(item, fields_map, %AddressExtraction{pending: false}) + response = Addresses.extract_addresses_from_item(item, fields_map, %Addresses{pending: false}) assert response == [%{hash: "hash1"}] end @@ -289,7 +289,7 @@ defmodule Indexer.AddressExtractionTest do item = %{field_1: "hash1", field_2: "hash2"} - response = AddressExtraction.extract_addresses_from_item(item, fields_map, %AddressExtraction{pending: false}) + response = Addresses.extract_addresses_from_item(item, fields_map, %Addresses{pending: false}) assert response == [%{hash: "hash1"}, %{hash: "hash2"}] end @@ -306,10 +306,10 @@ defmodule Indexer.AddressExtractionTest do data = %{field_1: "hash1", field_2: "hash2", field_2_code: "code"} response = - AddressExtraction.extract_addresses_from_item( + Addresses.extract_addresses_from_item( data, fields_map, - %AddressExtraction{pending: false} + %Addresses{pending: false} ) assert response == [ diff --git a/apps/indexer/test/indexer/block/transform/base_test.exs b/apps/indexer/test/indexer/transform/blocks/base_test.exs similarity index 96% rename from apps/indexer/test/indexer/block/transform/base_test.exs rename to apps/indexer/test/indexer/transform/blocks/base_test.exs index b55adebc57..c58800f8a4 100644 --- a/apps/indexer/test/indexer/block/transform/base_test.exs +++ b/apps/indexer/test/indexer/transform/blocks/base_test.exs @@ -1,7 +1,7 @@ -defmodule Indexer.Block.Transform.BaseTest do +defmodule Indexer.Transform.Blocks.BaseTest do use ExUnit.Case - alias Indexer.Block.Transform.Base + alias Indexer.Transform.Blocks.Base @block %{ difficulty: 1, diff --git a/apps/indexer/test/indexer/block/transform/clique_test.exs b/apps/indexer/test/indexer/transform/blocks/clique_test.exs similarity index 96% rename from apps/indexer/test/indexer/block/transform/clique_test.exs rename to apps/indexer/test/indexer/transform/blocks/clique_test.exs index 4af5d05895..60d0824584 100644 --- a/apps/indexer/test/indexer/block/transform/clique_test.exs +++ b/apps/indexer/test/indexer/transform/blocks/clique_test.exs @@ -1,7 +1,7 @@ -defmodule Indexer.Block.Transform.CliqueTest do +defmodule Indexer.Transform.Blocks.CliqueTest do use ExUnit.Case - alias Indexer.Block.Transform.Clique + alias Indexer.Transform.Blocks.Clique @block %{ difficulty: 1, diff --git a/apps/indexer/test/indexer/block/transform_test.exs b/apps/indexer/test/indexer/transform/blocks_test.exs similarity index 50% rename from apps/indexer/test/indexer/block/transform_test.exs rename to apps/indexer/test/indexer/transform/blocks_test.exs index e94475a4b5..8f0e7cb44b 100644 --- a/apps/indexer/test/indexer/block/transform_test.exs +++ b/apps/indexer/test/indexer/transform/blocks_test.exs @@ -1,7 +1,7 @@ -defmodule Indexer.Block.TransformTest do +defmodule Indexer.Transform.BlocksTest do use ExUnit.Case - alias Indexer.Block.Transform + alias Indexer.Transform.Blocks @block %{ difficulty: 1, @@ -44,7 +44,42 @@ defmodule Indexer.Block.TransformTest do end test "transforms a list of blocks" do - assert Transform.transform_blocks(@blocks) + assert Blocks.transform_blocks(@blocks) end end + + test "signer/1" do + data = %{ + difficulty: 1, + extra_data: + "0xd68301080d846765746886676f312e3130856c696e7578000000000000000000773ab2ca8f47904a14739ad80a75b71d9d29b9fff8b7ecdcb73efffa6f74122f17d304b5dc8e6e5f256c9474dd115c8d4dae31b7a3d409e5c3270f8fde41cd8c00", + gas_limit: 7_753_377, + gas_used: 1_810_195, + hash: "0x7004c895e812c55b0c2be8a46d72ca300a683dc27d1d7917ee7742d4d0359c1f", + logs_bloom: + "0x00000000000000020000000000002000000400000000000000000000000000000000000000000000040000080004000020000010000000000000000000000000000000000000000008000008000000000000000000200000000000000000000000000000020000000000000000000800000000000000804000000010080000000800000000000000000000000000000000000000000000800000000000080000000008000400000000404000000000000000000000000200000000000000000000000002000000000000001002000000000000002000000008000000000020000000000000000000000000000000000000000000000000400000800000000000", + miner_hash: "0x0000000000000000000000000000000000000000", + mix_hash: "0x0000000000000000000000000000000000000000000000000000000000000000", + nonce: "0x0000000000000000", + number: 2_848_394, + parent_hash: "0x20350fc367e19d3865be1ea7da72ab81f8f9941c43ac6bb24a34a0a7caa2f3df", + receipts_root: "0x6ade4ac1079ea50cfadcce2b75ffbe4f9b14bf69b4607bbf1739463076ca6246", + sha3_uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + size: 6437, + state_root: "0x23f63347851bcd109059d007d71e19c4f5e73b7f0862bebcd04458333a004d92", + timestamp: DateTime.from_unix!(1_534_796_040), + total_difficulty: 5_353_647, + transactions: [ + "0x7e3bb851fc74a436826d2af6b96e4db9484431811ef0d9c9e78370488d33d4e5", + "0x3976fd1e3d2a715c3cfcfde9bd3210798c26c017b8edb841d319227ecb3322fb", + "0xd8db124005bb8b6fda7b71fd56ac782552a66af58fe843ba3c4930423b87d1d2", + "0x10c1a1ca4d9f4b2bd5b89f7bbcbbc2d69e166fe23662b8db4f6beae0f50ac9fd", + "0xaa58a6545677c796a56b8bc874174c8cfd31a6c6e6ca3a87e086d4f66d52858a" + ], + transactions_root: "0xde8d25c0b9b54310128a21601331094b43f910f9f96102869c2e2dca94884bf4", + uncles: [] + } + + assert Blocks.signer(data) == "0xfc18cbc391de84dbd87db83b20935d3e89f5dd91" + end end diff --git a/apps/indexer/test/indexer/mint_transfer_test.exs b/apps/indexer/test/indexer/transform/mint_transfers_test.exs similarity index 88% rename from apps/indexer/test/indexer/mint_transfer_test.exs rename to apps/indexer/test/indexer/transform/mint_transfers_test.exs index 39ce61d0d8..90375cb96a 100644 --- a/apps/indexer/test/indexer/mint_transfer_test.exs +++ b/apps/indexer/test/indexer/transform/mint_transfers_test.exs @@ -1,9 +1,9 @@ -defmodule Indexer.MintTransferTest do +defmodule Indexer.Transform.MintTransfersTest do use ExUnit.Case, async: true - alias Indexer.MintTransfer + alias Indexer.Transform.MintTransfers - doctest Indexer.MintTransfer, import: true + doctest MintTransfers, import: true describe "parse/1" do test "parses logs for fetch the mint transfer" do @@ -32,7 +32,7 @@ defmodule Indexer.MintTransferTest do ] } - assert MintTransfer.parse(logs) == expected + assert MintTransfers.parse(logs) == expected end end @@ -52,6 +52,6 @@ defmodule Indexer.MintTransferTest do } ] - assert MintTransfer.parse(logs) == %{mint_transfers: []} + assert MintTransfers.parse(logs) == %{mint_transfers: []} end end diff --git a/apps/indexer/test/indexer/token_transfer/parser_test.exs b/apps/indexer/test/indexer/transform/token_transfers_test.exs similarity index 96% rename from apps/indexer/test/indexer/token_transfer/parser_test.exs rename to apps/indexer/test/indexer/transform/token_transfers_test.exs index 4bc4984037..406107b187 100644 --- a/apps/indexer/test/indexer/token_transfer/parser_test.exs +++ b/apps/indexer/test/indexer/transform/token_transfers_test.exs @@ -1,9 +1,9 @@ -defmodule Indexer.TokenTransfer.ParserTest do +defmodule Indexer.Transform.TokenTransfersTest do use ExUnit.Case import ExUnit.CaptureLog - alias Indexer.TokenTransfer.Parser + alias Indexer.Transform.TokenTransfers describe "parse/1" do test "parse/1 parses logs for tokens and token transfers" do @@ -82,7 +82,7 @@ defmodule Indexer.TokenTransfer.ParserTest do ] } - assert Parser.parse(logs) == expected + assert TokenTransfers.parse(logs) == expected end test "parses ERC-721 transfer with addresses in data field" do @@ -121,7 +121,7 @@ defmodule Indexer.TokenTransfer.ParserTest do ] } - assert Parser.parse([log]) == expected + assert TokenTransfers.parse([log]) == expected end test "logs error with unrecognized token transfer format" do @@ -138,7 +138,7 @@ defmodule Indexer.TokenTransfer.ParserTest do type: "mined" } - error = capture_log(fn -> %{tokens: [], token_transfers: []} = Parser.parse([log]) end) + error = capture_log(fn -> %{tokens: [], token_transfers: []} = TokenTransfers.parse([log]) end) assert error =~ ~r"unknown token transfer"i end end diff --git a/apps/indexer/test/support/indexer/block/catchup/supervisor/case.ex b/apps/indexer/test/support/indexer/block/catchup_supervisor_case.ex similarity index 100% rename from apps/indexer/test/support/indexer/block/catchup/supervisor/case.ex rename to apps/indexer/test/support/indexer/block/catchup_supervisor_case.ex diff --git a/apps/indexer/test/support/indexer/code/supervisor/case.ex b/apps/indexer/test/support/indexer/fetcher/block_reward_supervisor_case.ex similarity index 71% rename from apps/indexer/test/support/indexer/code/supervisor/case.ex rename to apps/indexer/test/support/indexer/fetcher/block_reward_supervisor_case.ex index 5d37b44a3c..95ac883607 100644 --- a/apps/indexer/test/support/indexer/code/supervisor/case.ex +++ b/apps/indexer/test/support/indexer/fetcher/block_reward_supervisor_case.ex @@ -1,5 +1,5 @@ -defmodule Indexer.Code.Supervisor.Case do - alias Indexer.Code +defmodule Indexer.Fetcher.BlockReward.Supervisor.Case do + alias Indexer.Fetcher.BlockReward def start_supervised!(fetcher_arguments \\ []) when is_list(fetcher_arguments) do merged_fetcher_arguments = @@ -11,7 +11,7 @@ defmodule Indexer.Code.Supervisor.Case do ) [merged_fetcher_arguments] - |> Code.Supervisor.child_spec() + |> BlockReward.Supervisor.child_spec() |> ExUnit.Callbacks.start_supervised!() end end diff --git a/apps/indexer/test/support/indexer/coin_balance/supervisor/case.ex b/apps/indexer/test/support/indexer/fetcher/coin_balance_supervisor_case.ex similarity index 80% rename from apps/indexer/test/support/indexer/coin_balance/supervisor/case.ex rename to apps/indexer/test/support/indexer/fetcher/coin_balance_supervisor_case.ex index cdbd4c6f28..6e2a9e22af 100644 --- a/apps/indexer/test/support/indexer/coin_balance/supervisor/case.ex +++ b/apps/indexer/test/support/indexer/fetcher/coin_balance_supervisor_case.ex @@ -1,5 +1,5 @@ -defmodule Indexer.CoinBalance.Supervisor.Case do - alias Indexer.CoinBalance +defmodule Indexer.Fetcher.CoinBalance.Supervisor.Case do + alias Indexer.Fetcher.CoinBalance def start_supervised!(fetcher_arguments \\ []) when is_list(fetcher_arguments) do merged_fetcher_arguments = diff --git a/apps/indexer/test/support/indexer/block/reward/supervisor/case.ex b/apps/indexer/test/support/indexer/fetcher/contract_code_supervisor_case.ex similarity index 70% rename from apps/indexer/test/support/indexer/block/reward/supervisor/case.ex rename to apps/indexer/test/support/indexer/fetcher/contract_code_supervisor_case.ex index 531eee1708..e7cffcc33a 100644 --- a/apps/indexer/test/support/indexer/block/reward/supervisor/case.ex +++ b/apps/indexer/test/support/indexer/fetcher/contract_code_supervisor_case.ex @@ -1,5 +1,5 @@ -defmodule Indexer.Block.Reward.Supervisor.Case do - alias Indexer.Block.Reward +defmodule Indexer.Fetcher.ContractCode.Supervisor.Case do + alias Indexer.Fetcher.ContractCode def start_supervised!(fetcher_arguments \\ []) when is_list(fetcher_arguments) do merged_fetcher_arguments = @@ -11,7 +11,7 @@ defmodule Indexer.Block.Reward.Supervisor.Case do ) [merged_fetcher_arguments] - |> Reward.Supervisor.child_spec() + |> ContractCode.Supervisor.child_spec() |> ExUnit.Callbacks.start_supervised!() end end diff --git a/apps/indexer/test/support/indexer/internal_transaction/supervisor/case.ex b/apps/indexer/test/support/indexer/fetcher/internal_transaction_supervisor_case.ex similarity index 78% rename from apps/indexer/test/support/indexer/internal_transaction/supervisor/case.ex rename to apps/indexer/test/support/indexer/fetcher/internal_transaction_supervisor_case.ex index 37552936cf..041796c5cd 100644 --- a/apps/indexer/test/support/indexer/internal_transaction/supervisor/case.ex +++ b/apps/indexer/test/support/indexer/fetcher/internal_transaction_supervisor_case.ex @@ -1,5 +1,5 @@ -defmodule Indexer.InternalTransaction.Supervisor.Case do - alias Indexer.InternalTransaction +defmodule Indexer.Fetcher.InternalTransaction.Supervisor.Case do + alias Indexer.Fetcher.InternalTransaction def start_supervised!(fetcher_arguments \\ []) when is_list(fetcher_arguments) do merged_fetcher_arguments = diff --git a/apps/indexer/test/support/indexer/pending_transaction/supervisor/case.ex b/apps/indexer/test/support/indexer/fetcher/pending_transaction_supervisor_case.ex similarity index 78% rename from apps/indexer/test/support/indexer/pending_transaction/supervisor/case.ex rename to apps/indexer/test/support/indexer/fetcher/pending_transaction_supervisor_case.ex index 21131ea8d8..afaa15df17 100644 --- a/apps/indexer/test/support/indexer/pending_transaction/supervisor/case.ex +++ b/apps/indexer/test/support/indexer/fetcher/pending_transaction_supervisor_case.ex @@ -1,5 +1,5 @@ -defmodule Indexer.PendingTransaction.Supervisor.Case do - alias Indexer.PendingTransaction +defmodule Indexer.Fetcher.PendingTransaction.Supervisor.Case do + alias Indexer.Fetcher.PendingTransaction def start_supervised!(fetcher_arguments \\ []) when is_list(fetcher_arguments) do merged_fetcher_arguments = diff --git a/apps/indexer/test/support/indexer/replaced_transaction/supervisor/case.ex b/apps/indexer/test/support/indexer/fetcher/replaced_transaction_supervisor_case.ex similarity index 78% rename from apps/indexer/test/support/indexer/replaced_transaction/supervisor/case.ex rename to apps/indexer/test/support/indexer/fetcher/replaced_transaction_supervisor_case.ex index e3fdd7124b..c95dbbd79f 100644 --- a/apps/indexer/test/support/indexer/replaced_transaction/supervisor/case.ex +++ b/apps/indexer/test/support/indexer/fetcher/replaced_transaction_supervisor_case.ex @@ -1,5 +1,5 @@ -defmodule Indexer.ReplacedTransaction.Supervisor.Case do - alias Indexer.ReplacedTransaction +defmodule Indexer.Fetcher.ReplacedTransaction.Supervisor.Case do + alias Indexer.Fetcher.ReplacedTransaction def start_supervised!(fetcher_arguments \\ []) when is_list(fetcher_arguments) do merged_fetcher_arguments = diff --git a/apps/indexer/test/support/indexer/token_balance/supervisor/case.ex b/apps/indexer/test/support/indexer/fetcher/token_balance_supervisor_case.ex similarity index 80% rename from apps/indexer/test/support/indexer/token_balance/supervisor/case.ex rename to apps/indexer/test/support/indexer/fetcher/token_balance_supervisor_case.ex index b1572db2c5..45ad1713ae 100644 --- a/apps/indexer/test/support/indexer/token_balance/supervisor/case.ex +++ b/apps/indexer/test/support/indexer/fetcher/token_balance_supervisor_case.ex @@ -1,5 +1,5 @@ -defmodule Indexer.TokenBalance.Supervisor.Case do - alias Indexer.TokenBalance +defmodule Indexer.Fetcher.TokenBalance.Supervisor.Case do + alias Indexer.Fetcher.TokenBalance def start_supervised!(fetcher_arguments \\ []) when is_list(fetcher_arguments) do merged_fetcher_arguments = diff --git a/apps/indexer/test/support/indexer/token/supervisor/case.ex b/apps/indexer/test/support/indexer/fetcher/token_supervisor_case.ex similarity index 82% rename from apps/indexer/test/support/indexer/token/supervisor/case.ex rename to apps/indexer/test/support/indexer/fetcher/token_supervisor_case.ex index 4de9ca22a4..97983d3d63 100644 --- a/apps/indexer/test/support/indexer/token/supervisor/case.ex +++ b/apps/indexer/test/support/indexer/fetcher/token_supervisor_case.ex @@ -1,5 +1,5 @@ -defmodule Indexer.Token.Supervisor.Case do - alias Indexer.Token +defmodule Indexer.Fetcher.Token.Supervisor.Case do + alias Indexer.Fetcher.Token def start_supervised!(fetcher_arguments \\ []) when is_list(fetcher_arguments) do merged_fetcher_arguments = diff --git a/apps/indexer/test/support/indexer/block/uncle/supervisor/case.ex b/apps/indexer/test/support/indexer/fetcher/uncle_block_supervisor_case.ex similarity index 71% rename from apps/indexer/test/support/indexer/block/uncle/supervisor/case.ex rename to apps/indexer/test/support/indexer/fetcher/uncle_block_supervisor_case.ex index 0f5e9ab46f..1de3364271 100644 --- a/apps/indexer/test/support/indexer/block/uncle/supervisor/case.ex +++ b/apps/indexer/test/support/indexer/fetcher/uncle_block_supervisor_case.ex @@ -1,5 +1,5 @@ -defmodule Indexer.Block.Uncle.Supervisor.Case do - alias Indexer.Block +defmodule Indexer.Fetcher.UncleBlock.Supervisor.Case do + alias Indexer.Fetcher.UncleBlock def start_supervised!(fetcher_arguments \\ []) when is_list(fetcher_arguments) do merged_fetcher_arguments = @@ -11,7 +11,7 @@ defmodule Indexer.Block.Uncle.Supervisor.Case do ) [merged_fetcher_arguments] - |> Block.Uncle.Supervisor.child_spec() + |> UncleBlock.Supervisor.child_spec() |> ExUnit.Callbacks.start_supervised!() end end