Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
1aa5985
chore(deps): bump oban from 2.22.1 to 2.23.1 (#14682)
dependabot[bot] Aug 11, 2026
b3ca3f6
feat: Add /api/v2/transactions/{hash}/preview endpoint (#14638)
nikitosing Aug 11, 2026
dc043ab
chore(deps): bump tesla from 1.20.0 to 1.21.0 (#14683)
dependabot[bot] Aug 11, 2026
6389e9e
chore(deps-dev): bump sobelow from 0.14.1 to 0.15.0 (#14685)
dependabot[bot] Aug 11, 2026
e95dc6b
chore(deps-dev): bump ex_machina from 2.8.1 to 2.8.2 (#14684)
dependabot[bot] Aug 13, 2026
fd406a1
perf: reuse HTTP connections and parallelize microservice preloads (#…
vbaranov Aug 13, 2026
b272729
perf: Fetch address existence checks in a single query (#14694)
vbaranov Aug 13, 2026
6292a17
perf: cache empty implementations of verified contracts longer (#14696)
vbaranov Aug 13, 2026
4d50535
fix: Add missed metadata field to /preview (#14703)
nikitosing Aug 14, 2026
40349b0
chore: Update swagger spec for /preview (#14704)
nikitosing Aug 14, 2026
a61dffa
perf: reduce query count and payload in transaction API endpoint (#14…
vbaranov Aug 17, 2026
9fb10eb
fix: Fix state changes for sponsored transactions (#14702)
Qwerty5Uiop Aug 17, 2026
8a1cfbe
chore(deps-dev): bump js-yaml from 4.3.0 to 4.3.1 in /types-package (…
dependabot[bot] Aug 17, 2026
85953e3
fix: degrade gracefully when microservice HTTP pool is exhausted (#14…
vbaranov Aug 17, 2026
b15cf67
11.2.7
vbaranov Aug 17, 2026
277b31e
Update CHANGELOG
vbaranov Aug 18, 2026
5638991
chore: Fix transform addresses tests for zksync (#14717)
Qwerty5Uiop Aug 18, 2026
c60abc6
Update CHANGELOG
vbaranov Aug 18, 2026
1425d31
WIP: Merge upstream v11.2.7 (has conflicts)
github-actions[bot] Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,32 @@
# Changelog

## 11.2.7

### 🚀 Features

- Add /api/v2/transactions/{hash}/preview endpoint ([#14638](https://github.com/blockscout/blockscout/issues/14638), [#14703](https://github.com/blockscout/blockscout/issues/14703), [#14704](https://github.com/blockscout/blockscout/issues/14704))

### 🐛 Bug Fixes

- Fix state changes for sponsored transactions ([#14702](https://github.com/blockscout/blockscout/issues/14702))

### ⚡ Performance

- Reduce query count and payload in transaction API endpoint ([#14705](https://github.com/blockscout/blockscout/issues/14705))
- Cache empty implementations of verified contracts longer ([#14696](https://github.com/blockscout/blockscout/issues/14696))
- Fetch address existence checks in a single query ([#14694](https://github.com/blockscout/blockscout/issues/14694))
- Reuse HTTP connections and parallelize microservice preloads ([#14689](https://github.com/blockscout/blockscout/issues/14689), [#14707](https://github.com/blockscout/blockscout/issues/14707))
- Fix transform addresses tests for zksync ([#14717](https://github.com/blockscout/blockscout/pull/14717))

### New ENV variables

| Variable | Description | Parameters |
|-----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------|
| `CONTRACT_PROXY_EMPTY_IMPLEMENTATION_DATA_CACHE_TTL` | Empty probe results ("not a proxy") of smart-contracts verified on the address itself are refreshed with a dedicated, much longer TTL. Unverified contracts, bytecode twins, and real proxies keep the existing TTL behavior. [Time format](/setup/env-variables/backend-env-variables#time-format). Implemented in [#14689](https://github.com/blockscout/blockscout/pull/14689). | Version: v11.2.7+ <br />Default: `1d` <br />Applications: API |
| `MICROSERVICE_HTTP_POOL_SIZE` | Total size of the keep-alive connection pools used by `Explorer.MicroserviceInterfaces.HttpClient` for BENS and Metadata requests. This total is split across multiple pools controlled by `MICROSERVICE_HTTP_POOL_COUNT`. Each individual pool size is calculated as `MICROSERVICE_HTTP_POOL_SIZE / MICROSERVICE_HTTP_POOL_COUNT`. Two logical pools are used: `:microservices` for short requests on the critical path and `:microservices_proxy` for requests proxied to a microservice on behalf of an API caller, so a handful of long-running proxied requests can no longer starve the preloads. Both pools are supervised from `Explorer.Application`. Implemented in [#14689](https://github.com/blockscout/blockscout/pull/14689) | Version: v11.2.7+ <br />Default: `1000` <br />Applications: API |
| `MICROSERVICE_HTTP_POOL_COUNT` | Number of individual connection pools to split `MICROSERVICE_HTTP_POOL_SIZE` across. Pool splitting allows traffic to spread across multiple processes, reducing contention. Each pool size is calculated as `MICROSERVICE_HTTP_POOL_SIZE / MICROSERVICE_HTTP_POOL_COUNT`. Implemented in [#14707](https://github.com/blockscout/blockscout/pull/14707) | Version: v11.2.7+ <br />Default: `4` <br />Applications: API, Indexer |


## 11.2.6

### 🐛 Bug Fixes
Expand Down Expand Up @@ -28,6 +55,13 @@
- Bump ex_abi lib version ([#14671](https://github.com/blockscout/blockscout/issues/14671))


### New ENV variables

| Variable | Description | Parameters |
|-----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------|
| `INDEXER_DISABLE_TOKEN_BALANCE_ON_DEMAND_FETCHER` | If `true`, `Indexer.Fetcher.OnDemand.TokenBalance` fetcher is disabled at runtime. | Version: v11.2.5\+ <br />Default: `false` <br />Applications: Indexer |


## 11.2.4

### 🚀 Features
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,11 @@ defmodule BlockScoutWeb.API.V2.AddressController do

import Explorer.Helper, only: [safe_parse_non_negative_integer: 1]

import Explorer.MicroserviceInterfaces.BENS,
only: [
maybe_preload_ens: 1,
maybe_preload_ens_for_token_transfers: 1,
maybe_preload_ens_for_transactions: 1,
maybe_preload_ens_to_address: 1
]
import Explorer.MicroserviceInterfaces.BENS, only: [maybe_preload_ens_to_address: 1]

import Explorer.Chain.Address.MetadataPreloader,
only: [maybe_preload_ens_and_metadata: 1, maybe_preload_ens_and_metadata: 2]

import Explorer.MicroserviceInterfaces.Metadata, only: [maybe_preload_metadata: 1]
import Explorer.Chain.Address.Reputation, only: [reputation_association: 0]

alias BlockScoutWeb.AccessHelper
Expand Down Expand Up @@ -424,7 +420,7 @@ defmodule BlockScoutWeb.API.V2.AddressController do
|> put_status(200)
|> put_view(TransactionView)
|> render(:transactions, %{
transactions: transactions |> maybe_preload_ens_for_transactions() |> maybe_preload_metadata(),
transactions: transactions |> maybe_preload_ens_and_metadata(:transactions),
next_page_params: next_page_params
})

Expand Down Expand Up @@ -554,8 +550,7 @@ defmodule BlockScoutWeb.API.V2.AddressController do
token_transfers:
token_transfers
|> Instance.preload_nft(@api_true)
|> maybe_preload_ens_for_token_transfers()
|> maybe_preload_metadata(),
|> maybe_preload_ens_and_metadata(:token_transfers),
next_page_params: next_page_params
})

Expand Down Expand Up @@ -636,7 +631,7 @@ defmodule BlockScoutWeb.API.V2.AddressController do
|> put_status(200)
|> put_view(TransactionView)
|> render(:internal_transactions, %{
internal_transactions: internal_transactions |> maybe_preload_ens() |> maybe_preload_metadata(),
internal_transactions: internal_transactions |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params
})

Expand Down Expand Up @@ -711,7 +706,7 @@ defmodule BlockScoutWeb.API.V2.AddressController do
|> put_status(200)
|> put_view(TransactionView)
|> render(:logs, %{
logs: logs |> maybe_preload_ens() |> maybe_preload_metadata(),
logs: logs |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params
})

Expand Down Expand Up @@ -1034,7 +1029,7 @@ defmodule BlockScoutWeb.API.V2.AddressController do
|> put_status(200)
|> put_view(WithdrawalView)
|> render(:withdrawals, %{
withdrawals: withdrawals |> maybe_preload_ens() |> maybe_preload_metadata(),
withdrawals: withdrawals |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params
})

Expand Down Expand Up @@ -1109,7 +1104,7 @@ defmodule BlockScoutWeb.API.V2.AddressController do
conn
|> put_status(200)
|> render(:addresses, %{
addresses: addresses |> maybe_preload_ens() |> maybe_preload_metadata(),
addresses: addresses |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params,
exchange_rate: exchange_rate,
total_supply: total_supply
Expand Down Expand Up @@ -1550,7 +1545,7 @@ defmodule BlockScoutWeb.API.V2.AddressController do
|> put_status(200)
|> put_view(DepositView)
|> render(:deposits, %{
deposits: deposits |> maybe_preload_ens() |> maybe_preload_metadata(),
deposits: deposits |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params
})
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,9 @@ defmodule BlockScoutWeb.API.V2.BlockController do
internal_transaction_call_type_options: 1
]

import Explorer.MicroserviceInterfaces.BENS,
only: [maybe_preload_ens: 1, maybe_preload_ens_for_blocks: 1, maybe_preload_ens_for_transactions: 1]
import Explorer.Chain.Address.MetadataPreloader,
only: [maybe_preload_ens_and_metadata: 1, maybe_preload_ens_and_metadata: 2]

import Explorer.MicroserviceInterfaces.Metadata, only: [maybe_preload_metadata: 1]
import Explorer.Chain.Address.Reputation, only: [reputation_association: 0]

alias BlockScoutWeb.API.V2.{
Expand Down Expand Up @@ -227,7 +226,7 @@ defmodule BlockScoutWeb.API.V2.BlockController do
conn
|> put_status(200)
|> render(:blocks, %{
blocks: blocks |> maybe_preload_ens_for_blocks() |> maybe_preload_metadata(),
blocks: blocks |> maybe_preload_ens_and_metadata(:blocks),
next_page_params: next_page_params
})
end
Expand Down Expand Up @@ -274,7 +273,7 @@ defmodule BlockScoutWeb.API.V2.BlockController do
conn
|> put_status(200)
|> render(:blocks, %{
blocks: blocks |> maybe_preload_ens_for_blocks() |> maybe_preload_metadata(),
blocks: blocks |> maybe_preload_ens_and_metadata(:blocks),
next_page_params: next_page_params
})
end
Expand Down Expand Up @@ -322,7 +321,7 @@ defmodule BlockScoutWeb.API.V2.BlockController do
conn
|> put_status(200)
|> render(:blocks, %{
blocks: blocks |> maybe_preload_ens_for_blocks() |> maybe_preload_metadata(),
blocks: blocks |> maybe_preload_ens_and_metadata(:blocks),
next_page_params: next_page_params
})
end
Expand Down Expand Up @@ -370,7 +369,7 @@ defmodule BlockScoutWeb.API.V2.BlockController do
conn
|> put_status(200)
|> render(:blocks, %{
blocks: blocks |> maybe_preload_ens_for_blocks() |> maybe_preload_metadata(),
blocks: blocks |> maybe_preload_ens_and_metadata(:blocks),
next_page_params: next_page_params
})
end
Expand Down Expand Up @@ -424,7 +423,7 @@ defmodule BlockScoutWeb.API.V2.BlockController do
|> put_status(200)
|> put_view(TransactionView)
|> render(:transactions, %{
transactions: transactions |> maybe_preload_ens_for_transactions() |> maybe_preload_metadata(),
transactions: transactions |> maybe_preload_ens_and_metadata(:transactions),
next_page_params: next_page_params
})
end
Expand Down Expand Up @@ -546,7 +545,7 @@ defmodule BlockScoutWeb.API.V2.BlockController do
|> put_status(200)
|> put_view(WithdrawalView)
|> render(:withdrawals, %{
withdrawals: withdrawals |> maybe_preload_ens() |> maybe_preload_metadata(),
withdrawals: withdrawals |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params
})
end
Expand Down Expand Up @@ -684,7 +683,7 @@ defmodule BlockScoutWeb.API.V2.BlockController do
|> put_status(200)
|> put_view(DepositView)
|> render(:deposits, %{
deposits: deposits |> maybe_preload_ens() |> maybe_preload_metadata(),
deposits: deposits |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params
})
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ defmodule BlockScoutWeb.API.V2.Ethereum.DepositController do
use OpenApiSpex.ControllerSpecs

import BlockScoutWeb.Chain, only: [next_page_params: 5, split_list_by_page: 1]
import Explorer.MicroserviceInterfaces.BENS, only: [maybe_preload_ens: 1]
import Explorer.MicroserviceInterfaces.Metadata, only: [maybe_preload_metadata: 1]
import Explorer.Chain.Address.MetadataPreloader, only: [maybe_preload_ens_and_metadata: 1]

alias Explorer.{Chain, PagingOptions}
alias Explorer.Chain.Beacon.Deposit
Expand Down Expand Up @@ -74,7 +73,7 @@ defmodule BlockScoutWeb.API.V2.Ethereum.DepositController do
conn
|> put_status(200)
|> render(:deposits, %{
deposits: deposits |> maybe_preload_ens() |> maybe_preload_metadata(),
deposits: deposits |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params
})
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,7 @@ defmodule BlockScoutWeb.API.V2.MainPageController do

import BlockScoutWeb.Account.AuthController, only: [current_user: 1]

import Explorer.MicroserviceInterfaces.BENS,
only: [maybe_preload_ens_for_blocks: 1, maybe_preload_ens_for_transactions: 1]

import Explorer.MicroserviceInterfaces.Metadata, only: [maybe_preload_metadata: 1]
import Explorer.Chain.Address.MetadataPreloader, only: [maybe_preload_ens_and_metadata: 2]
import Explorer.Chain.Address.Reputation, only: [reputation_association: 0]

case @chain_identity do
Expand Down Expand Up @@ -81,7 +78,7 @@ defmodule BlockScoutWeb.API.V2.MainPageController do
conn
|> put_status(200)
|> put_view(BlockView)
|> render(:blocks, %{blocks: blocks |> maybe_preload_ens_for_blocks() |> maybe_preload_metadata()})
|> render(:blocks, %{blocks: blocks |> maybe_preload_ens_and_metadata(:blocks)})
end

operation :transactions,
Expand Down Expand Up @@ -110,7 +107,7 @@ defmodule BlockScoutWeb.API.V2.MainPageController do
|> put_status(200)
|> put_view(TransactionView)
|> render(:transactions, %{
transactions: recent_transactions |> maybe_preload_ens_for_transactions() |> maybe_preload_metadata()
transactions: recent_transactions |> maybe_preload_ens_and_metadata(:transactions)
})
end

Expand Down Expand Up @@ -142,7 +139,7 @@ defmodule BlockScoutWeb.API.V2.MainPageController do
|> put_status(200)
|> put_view(TransactionView)
|> render(:transactions_watchlist, %{
transactions: transactions |> maybe_preload_ens_for_transactions() |> maybe_preload_metadata(),
transactions: transactions |> maybe_preload_ens_and_metadata(:transactions),
watchlist_names: watchlist_names
})
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ defmodule BlockScoutWeb.API.V2.MudController do
import BlockScoutWeb.PagingHelper, only: [mud_records_sorting: 1]
import Explorer.PagingOptions, only: [default_paging_options: 0]

import Explorer.MicroserviceInterfaces.BENS, only: [maybe_preload_ens: 1]
import Explorer.MicroserviceInterfaces.Metadata, only: [maybe_preload_metadata: 1]
import Explorer.Chain.Address.MetadataPreloader, only: [maybe_preload_ens_and_metadata: 1]

alias BlockScoutWeb.Schemas.Helper, as: SchemasHelper
alias Explorer.Chain
Expand Down Expand Up @@ -83,8 +82,7 @@ defmodule BlockScoutWeb.API.V2.MudController do
worlds:
worlds
|> Enum.map(fn world -> Map.get(world_addresses, world, %Address{hash: world}) end)
|> maybe_preload_ens()
|> maybe_preload_metadata(),
|> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params
})
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,9 @@ defmodule BlockScoutWeb.API.V2.TokenController do
tokens_sorting: 1
]

import Explorer.MicroserviceInterfaces.BENS,
only: [maybe_preload_ens: 1, maybe_preload_ens_for_token_transfers: 1]
import Explorer.Chain.Address.MetadataPreloader,
only: [maybe_preload_ens_and_metadata: 1, maybe_preload_ens_and_metadata: 2]

import Explorer.MicroserviceInterfaces.Metadata, only: [maybe_preload_metadata: 1]
import Explorer.PagingOptions, only: [default_paging_options: 0]

action_fallback(BlockScoutWeb.API.V2.FallbackController)
Expand Down Expand Up @@ -186,8 +185,7 @@ defmodule BlockScoutWeb.API.V2.TokenController do
token_transfers:
token_transfers
|> Instance.preload_nft(@api_true)
|> maybe_preload_ens_for_token_transfers()
|> maybe_preload_metadata(),
|> maybe_preload_ens_and_metadata(:token_transfers),
next_page_params: next_page_params
})
end
Expand Down Expand Up @@ -234,7 +232,7 @@ defmodule BlockScoutWeb.API.V2.TokenController do
conn
|> put_status(200)
|> render(:token_holders, %{
token_balances: token_balances |> maybe_preload_ens() |> maybe_preload_metadata(),
token_balances: token_balances |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params
})
end
Expand Down Expand Up @@ -304,8 +302,7 @@ defmodule BlockScoutWeb.API.V2.TokenController do
token_instances:
token_instances
|> put_owner(holder_address_with_proxy_implementations, holder_address_hash)
|> maybe_preload_ens()
|> maybe_preload_metadata(),
|> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params,
token: token
})
Expand All @@ -331,7 +328,7 @@ defmodule BlockScoutWeb.API.V2.TokenController do
conn
|> put_status(200)
|> render(:token_instances, %{
token_instances: token_instances |> maybe_preload_ens() |> maybe_preload_metadata(),
token_instances: token_instances |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params,
token: token
})
Expand Down Expand Up @@ -445,7 +442,7 @@ defmodule BlockScoutWeb.API.V2.TokenController do
|> put_status(200)
|> put_view(TransactionView)
|> render(:token_transfers, %{
token_transfers: token_transfers |> maybe_preload_ens_for_token_transfers() |> maybe_preload_metadata(),
token_transfers: token_transfers |> maybe_preload_ens_and_metadata(:token_transfers),
next_page_params: next_page_params
})
end
Expand Down Expand Up @@ -503,7 +500,7 @@ defmodule BlockScoutWeb.API.V2.TokenController do
conn
|> put_status(200)
|> render(:token_holders, %{
token_balances: token_holders |> maybe_preload_ens() |> maybe_preload_metadata(),
token_balances: token_holders |> maybe_preload_ens_and_metadata(),
next_page_params: next_page_params
})
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,7 @@ defmodule BlockScoutWeb.API.V2.TokenTransferController do
token_transfers_types_options: 1
]

import Explorer.MicroserviceInterfaces.BENS,
only: [maybe_preload_ens_for_token_transfers: 1]

import Explorer.MicroserviceInterfaces.Metadata, only: [maybe_preload_metadata: 1]
import Explorer.Chain.Address.MetadataPreloader, only: [maybe_preload_ens_and_metadata: 2]
import Explorer.PagingOptions, only: [default_paging_options: 0]

alias Explorer.Chain.Token.Instance
Expand Down Expand Up @@ -110,8 +107,7 @@ defmodule BlockScoutWeb.API.V2.TokenTransferController do
token_transfers:
token_transfers
|> Instance.preload_nft(@api_true)
|> maybe_preload_ens_for_token_transfers()
|> maybe_preload_metadata(),
|> maybe_preload_ens_and_metadata(:token_transfers),
decoded_transactions_map: decoded_transactions_map,
next_page_params: next_page_params
})
Expand Down
Loading
Loading