Skip to content

Sync upstream v2.8.0-alpha.1 (merge conflicts)#4

Open
JOY (JOY) wants to merge 67 commits intomainfrom
sync-upstream-v2.8.0-alpha.1
Open

Sync upstream v2.8.0-alpha.1 (merge conflicts)#4
JOY (JOY) wants to merge 67 commits intomainfrom
sync-upstream-v2.8.0-alpha.1

Conversation

@JOY
Copy link
Copy Markdown

Upstream Sync - v2.8.0-alpha.1

Auto-merge with upstream v2.8.0-alpha.1 failed due to conflicts.

To resolve:

  1. Check out this branch locally
  2. Resolve conflicts
  3. Push and merge this PR
  4. Then create tag v2.8.0-alpha.1 to trigger Docker build

Upstream release notes

tom goriunov (tom2drum) and others added 30 commits April 1, 2026 19:35
…ON (blockscout#3335)

* Hero banner: move 'explorer' to new ENV

Resolves blockscout#3290

* [skip ci] update docs
…lockscout#3337)

* Numeric widget: add new value from API

Resolves blockscout#3282

* [skip ci] add formatting to value title
…lockscout#3338)

* Support both chain slug and chain id in page parameters in multichain explorer mode

Resolves blockscout#3320

* fix test
* add export for address txs

* transfer all export from page to dialog

* remove old route and components

* improve file name and fix loading state of icon button

* basic implementation

* refetch item status

* status indicator for download items

* changes for multichain

* handle too many requests for downloads error

* update button styles and spacing

* fix tests

* disable async export for multichain

* Fix CSV export cancel flow and stabilize context updates

Applied via @cursor push command

* test and review fixes

* design fixes

* refactor file names

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* add export for address txs

* transfer all export from page to dialog

* remove old route and components

* improve file name and fix loading state of icon button

* basic implementation

* refetch item status

* status indicator for download items

* changes for multichain

* handle too many requests for downloads error

* update button styles and spacing

* fix tests

* disable async export for multichain

* Fix CSV export cancel flow and stabilize context updates

Applied via @cursor push command

* test and review fixes

* move file to client folder

* round 3

* add glossary

* migration tasks and skill

* move skills to .agents folder

* rename migrate skill

* refine project rules

* move MIGRATION_TASKS.md to client directory

* update sym links

* refine migration skills

* fixes after merging the main branch

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ckscout#3346)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…ckscout#3349)

Enable ESLint import/no-cycle and architecture boundary rules

Add eslint-plugin-boundaries with element-types matching ARCH_REDESIGN §8,
enable import/no-cycle (error in client/, warn in lib/ and ui/), extend
consistent-default-export-name to client/**/*.tsx, and document §10
types/api.ts enforcement as a follow-up.

Made-with: Cursor
* debug wallet client error

* Support raw text/html for NFT animation on the token instance page

Resolves blockscout#2609

* fix writing to a contract with dynamic provider

* change default interval for hot contracts

* wait for load event of NFT embed frame

* update screenshots

* add network validation mode to dynamic provider

* add rootstock mainnet preset

* update preset for rootsrock mainnet

* [skip ci] disable essential dapps for rootstock mainnet

* pass required flag to FormFieldSelect controller

* bump dynamic version

* fix rabby wallet tx write
Replaces text/plain with application/json for proper ingestion on the backend
Add Content-Type header to /api/v2/key request
…blockscout#3355)

* Support full instance specifiers for admin services handles

Resolves blockscout#3350

* fix ts
…lockscout#3351)

* fix stats counters layout

* ICTT users index

* bridged tokens page

* move bridged tokens to the tab on tokens page

* migrate to new API version

* add support for sankey chart on stats page

* rename Chart into LineChart

* create reusable chart components

* sankey widget

* cross chain txs paths chart page

* add filter for bridged tokens and fix sorting for ictt users

* hide chain select for paths chart

* add chain filter to paths chart page

* show zero-value nodes on sankey chart

* add tests

* refactoring

* fix tests

* review fixes

* Update ChainStatsDetails to handle counterparty chain IDs as an array and change chart sorting to ascending order
…ockscout#3359)

* Adjust scale in d3 to display correct resolution by week in stats

Resolves blockscout#2701

* fixes
- Rename second review environment and update values, workflow and jobs related to it
* bump nextjs version

* bump vite and path-to-regexp

* bump dev packages versions
…der (blockscout#3364)

* Initial plan

* feat: add DEFAULT_SERVER_NEW_BASE constant for Swagger server URL alignment

Add a new `DEFAULT_SERVER_NEW_BASE = 'http://localhost'` constant alongside
the existing `DEFAULT_SERVER_NEW = 'http://localhost/api'` to support new-style
Swagger documents where the server URL omits `/api` and each operation path
includes `/api` instead.

- The more-specific `DEFAULT_SERVER_NEW` check (with `/api`) is evaluated first
  to prevent overlap since `http://localhost` is a substring of `http://localhost/api`
- The new `DEFAULT_SERVER_NEW_BASE` handler replaces `http://localhost` with
  `${api.endpoint}${api.basePath ?? ''}` without appending `/api`
- Tests updated to properly exercise each branch

Agent-Logs-Url: https://github.com/blockscout/frontend/sessions/712e7bc9-f630-409c-bb97-9d8553bb200f

Co-authored-by: tom2drum <22130104+tom2drum@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tom2drum <22130104+tom2drum@users.noreply.github.com>
Review images are published to ghcr.io/blockscout/frontend-private since
commit 13203ef (Sep 2025). The reusable cleanup_docker.yaml now accepts
an optional imageName input (blockscout/actions PR #4); pass it here so
cleanup jobs delete from the correct GHCR package.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
blockscout/actions PR #4 adds an optional `namespace` input that defaults
to globalEnv (autodeploy-compatible). Frontend creates namespace from
appName, so pass it explicitly here.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
tom goriunov (tom2drum) and others added 23 commits April 30, 2026 12:21
* update env presets

* Multichain: support async csv export

Resolves blockscout#3331
* chore(migration 1-2): add codemod scripts for client/shared/ migration

Scripts used to mechanically move files, update relative imports in moved
files, and perform repo-wide absolute import path replacements for task 1-2.

https://claude.ai/code/session_01ANGHydwdidiSBdW359Mfv8

* feat(migration 1-2): migrate lib/ buckets to client/shared/

Moves all files per the issue scope:
- lib/mixpanel/         → client/shared/analytics/      (kebab-case rename)
- lib/rollbar/          → client/shared/monitoring/rollbar/
- lib/growthbook/       → client/shared/feature-flags/
- lib/networks/ + lib/units.ts → client/shared/chain/   (network→chain rename)
- lib/router/ + filter helpers → client/shared/router/  (kebab-case rename)
- lib/errors/           → client/shared/errors/         (kebab-case rename)
- lib/web3/             → client/shared/web3/           (kebab-case rename)
- lib/metadata/         → client/shared/metadata/       (kebab-case rename)
- lib/hooks/useTimeAgoIncrement → client/shared/date-and-time/
- lib/hooks/{useLazyRenderedList,useInitialList} + lib/getItemIndex → client/shared/lists/
- lib/cookies.ts        → client/shared/storage/
- lib/decodeJWT.ts      → client/shared/auth/
- lib/setLocale.ts      → client/shared/i18n/
- lib/{capitalizeFirstLetter,shortenString,escapeRegExp,highlightText} → client/shared/text/
- lib/{base64ToHex,bytesToBase64,bytesToHex,hexTo*} → client/shared/transformers/
- lib/utils/stripUtmParams → client/shared/links/utils/
- lib/{delay,isMetaKey} → client/shared/utils/
- lib/hooks/{useDebounce,...,useUpdateValueEffect} → client/shared/hooks/
- lib/getErrorMessage.ts → client/features/account/utils/get-api-error-text.ts
  (form-field error helper; distinct from lib/errors/getErrorMessage)

All import paths updated repo-wide (473 files). network→chain identifier
rename applied to all exported function names and call sites (22 files).

Codemod commands used:
  python3 scripts/migrate-1-2.py         # file copies
  python3 scripts/migrate-1-2-phase2.py  # import replacements + renames

Cross-slice deps left at old paths (excluded from this PR):
- client/shared/web3/useAddChain.tsx imports lib/hooks/useRewardsActivity
  → task 6-10

pnpm lint:tsc / lint:eslint could not be verified locally (node_modules
missing in environment); both commands produce identical errors on clean main.

https://claude.ai/code/session_01ANGHydwdidiSBdW359Mfv8

* fix(migration 1-2): resolve ESLint consistent-default-export-name errors

- Rename useInit.tsx → useMixpanelInit.tsx to match its exported function name;
  update import in analytics/index.ts
- Convert get-resource-error-payload.tsx → .ts (no JSX used; removes file from
  client/**/*.tsx rule scope)
- Convert is-meta-key.tsx → .ts (same reason)

https://claude.ai/code/session_01ANGHydwdidiSBdW359Mfv8

* fix(migration 1-2): fix remaining camelCase relative imports in moved files

Missed during phase 2: router and transformer files still referenced their
sibling modules by old camelCase filenames after rename to kebab-case.

- useEtherscanRedirects.ts: ./getQueryParamString → ./get-query-param-string
- get-filter-values-from-query.ts: ./getValuesArrayFromQuery → ./get-values-array-from-query
- base64-to-hex.ts: ./bytesToHex → ./bytes-to-hex
- hex-to-base64.ts: ./bytesToBase64 → ./bytes-to-base64, ./hexToBytes → ./hex-to-bytes

pnpm lint:tsc now passes with zero errors.

https://claude.ai/code/session_01ANGHydwdidiSBdW359Mfv8

* fix review comments: relocate chain-explorers, remove codemod scripts

- Move client/shared/chain/chain-explorers.ts → client/features/alternative-explorers/utils/explorers.ts
  (belongs to the alternative-explorers feature, not a generic shared util)
- Remove scripts/migrate-1-2*.py — codemod scripts should not be committed
- Add Alternative Explorers entry to docs/GLOSSARY.md
- Add task 6-28 (feature: alternative-explorers) to client/MIGRATION_TASKS.md
- Update arch-migrate skill: run codemod scripts locally then delete, never commit

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* more refactoring

---------

Co-authored-by: Claude <noreply@anthropic.com>
* Initial plan

* feat: remove zkEvm rollup option and all related code

Agent-Logs-Url: https://github.com/blockscout/frontend/sessions/89a09631-8af8-4a6d-bc36-9f9e790ee98e

Co-authored-by: tom2drum <22130104+tom2drum@users.noreply.github.com>

* more deletion

* fix spell checker

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tom2drum <22130104+tom2drum@users.noreply.github.com>
Co-authored-by: tom <tom@ohhhh.me>
* move types

* move stubs

* move mocks

* move tx index page components

* move tx details page components

* move TxEntity components

* move shared tx components

* update migration tasks

* [skip ci] update research skill
…3379)

* [Migration 3-1] Extract block types into feature type files

- Add BlockArbitrum + ArbitrumBlockData to rollup/arbitrum/types/api.ts
- Add BlockOptimism + OptimismBlockData to rollup/optimistic/types/api.ts
- Add BlockZkSync to rollup/zk-sync/types/api.ts
- Add BlockBaseFeeCelo + BlockCelo to chain-variants/celo/types/api.ts
- Add ZilliqaBlockData, ZilliqaQuorumCertificate, ZilliqaNestedQuorumCertificate,
  BlockZilliqa to chain-variants/zilliqa/types/api.ts
- Create chain-variants/rootstock/types/api.ts with BlockRootstock
- Create chain-variants/beacon-chain/types/api.ts with BlockWithdrawalsResponse,
  BlockWithdrawalsItem
- Add BlockDataAvailability to data-availability/types/api.ts
- Create client/slices/block/types/api.ts with Block extending all feature sub-types

https://claude.ai/code/session_017CjbiM8hMYA2vjkjtj6GnG

* [Migration 3-1] Move lib/block utils and block hooks to client/slices/block/

- lib/block/getBlockReward.ts → client/slices/block/utils/get-block-reward.ts
- lib/block/getBlockTotalReward.ts → client/slices/block/utils/get-block-total-reward.ts
- ui/block/useBlockQuery.tsx → client/slices/block/hooks/useBlockQuery.ts
- ui/block/useBlockTxsQuery.tsx → client/slices/block/hooks/useBlockTxsQuery.ts
- ui/block/useBlockInternalTxsQuery.tsx → client/slices/block/hooks/useBlockInternalTxsQuery.ts

https://claude.ai/code/session_017CjbiM8hMYA2vjkjtj6GnG

* [Migration 3-1] Move BlockDetails and BlockInternalTxs to client/slices/block/pages/details/

- ui/block/BlockDetails.tsx + .pw.tsx → client/slices/block/pages/details/
- ui/block/BlockInternalTxs.tsx → client/slices/block/pages/details/

https://claude.ai/code/session_017CjbiM8hMYA2vjkjtj6GnG

* [Migration 3-1] Move beacon-chain block pages to client/features/chain-variants/beacon-chain/

- ui/block/BlockDeposits.tsx → chain-variants/beacon-chain/pages/block/
- ui/block/BlockWithdrawals.tsx → chain-variants/beacon-chain/pages/block/
- ui/block/useBlockDepositsQuery.tsx → chain-variants/beacon-chain/pages/block/useBlockDepositsQuery.ts

https://claude.ai/code/session_017CjbiM8hMYA2vjkjtj6GnG

* [Migration 3-1] Move celo and remaining beacon-chain block pages to client/features/

- ui/block/BlockWithdrawals query → chain-variants/beacon-chain/pages/block/
- ui/block/BlockCeloEpochTag.tsx → chain-variants/celo/pages/block/
- ui/block/details/BlockDetailsBaseFeeCelo.tsx → chain-variants/celo/pages/block/

https://claude.ai/code/session_017CjbiM8hMYA2vjkjtj6GnG

* [Migration 3-1] Move BlockDetailsBaseFeeCelo visual tests and screenshots to celo feature

- ui/block/details/BlockDetailsBaseFeeCelo.pw.tsx → celo/pages/block/
- ui/block/details/__screenshots__/ (celo) → celo/pages/block/__screenshots__/

https://claude.ai/code/session_017CjbiM8hMYA2vjkjtj6GnG

* [Migration 3-1] Move Zilliqa block page to client/features/chain-variants/zilliqa/

- ui/block/details/BlockDetailsZilliqaQuorumCertificate.tsx + .pw.tsx + screenshots
  → chain-variants/zilliqa/pages/block/

https://claude.ai/code/session_017CjbiM8hMYA2vjkjtj6GnG

* [Migration 3-1] Move data-availability block pages to client/features/data-availability/

- ui/block/details/BlockDetailsBlobInfo.tsx → data-availability/pages/block/
- ui/block/useBlockBlobTxsQuery.tsx → data-availability/pages/block/useBlockBlobTxsQuery.ts

https://claude.ai/code/session_017CjbiM8hMYA2vjkjtj6GnG

* [Migration 3-1] Move blocks index page components (partial) to client/slices/block/pages/index/

- ui/blocks/BlocksContent.tsx → client/slices/block/pages/index/
- ui/blocks/BlocksList.tsx → client/slices/block/pages/index/

https://claude.ai/code/session_017CjbiM8hMYA2vjkjtj6GnG

* [Migration 3-1] Move blocks, blockCountdown, and shared block components to client/

- Move ui/blocks/* to client/slices/block/pages/index/ and client/features/flashblocks/
- Move ui/blockCountdown/* to client/slices/block/pages/countdown/
- Move ui/shared/block/* to client/slices/block/components/
- Move ui/shared/entities/block/* to client/slices/block/components/entity/ and client/features/rollup/
- Move mocks/blocks/block.ts and stubs/block.ts to client/slices/block/
- Update all imports across the codebase to use new paths
- Fix ESLint errors in migrated mock files (max-len, consistent-type-imports)

https://claude.ai/code/session_017CjbiM8hMYA2vjkjtj6GnG

* Move useBlockBlobTxsQuery to data-availability/hooks/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Move ui/pages/Block*.tsx and visual tests to client/slices/block/pages/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* split countdown page folder into two

* update migration research skill

---------

Co-authored-by: Claude <noreply@anthropic.com>
* [Migration 3-2] Slice: address — migrate address-related files to client/

Closes blockscout#3380

What moved:
- types/api/{address,addressParams,addresses}.ts → client/slices/address/types/api.ts
- types/client/addressMetadata.ts → client/features/address-metadata/types/view.ts
- types/api/addressMetadata.ts → client/features/address-metadata/types/api.ts
- lib/address/useAddressMetadata*.ts → client/features/address-metadata/hooks/
- lib/address/parseMetaPayload.ts → client/features/address-metadata/utils/
- lib/hooks/useAddressProfileApiQuery.tsx → client/features/address-profile-api/hooks/
- ui/shared/entities/address/AddressEntity*.tsx → client/slices/address/components/entity/
- ui/shared/entities/address/AddressEntityTacTon.tsx → client/features/chain-variants/tac/components/
- ui/shared/entities/address/AddressEntityZetaChain*.tsx → client/features/chain-variants/zeta-chain/components/
- ui/shared/entities/address/AddressEntityInterop*.tsx → client/features/op-interop/components/
- ui/shared/entities/address/AddressEntityL1.tsx → client/features/rollup/common/components/
- ui/address/coinBalance/* → client/slices/address/pages/coin-balance/
- ui/address/blocksValidated/* → client/slices/address/pages/blocks-validated/
- ui/address/nfts/* → client/slices/address/pages/nfts/
- ui/address/mud/* → client/features/chain-variants/mud/pages/address/
- ui/address/celo/* → client/features/chain-variants/celo/pages/address/
- ui/address/filecoin/* → client/features/chain-variants/filecoin/pages/address/
- ui/address/beacon-chain/* → client/features/chain-variants/beacon-chain/pages/address/
- ui/pages/Accounts.tsx → client/slices/address/pages/index/Accounts.tsx
- lib/address/AddressFavoriteButton.tsx → client/features/account/pages/address/
- ui/address/address3rdPartyWidgets/* → client/features/address-3rd-party-widgets/pages/address/
- Mud types extracted to client/features/chain-variants/mud/types/api.ts
- Celo epoch rewards types extracted to client/features/chain-variants/celo/types/api.ts
- Filecoin types extracted to client/features/chain-variants/filecoin/types/api.ts
- Zilliqa AddressZilliqaParams added to client/features/chain-variants/zilliqa/types/api.ts
- New stubs: client/slices/address/stubs/address{,-params}.ts
- New stubs: client/features/chain-variants/{celo,mud}/stubs/address.ts
- New utils: client/slices/address/utils/{tx,consts}.ts
- New view types: client/features/address-3rd-party-widgets/types/view.ts
- Deleted types/client/addressProfileAPIConfig.ts (type inlined in configs/app/features/address-profile-api.ts)
- pages/accounts/index.tsx updated to dynamic-import the new page location

Design decision: AddressCeloParams kept in client/slices/address/types/api.ts
(not extracted to celo feature) to avoid address-slice -> celo-feature -> address-slice
circular import, since AddressCeloParams references AddressParam.

Codemods run (not committed):
  # Redirect ADDRESS_HASH / ADDRESS_PARAMS stubs imports across repo
  find stubs/ ui/ lib/ client/ -name '*.ts' -o -name '*.tsx' | \
    xargs sed -i "s|from 'stubs/addressParams'|from 'client/slices/address/stubs/address-params'|g"

  # Redirect relative ./addressParams in stubs/
  sed -i "s|from './addressParams'|from 'client/slices/address/stubs/address-params'|g" stubs/*.ts

  # Redirect relative ./addressParams in types/api/
  find types/api/ -name '*.ts' | \
    xargs sed -i "s|from './addressParams'|from 'client/slices/address/types/api'|g"

  # Redirect addressMetadata imports in types/api/
  find types/api/ -name '*.ts' | \
    xargs sed -i "s|from './addressMetadata'|from 'client/features/address-metadata/types/api'|g"

Cross-slice deps left at legacy paths (pending future migrations):
- types/api/contract (SmartContractMudSystemsResponse, SmartContractMudSystemInfo)
- types/api/token (TokenInfo)
- types/api/tokenTransfer (TokenTransfer)
- types/api/internalTransaction (InternalTransaction)
- types/api/mudWorlds (MudWorldsResponse, MudTableInfo)
- types/api/epochs (CeloEpochRewardsType)
- ui/shared/entities/base/utils (EntityBaseProps etc.)

Checklist:
- [x] pnpm lint:tsc passes (zero errors)
- [x] pnpm lint:eslint:fix passes (no errors in client/)

https://claude.ai/code/session_016VNwTsfk9VTzWCTv8Ppmq3

* chore: update git-lfs husky hook messages (auto-updated by git lfs install)

https://claude.ai/code/session_016VNwTsfk9VTzWCTv8Ppmq3

* fix: delete source files after migrating to client/ (address review)

Address reviewer feedback: files were added to client/ but old source
files were not removed, leaving both locations active.

Changes:
- pages/address/[hash]/index.tsx: import Address from client/slices/address/pages/details/Address
- ui/pages/Token.tsx: update Address3rdPartyWidgets imports to client/features/address-3rd-party-widgets/pages/address/
- Delete ui/pages/Address.tsx (replaced by client/slices/address/pages/details/Address.tsx)
- Delete ui/pages/Accounts.tsx (replaced by client/slices/address/pages/index/Accounts.tsx)
- Move ui/pages/Address.pw.tsx to client/slices/address/pages/details/Address.pw.tsx
- Delete ui/pages/Accounts.pw.tsx (duplicate of client/slices/address/pages/index/Accounts.pw.tsx)
- Delete ui/address/ barrel files that were migrated and are no longer referenced:
  AddressBlocksValidated, AddressCoinBalance (still used by multichain — kept),
  AddressDetails, AddressInternalTxs, AddressLogs, AddressTokens, AddressTokenTransfers,
  AddressTxs, AddressWithdrawals, AddressMud, AddressMultichainInfoButton,
  AddressUserOps, AddressEpochRewards, AddressDeposits, AddressAccountHistory,
  Address3rdPartyWidgets and address3rdPartyWidgets/
- Delete ui/address/ subdirectories migrated to client/:
  blocksValidated/, mud/, filecoin/, address3rdPartyWidgets/
- Delete ui/address/details/ files only referenced by old Address.tsx:
  AddressFavoriteButton, AddressCeloAccount (migrated to celo feature)
- Delete ui/address/clusters/AddressClusters.tsx, ensDomains/AddressEnsDomains.tsx
- Delete ui/address/utils/ hooks only referenced by old Address.tsx:
  useAddressQuery, useCheckAddressFormat, useCheckDomainNameParam

Files left in ui/address/ (still referenced by ui/multichain/, ui/token/, client/ cross-deps):
- AddressContract, SolidityscanReport, contract/, AddressCoinBalance, coinBalance/,
  tokens/, details/AddressQrCode, details/AddressAlerts, details/AddressMultichainButton,
  utils/useAddressCountersQuery, utils/tokenUtils, AddressTxsFilter,
  AddressAdvancedFilterLink, AddressTokenTransfersLocal, testUtils/

https://claude.ai/code/session_016VNwTsfk9VTzWCTv8Ppmq3

* fix: delete all remaining migrated ui/address/ files; update multichain/token imports

Complete the cleanup — all files that were migrated to client/ are now
deleted from their old ui/address/ locations.

Updated imports in:
- ui/multichain/address/MultichainAddressCoinBalanceHistory.tsx
- ui/multichain/address/MultichainAddressInternalTxs.tsx
- ui/multichain/address/MultichainAddressTokenTransfers.tsx
- ui/multichain/address/MultichainAddressTxs.tsx
- ui/multichain/address/MultichainAddress.tsx
- ui/multichain/address/MultichainAddressPortfolio.tsx
- ui/multichain/address/portfolio/MultichainAddressPortfolioNetWorth.tsx
- ui/multichain/address/portfolio/MultichainAddressPortfolioTokens.tsx
- ui/multichain/address/portfolio/MultichainAddressTokensListItem.tsx
- ui/multichain/address/portfolio/MultichainAddressTokensTable.tsx
- ui/multichain/address/portfolio/MultichainAddressTokensTableItem.tsx
- ui/token/TokenPageTitle.tsx
- ui/tokenInstance/TokenInstancePageTitle.tsx
- client/slices/address/pages/details/info/token-select/TokenSelect.pw.tsx

Deleted old ui/address/ files/dirs:
  AddressCoinBalance.tsx/.pw.tsx, AddressTokenTransfersLocal.tsx,
  AddressTxsFilter.tsx, AddressAdvancedFilterLink.tsx,
  useAddress{InternalTxs,TokenTransfers,TokenTransfersSocket,Txs}Query.ts,
  coinBalance/, tokens/, tokenSelect/, details/, utils/,
  accountHistory/, epochRewards/, testUtils/

Remaining in ui/address/ (out of scope — contract slice task):
  AddressContract.tsx/.pw.tsx, SolidityscanReport.tsx/.pw.tsx, contract/

https://claude.ai/code/session_016VNwTsfk9VTzWCTv8Ppmq3

* fixes

* move solidity scan to features

---------

Co-authored-by: Claude <noreply@anthropic.com>
…out#3390)

* Add copilot-setup-steps.yml with pnpm dependency installation

Agent-Logs-Url: https://github.com/blockscout/frontend/sessions/f1fddbff-09fd-44ca-8791-671c3bd62625

Co-authored-by: tom2drum <22130104+tom2drum@users.noreply.github.com>

* Remove redundant cache option from pnpm/action-setup

Agent-Logs-Url: https://github.com/blockscout/frontend/sessions/f1fddbff-09fd-44ca-8791-671c3bd62625

Co-authored-by: tom2drum <22130104+tom2drum@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tom2drum <22130104+tom2drum@users.noreply.github.com>
…label via children (blockscout#3386)

* truncate long value and labels in input and input groups

* adaptive tabs: pass list item props

* switch: render children as label

* screenshot updates and fixes

* add small size to checkbox and radio components

* fix flickering of empty state in charts components

* fix tests
* move address tokens components to token slice

* use singular nouns for slice names

* group imports from client directory
* promoting PRO API

* add .ai to .gitignore

* add client alias to Vite configuration

* two modes for llms.txt

---------

Co-authored-by: Alexander Kolotov <alexander.kolotov@gmail.com>
Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request continues the ongoing frontend architecture migration by moving various API services, features, and utility modules into the new client/ directory structure. It also introduces a new CSV export feature and updates several project configuration files and documentation. The review comments highlight a missing TODO reference, incorrect import formatting, a missing explanation for an eslint-disable comment, the use of an enum instead of a const object, and the use of a synchronous window.confirm dialog. All review comments are actionable and have been kept.

chainId?: string;
}

// TODO @tom2drum extract to a separate file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Every TODO comment must be paired with a clear follow-up plan or an issue reference to ensure it doesn't get lost in the codebase.

References
  1. TODOs are acceptable only when paired with a clear follow-up plan or issue reference. (link)

AddressTokenBalancesResponse,
} from 'types/api/address';
import type { AddressesMetadataSearchFilters, AddressesMetadataSearchResult, AddressesResponse } from 'types/api/addresses';
AddressesResponse } from 'client/slices/address/types/api';
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The import statement has incorrect formatting. The closing brace and the source path should be on separate lines or follow the project's standard import style for better readability.

Suggested change
AddressesResponse } from 'client/slices/address/types/api';
AddressesResponse,
} from 'client/slices/address/types/api';

if (!isInitialLoading && query.data?.info && !config.meta.seo.enhancedDataEnabled) {
metadata.update({ pathname: '/stats/[id]', query: { id } }, query.data.info);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Every eslint-disable comment must include an explanation for why the rule is being suppressed.

Suggested change
// eslint-disable-next-line react-hooks/exhaustive-deps
// eslint-disable-next-line react-hooks/exhaustive-deps -- update metadata only when initial loading is finished
References
  1. Every eslint-disable comment must include an explanation. (link)

Comment on lines +38 to +44
export enum StatsIntervalId {
all = 'all',
oneMonth = 'oneMonth',
threeMonths = 'threeMonths',
sixMonths = 'sixMonths',
oneYear = 'oneYear',
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Enums are discouraged in this project. Please use a const object or a union type instead to maintain consistency and improve type safety.

Suggested change
export enum StatsIntervalId {
all = 'all',
oneMonth = 'oneMonth',
threeMonths = 'threeMonths',
sixMonths = 'sixMonths',
oneYear = 'oneYear',
}
export const StatsIntervalId = {
all: 'all',
oneMonth: 'oneMonth',
threeMonths: 'threeMonths',
sixMonths: 'sixMonths',
oneYear: 'oneYear',
} as const;


const handleOpenChange: OnOpenChangeHandler = React.useCallback(({ open }) => {
if (formState.isSubmitting && !open) {
const confirm = window.confirm('Are you sure you want to close the dialog? The export will be cancelled.');
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Avoid using window.confirm as it is a blocking synchronous call and doesn't align with the application's design system. Consider using a custom confirmation dialog from the toolkit.

@JOY JOY (JOY) force-pushed the sync-upstream-v2.8.0-alpha.1 branch 4 times, most recently from 7baf271 to 5cc8337 Compare May 8, 2026 15:12
@JOY JOY (JOY) force-pushed the sync-upstream-v2.8.0-alpha.1 branch from 5cc8337 to 130817c Compare May 8, 2026 20:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants