Skip to content

Commit 4e6af5c

Browse files
authored
fix: Rollback token hash by symbol logic in advanced filters (blockscout#14401)
1 parent 36ab37e commit 4e6af5c

5 files changed

Lines changed: 11 additions & 138 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
### 🐛 Bug Fixes
66

7-
- Declare missing OpenAPI params for advanced-filters endpoint ([#14399](https://github.com/blockscout/blockscout/issues/14399))
7+
- Declare missing OpenAPI params for advanced-filters endpoint ([#14401](https://github.com/blockscout/blockscout/pull/14401), [#14399](https://github.com/blockscout/blockscout/issues/14399))
88

99
## 11.1.0
1010

apps/block_scout_web/lib/block_scout_web/controllers/api/v2/advanced_filter_controller.ex

Lines changed: 10 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -505,26 +505,6 @@ defmodule BlockScoutWeb.API.V2.AdvancedFilterController do
505505
end
506506

507507
defp extract_filters(params) do
508-
address_token_hashes =
509-
params[:token_contract_address_hashes_to_include]
510-
|> prepare_include_exclude_address_hashes(
511-
params[:token_contract_address_hashes_to_exclude],
512-
&prepare_token_address_hash/1
513-
)
514-
515-
symbol_token_hashes =
516-
prepare_include_exclude_address_hashes_from_symbols(
517-
params[:token_contract_symbols_to_include],
518-
params[:token_contract_symbols_to_exclude]
519-
)
520-
521-
token_contract_address_hashes =
522-
merge_token_hashes(address_token_hashes, symbol_token_hashes)
523-
|> Enum.map(fn
524-
{key, value} when is_list(value) -> {key, Enum.take(value, @tokens_filter_limit)}
525-
key_value -> key_value
526-
end)
527-
528508
[
529509
transaction_types: prepare_transaction_types(params[:transaction_types]),
530510
methods: merge_methods(prepare_methods(params[:methods]), prepare_methods_from_names(params[:methods_names])),
@@ -543,7 +523,16 @@ defmodule BlockScoutWeb.API.V2.AdvancedFilterController do
543523
),
544524
address_relation: prepare_address_relation(params[:address_relation]),
545525
amount: prepare_amount(params[:amount_from], params[:amount_to]),
546-
token_contract_address_hashes: token_contract_address_hashes
526+
token_contract_address_hashes:
527+
params[:token_contract_address_hashes_to_include]
528+
|> prepare_include_exclude_address_hashes(
529+
params[:token_contract_address_hashes_to_exclude],
530+
&prepare_token_address_hash/1
531+
)
532+
|> Enum.map(fn
533+
{key, value} when is_list(value) -> {key, Enum.take(value, @tokens_filter_limit)}
534+
key_value -> key_value
535+
end)
547536
]
548537
end
549538

@@ -640,42 +629,6 @@ defmodule BlockScoutWeb.API.V2.AdvancedFilterController do
640629
end
641630
end
642631

643-
defp prepare_include_exclude_address_hashes_from_symbols(include_symbols, exclude_symbols) do
644-
[
645-
include: resolve_symbols_to_address_hashes(include_symbols),
646-
exclude: resolve_symbols_to_address_hashes(exclude_symbols)
647-
]
648-
end
649-
650-
defp resolve_symbols_to_address_hashes(symbols_str) when is_binary(symbols_str) do
651-
case symbols_str |> String.split(",") |> Enum.map(&String.trim/1) |> Enum.reject(&(&1 == "")) do
652-
[] ->
653-
nil
654-
655-
symbols ->
656-
symbols
657-
|> Token.get_by_symbols(@api_true)
658-
|> Enum.map(& &1.contract_address_hash)
659-
end
660-
end
661-
662-
defp resolve_symbols_to_address_hashes(_), do: nil
663-
664-
defp merge_token_hashes(address_based, symbol_based) do
665-
[:include, :exclude]
666-
|> Enum.map(fn key ->
667-
merged =
668-
case {address_based[key], symbol_based[key]} do
669-
{nil, nil} -> nil
670-
{a, nil} -> a
671-
{nil, b} -> b
672-
{a, b} -> Enum.uniq(a ++ b)
673-
end
674-
675-
{key, merged}
676-
end)
677-
end
678-
679632
defp prepare_address_relation(relation) do
680633
case relation && String.downcase(relation) do
681634
r when r in [nil, "or"] -> :or

apps/block_scout_web/test/block_scout_web/controllers/api/v2/advanced_filter_controller_test.exs

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -632,74 +632,6 @@ defmodule BlockScoutWeb.API.V2.AdvancedFilterControllerTest do
632632
end)
633633
end
634634

635-
test "filter by token_contract_symbols_to_include", %{conn: conn} do
636-
token_a = insert(:token, symbol: "SYMINCL_A")
637-
token_b = insert(:token, symbol: "SYMINCL_B")
638-
token_c = insert(:token, symbol: "SYMINCL_C")
639-
640-
transaction = :transaction |> insert() |> with_block()
641-
642-
[token_a, token_b, token_c, token_a, token_b, token_c]
643-
|> Enum.with_index()
644-
|> Enum.each(fn {token, i} ->
645-
insert(:token_transfer,
646-
token_contract_address: token.contract_address,
647-
transaction: transaction,
648-
block_number: transaction.block_number,
649-
log_index: i
650-
)
651-
end)
652-
653-
request =
654-
get(conn, "/api/v2/advanced-filters", %{
655-
"token_contract_symbols_to_include" => "SYMINCL_A,SYMINCL_B"
656-
})
657-
658-
assert response = json_response(request, 200)
659-
660-
# Include filter: only token transfers whose contract matches — the parent
661-
# transaction itself has no token contract so it is excluded.
662-
assert Enum.count(response["items"]) == 4
663-
664-
assert Enum.all?(response["items"], fn item ->
665-
item["token"]["symbol"] in ["SYMINCL_A", "SYMINCL_B"]
666-
end)
667-
end
668-
669-
test "filter by token_contract_symbols_to_exclude", %{conn: conn} do
670-
token_a = insert(:token, symbol: "SYMEXCL_A")
671-
token_b = insert(:token, symbol: "SYMEXCL_B")
672-
token_c = insert(:token, symbol: "SYMEXCL_C")
673-
674-
transaction = :transaction |> insert() |> with_block()
675-
676-
[token_a, token_b, token_c, token_a, token_b, token_c]
677-
|> Enum.with_index()
678-
|> Enum.each(fn {token, i} ->
679-
insert(:token_transfer,
680-
token_contract_address: token.contract_address,
681-
transaction: transaction,
682-
block_number: transaction.block_number,
683-
log_index: i
684-
)
685-
end)
686-
687-
request =
688-
get(conn, "/api/v2/advanced-filters", %{
689-
"token_contract_symbols_to_exclude" => "SYMEXCL_C"
690-
})
691-
692-
assert response = json_response(request, 200)
693-
694-
# Exclude filter: 4 token transfers (A×2 + B×2) plus the parent transaction
695-
# itself (which has no token contract and is therefore not excluded).
696-
assert Enum.count(response["items"]) == 5
697-
698-
assert Enum.all?(response["items"], fn item ->
699-
is_nil(item["token"]) or item["token"]["symbol"] != "SYMEXCL_C"
700-
end)
701-
end
702-
703635
test "filter by age", %{conn: conn} do
704636
[_, transaction_a, _, transaction_b, _] =
705637
for i <- 0..4 do

apps/explorer/lib/explorer/chain/token.ex

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -468,16 +468,6 @@ defmodule Explorer.Chain.Token do
468468
|> Chain.select_repo(options).all()
469469
end
470470

471-
@doc """
472-
Gets tokens whose symbol matches any of the given symbols (case-sensitive).
473-
"""
474-
@spec get_by_symbols([String.t()], [Chain.api?()]) :: [__MODULE__.t()]
475-
def get_by_symbols(symbols, options) do
476-
__MODULE__
477-
|> where([t], t.symbol in ^symbols)
478-
|> Chain.select_repo(options).all()
479-
end
480-
481471
@doc """
482472
For usage in Indexer.Fetcher.TokenInstance.SanitizeERC721
483473
"""

cspell.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -680,8 +680,6 @@
680680
"sushiswap",
681681
"swal",
682682
"sweetalert",
683-
"SYMEXCL",
684-
"SYMINCL",
685683
"Synthereum",
686684
"tabindex",
687685
"tablist",

0 commit comments

Comments
 (0)