Do not preload smart contract info if address has no contract_code

np-addresses-endpoint-performance
Nikita Pozdniakov 1 year ago
parent 463d750dec
commit 668d5a2889
No known key found for this signature in database
GPG Key ID: F344106F9804FE5F
  1. 26
      apps/block_scout_web/lib/block_scout_web/controllers/api/v2/address_controller.ex
  2. 6
      apps/block_scout_web/lib/block_scout_web/views/address_view.ex

@ -16,7 +16,8 @@ defmodule BlockScoutWeb.API.V2.AddressController do
alias BlockScoutWeb.AccessHelper alias BlockScoutWeb.AccessHelper
alias BlockScoutWeb.API.V2.{BlockView, TransactionView, WithdrawalView} alias BlockScoutWeb.API.V2.{BlockView, TransactionView, WithdrawalView}
alias Explorer.{Chain, Market} alias Explorer.{Chain, Market, Repo}
alias Explorer.Chain.Address
alias Explorer.Chain.Address.Counters alias Explorer.Chain.Address.Counters
alias Explorer.Chain.Token.Instance alias Explorer.Chain.Token.Instance
alias Indexer.Fetcher.{CoinBalanceOnDemand, TokenBalanceOnDemand} alias Indexer.Fetcher.{CoinBalanceOnDemand, TokenBalanceOnDemand}
@ -46,15 +47,18 @@ defmodule BlockScoutWeb.API.V2.AddressController do
@address_options [ @address_options [
necessity_by_association: %{ necessity_by_association: %{
:contracts_creation_internal_transaction => :optional,
:names => :optional, :names => :optional,
:smart_contract => :optional, :token => :optional
:token => :optional,
:contracts_creation_transaction => :optional
}, },
api?: true api?: true
] ]
@contract_address_preloads [
:smart_contract,
:contracts_creation_internal_transaction,
:contracts_creation_transaction
]
@nft_necessity_by_association [ @nft_necessity_by_association [
necessity_by_association: %{ necessity_by_association: %{
:token => :optional :token => :optional
@ -66,12 +70,13 @@ defmodule BlockScoutWeb.API.V2.AddressController do
action_fallback(BlockScoutWeb.API.V2.FallbackController) action_fallback(BlockScoutWeb.API.V2.FallbackController)
def address(conn, %{"address_hash_param" => address_hash_string} = params) do def address(conn, %{"address_hash_param" => address_hash_string} = params) do
with {:ok, _address_hash, address} <- validate_address(address_hash_string, params, @address_options) do with {:ok, _address_hash, address} <- validate_address(address_hash_string, params, @address_options),
CoinBalanceOnDemand.trigger_fetch(address) fully_preloaded_address <- maybe_preload_smart_contract_associations(address) do
CoinBalanceOnDemand.trigger_fetch(fully_preloaded_address)
conn conn
|> put_status(200) |> put_status(200)
|> render(:address, %{address: address}) |> render(:address, %{address: fully_preloaded_address})
end end
end end
@ -477,4 +482,9 @@ defmodule BlockScoutWeb.API.V2.AddressController do
{:ok, address_hash, address} {:ok, address_hash, address}
end end
end end
defp maybe_preload_smart_contract_associations(%Address{contract_code: nil} = address), do: address
defp maybe_preload_smart_contract_associations(%Address{contract_code: _} = address),
do: Repo.replica().preload(address, @contract_address_preloads)
end end

@ -258,7 +258,7 @@ defmodule BlockScoutWeb.AddressView do
Enum.any?(address.smart_contract.abi || [], &is_read_function?(&1)) Enum.any?(address.smart_contract.abi || [], &is_read_function?(&1))
end end
def smart_contract_with_read_only_functions?(%Address{smart_contract: nil}), do: false def smart_contract_with_read_only_functions?(%Address{smart_contract: _}), do: false
def is_read_function?(function), do: Helper.queriable_method?(function) || Helper.read_with_wallet_method?(function) def is_read_function?(function), do: Helper.queriable_method?(function) || Helper.read_with_wallet_method?(function)
@ -268,7 +268,7 @@ defmodule BlockScoutWeb.AddressView do
SmartContract.proxy_contract?(smart_contract, options) SmartContract.proxy_contract?(smart_contract, options)
end end
def smart_contract_is_proxy?(%Address{smart_contract: nil}, _), do: false def smart_contract_is_proxy?(%Address{smart_contract: _}, _), do: false
def smart_contract_with_write_functions?(%Address{smart_contract: %SmartContract{}} = address) do def smart_contract_with_write_functions?(%Address{smart_contract: %SmartContract{}} = address) do
!contract_interaction_disabled?() && !contract_interaction_disabled?() &&
@ -278,7 +278,7 @@ defmodule BlockScoutWeb.AddressView do
) )
end end
def smart_contract_with_write_functions?(%Address{smart_contract: nil}), do: false def smart_contract_with_write_functions?(%Address{smart_contract: _}), do: false
def has_decompiled_code?(address) do def has_decompiled_code?(address) do
address.has_decompiled_code? || address.has_decompiled_code? ||

Loading…
Cancel
Save