From 6b222fd2b29e1b5f617ac92b73697f019fd08b44 Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 23 Jun 2026 19:15:44 +0200 Subject: [PATCH 01/13] add cross chain txs on home page --- .env.extra | 3 ++ .../multichain/pages/home/LatestTxs.tsx | 4 ++- .../pages/home/LatestTxsCrossChain.tsx | 30 +++++++++++++++++++ src/server/getServerSideProps/main.ts | 2 +- src/shared/entities/components.tsx | 1 + src/shared/entities/utils.ts | 4 +-- src/shared/values/entity/SimpleValue.tsx | 2 +- .../values/entity/TokenValueInterchain.tsx | 2 +- .../components/entity/AddressEntity.tsx | 3 +- .../entity/AddressEntityInterchain.tsx | 7 +++-- .../entity/TokenEntityInterchain.tsx | 7 +++-- .../components/entity/TxEntityInterchain.tsx | 7 +++-- 12 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 src/features/multichain/pages/home/LatestTxsCrossChain.tsx diff --git a/.env.extra b/.env.extra index 943d499c57..27b090f6b4 100644 --- a/.env.extra +++ b/.env.extra @@ -7,3 +7,6 @@ # # This file IS committed — keep it empty on main. Do NOT put secrets here (use .env.secrets, # git-ignored). For purely-local, personal overrides use .env.local (git-ignored). + +NEXT_PUBLIC_CROSS_CHAIN_TXS_ENABLED=true +NEXT_PUBLIC_INTERCHAIN_INDEXER_API_HOST=https://interchain-indexer.k8s-dev.blockscout.com \ No newline at end of file diff --git a/src/features/multichain/pages/home/LatestTxs.tsx b/src/features/multichain/pages/home/LatestTxs.tsx index 4e5140f9cb..78008e6ff9 100644 --- a/src/features/multichain/pages/home/LatestTxs.tsx +++ b/src/features/multichain/pages/home/LatestTxs.tsx @@ -7,11 +7,13 @@ import ChainSelect from 'src/features/multichain/components/ChainSelect'; import { MultichainProvider } from 'src/features/multichain/context'; import useRoutedChainSelect from 'src/features/multichain/hooks/useRoutedChainSelect'; +import config from 'src/config'; import getQueryParamString from 'src/shared/router/get-query-param-string'; import { EmptyState } from 'src/toolkit/chakra/empty-state'; import RoutedTabs from 'src/toolkit/components/RoutedTabs/RoutedTabs'; +import LatestTxsCrossChain from './LatestTxsCrossChain'; import LatestTxsLocal from './LatestTxsLocal'; const LatestTxs = () => { @@ -25,7 +27,7 @@ const LatestTxs = () => { { id: 'cross_chain_txs', title: 'Cross-chain txns', - component: , + component: config.features.crossChainTxs.isEnabled ? : , }, { id: 'txs_local', diff --git a/src/features/multichain/pages/home/LatestTxsCrossChain.tsx b/src/features/multichain/pages/home/LatestTxsCrossChain.tsx new file mode 100644 index 0000000000..7b4d41e19e --- /dev/null +++ b/src/features/multichain/pages/home/LatestTxsCrossChain.tsx @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: LicenseRef-Blockscout + +import React from 'react'; + +import useApiQuery from 'src/api/hooks/useApiQuery'; + +import TransactionsCrossChainContent from 'src/features/cross-chain-txs/components/txs/TransactionsCrossChainContent'; +import { INTERCHAIN_MESSAGE } from 'src/features/cross-chain-txs/stubs/messages'; + +import { generateListStub } from 'src/shared/pagination/utils'; + +const TXS_NUM = 3; + +const LatestTxsCrossChain = () => { + const { data, isPlaceholderData, isError } = useApiQuery('interchainIndexer:messages', { + queryOptions: { + placeholderData: generateListStub<'interchainIndexer:messages'>(INTERCHAIN_MESSAGE, TXS_NUM, { next_page_params: { page_token: 'token' } }), + }, + }); + + return ( + + ); +}; + +export default React.memo(LatestTxsCrossChain); diff --git a/src/server/getServerSideProps/main.ts b/src/server/getServerSideProps/main.ts index ebc332b22c..b89541266c 100644 --- a/src/server/getServerSideProps/main.ts +++ b/src/server/getServerSideProps/main.ts @@ -34,7 +34,7 @@ export const publicTagsSubmit = factory([ guards.publicTagsSubmit ]); export const pools = factory([ guards.pools ]); export const megaEth = factory([ guards.megaEth ]); export const zetaChainCCTX = factory([ guards.zetaChainCCTX ]); -export const crossChainTxs = factory([ guards.notMultichain, guards.crossChainTxs ]); +export const crossChainTxs = factory([ guards.crossChainTxs ]); // ROLLUPS export const rollup = factory([ guards.rollup ]); diff --git a/src/shared/entities/components.tsx b/src/shared/entities/components.tsx index 1d6c8e7e61..746dad45d4 100644 --- a/src/shared/entities/components.tsx +++ b/src/shared/entities/components.tsx @@ -104,6 +104,7 @@ type EntityIconProps = (ImageProps | SpriteIconProps) & Pick & EntityIconProps; diff --git a/src/shared/entities/utils.ts b/src/shared/entities/utils.ts index 8dd286262f..31b1a4745a 100644 --- a/src/shared/entities/utils.ts +++ b/src/shared/entities/utils.ts @@ -12,13 +12,13 @@ export function getIconProps(props: IconBaseProps, withShield: boolean = false) case 'subheading': { return { boxSize: props.boxSize ?? '20px', // for tables, lists, regular content and page subheadings - marginRight: props.marginRight ?? props.mr ?? (withShield ? '18px' : '8px'), + marginRight: withShield ? props.marginRightShield ?? '18px' : props.marginRight ?? props.mr ?? '8px', }; } case 'heading': { return { boxSize: props.boxSize ?? '30px', // for page headings - marginRight: props.marginRight ?? props.mr ?? (withShield ? '14px' : '8px'), + marginRight: withShield ? props.marginRightShield ?? '14px' : props.marginRight ?? props.mr ?? '8px', }; } } diff --git a/src/shared/values/entity/SimpleValue.tsx b/src/shared/values/entity/SimpleValue.tsx index 2b2f0a96d8..5649a51a50 100644 --- a/src/shared/values/entity/SimpleValue.tsx +++ b/src/shared/values/entity/SimpleValue.tsx @@ -56,7 +56,7 @@ const SimpleValue = ({ }, [ postfix, prefix, value, tooltipContentBefore ]); return ( - + { startElement } ); diff --git a/src/slices/address/components/entity/AddressEntity.tsx b/src/slices/address/components/entity/AddressEntity.tsx index fb0055d18b..6d166c0e91 100644 --- a/src/slices/address/components/entity/AddressEntity.tsx +++ b/src/slices/address/components/entity/AddressEntity.tsx @@ -17,6 +17,7 @@ import { distributeEntityProps, getContentProps, getIconProps } from 'src/shared import getChainTooltipText from 'src/shared/external-chains/get-chain-tooltip-text'; import { route } from 'src/shared/router/routes'; import type { IconName } from 'src/sprite/SpriteIcon'; +import SpriteIcon from 'src/sprite/SpriteIcon'; import { Skeleton } from 'src/toolkit/chakra/skeleton'; import { Tooltip } from 'src/toolkit/chakra/tooltip'; @@ -129,7 +130,7 @@ const Icon = (props: IconProps) => { size={ props.size ?? (props.variant === 'heading' ? 30 : 20) } hash={ getDisplayedAddress(props.address) } /> - { shield && } + { shield && }/> } { isDelegatedAddress && } diff --git a/src/slices/address/components/entity/AddressEntityInterchain.tsx b/src/slices/address/components/entity/AddressEntityInterchain.tsx index a3c855b4cc..7ded6297d7 100644 --- a/src/slices/address/components/entity/AddressEntityInterchain.tsx +++ b/src/slices/address/components/entity/AddressEntityInterchain.tsx @@ -5,6 +5,8 @@ import React from 'react'; import type { ExternalChain } from 'src/shared/external-chains/types'; +import multichainConfig from 'src/features/multichain/chains-config'; + import config from 'src/config'; import type { EntityProps } from './AddressEntity'; @@ -20,9 +22,10 @@ const AddressEntityInterchain = ({ chain, currentAddress, ...props }: Props) => const isCurrentChain = chain?.id === config.chain.id; const isCurrentAddress = isCurrentChain && currentAddress?.toLowerCase() === props.address.hash.toLowerCase(); + const isMultichainAddress = multichainConfig()?.chains.some(({ id }) => id === chain?.id); - if (isCurrentChain) { - return ; + if (isCurrentChain || isMultichainAddress) { + return ; } return ; diff --git a/src/slices/token/components/entity/TokenEntityInterchain.tsx b/src/slices/token/components/entity/TokenEntityInterchain.tsx index 3f04cf5345..8fe85401ab 100644 --- a/src/slices/token/components/entity/TokenEntityInterchain.tsx +++ b/src/slices/token/components/entity/TokenEntityInterchain.tsx @@ -9,6 +9,8 @@ import type { EntityProps } from 'src/slices/token/components/entity/TokenEntity import TokenEntity from 'src/slices/token/components/entity/TokenEntity'; import TokenEntityExternal from 'src/slices/token/components/entity/TokenEntityExternal'; +import multichainConfig from 'src/features/multichain/chains-config'; + import config from 'src/config'; interface Props extends EntityProps, JsxStyleProps { @@ -18,9 +20,10 @@ interface Props extends EntityProps, JsxStyleProps { const TokenEntityInterchain = ({ chain, ...props }: Props) => { const isCurrentChain = chain?.id === config.chain.id; + const multichainChainInfo = multichainConfig()?.chains.find(({ id }) => id === chain?.id); - if (isCurrentChain) { - return ; + if (isCurrentChain || multichainChainInfo) { + return ; } return ; diff --git a/src/slices/tx/components/entity/TxEntityInterchain.tsx b/src/slices/tx/components/entity/TxEntityInterchain.tsx index a5db813bd0..97aa353b85 100644 --- a/src/slices/tx/components/entity/TxEntityInterchain.tsx +++ b/src/slices/tx/components/entity/TxEntityInterchain.tsx @@ -5,6 +5,8 @@ import React from 'react'; import type { ExternalChain } from 'src/shared/external-chains/types'; +import multichainConfig from 'src/features/multichain/chains-config'; + import config from 'src/config'; import type { EntityProps as TxEntityProps } from './TxEntity'; @@ -18,9 +20,10 @@ interface Props extends TxEntityProps, JsxStyleProps { const TxEntityInterchain = ({ chain, ...props }: Props) => { const isCurrentChain = chain?.id === config.chain.id; + const multichainChainInfo = multichainConfig()?.chains.find(({ id }) => id === chain?.id); - if (isCurrentChain) { - return ; + if (isCurrentChain || multichainChainInfo) { + return ; } return ; From 843f8bc214ea337035d1b1add8d3cb5c3de882d7 Mon Sep 17 00:00:00 2001 From: tom Date: Wed, 24 Jun 2026 19:46:04 +0200 Subject: [PATCH 02/13] enable cross-chain view for txs, token transfers and address --- package.json | 2 +- pnpm-lock.yaml | 10 +-- .../components/CrossChainTxsStatusTag.tsx | 2 + .../txs/TransactionsCrossChainListItem.tsx | 2 +- .../pages/address/AddressTxsCrossChain.tsx | 4 +- .../MultichainAddressTokenTransfers.tsx | 40 +++++++++- .../pages/address/MultichainAddressTxs.tsx | 76 ++++++++++++++----- .../pages/home/LatestTxsCrossChain.tsx | 26 +++++-- .../MultichainTokenTransfers.tsx | 4 +- .../multichain/pages/txs/MultichainTxs.tsx | 4 +- .../values/entity/TokenValueInterchain.tsx | 1 - .../components/entity/TokenEntityExternal.tsx | 3 + 12 files changed, 135 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index 0cd998852d..3916eb4214 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "dependencies": { "@blockscout/api-types": "0.0.1-beta.06e7ef15c3", "@blockscout/bens-types": "1.7.1", - "@blockscout/interchain-indexer-types": "1.3.0", + "@blockscout/interchain-indexer-types": "1.5.0-beta3", "@blockscout/multichain-aggregator-types": "2.1.6", "@blockscout/points-types": "1.4.0-alpha.1", "@blockscout/stats-types": "2.11.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55b2f78081..cd2e551de0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,8 +28,8 @@ importers: specifier: 1.7.1 version: 1.7.1 '@blockscout/interchain-indexer-types': - specifier: 1.3.0 - version: 1.3.0 + specifier: 1.5.0-beta3 + version: 1.5.0-beta3 '@blockscout/multichain-aggregator-types': specifier: 2.1.6 version: 2.1.6 @@ -1318,8 +1318,8 @@ packages: '@blockscout/bens-types@1.7.1': resolution: {integrity: sha512-MNIvYbj1I2vcU2rb6otlRnVMIpFG2B1WDqC7HicNrt10DbM5yPZNfBcsNM+Mhk/965Aeg529Fd+BkV9zhINqjA==} - '@blockscout/interchain-indexer-types@1.3.0': - resolution: {integrity: sha512-S+nbsMJ4g10yjwf+BnJ5JL1jlvVHRGsCCpCEx57wQs5sw+odo22iVcZ2LmHNv8Vdh7Tn1+2tJonJQ0nKwadrig==} + '@blockscout/interchain-indexer-types@1.5.0-beta3': + resolution: {integrity: sha512-mAsyYMyebFsOdzLZK2DzV1nhbsf/SDIyZlPiVNWalqcMzeDwJUancf6cPU7DEtYhEWBVBcwd3jeXDUG6X5/u/w==} '@blockscout/multichain-aggregator-types@2.1.6': resolution: {integrity: sha512-qpotHqUXhp8NFZ9JioCn2B/gewWQ5stTV9QoHKnUbO/0HzXkLvJXdsOjqhkBlaVcOKEMFY08+T3t9O0oI0wQEA==} @@ -14456,7 +14456,7 @@ snapshots: '@blockscout/bens-types@1.7.1': {} - '@blockscout/interchain-indexer-types@1.3.0': {} + '@blockscout/interchain-indexer-types@1.5.0-beta3': {} '@blockscout/multichain-aggregator-types@2.1.6': {} diff --git a/src/features/cross-chain-txs/components/CrossChainTxsStatusTag.tsx b/src/features/cross-chain-txs/components/CrossChainTxsStatusTag.tsx index 8ee52d8fe4..15e8651f2f 100644 --- a/src/features/cross-chain-txs/components/CrossChainTxsStatusTag.tsx +++ b/src/features/cross-chain-txs/components/CrossChainTxsStatusTag.tsx @@ -23,6 +23,8 @@ const CrossChainTxsStatusTag = ({ status: statusProp, mode = 'compact', ...rest return { status: 'error' as const, text: 'Failed' }; case MessageStatus.MESSAGE_STATUS_INITIATED: return { status: 'pending' as const, text: 'Initiated' }; + case MessageStatus.MESSAGE_STATUS_READY_TO_CLAIM: + return { status: 'pending' as const, text: 'Ready to claim' }; default: return { status: undefined, text: undefined }; } diff --git a/src/features/cross-chain-txs/components/txs/TransactionsCrossChainListItem.tsx b/src/features/cross-chain-txs/components/txs/TransactionsCrossChainListItem.tsx index eaa6a6fd89..e010722931 100644 --- a/src/features/cross-chain-txs/components/txs/TransactionsCrossChainListItem.tsx +++ b/src/features/cross-chain-txs/components/txs/TransactionsCrossChainListItem.tsx @@ -114,7 +114,7 @@ const TransactionsCrossChainListItem = ({ data, isLoading, rowGap = 3, currentAd { data.transfers.length } ) : ( - { data.transfers.length } + { data.transfers.length } ) } Sender diff --git a/src/features/cross-chain-txs/pages/address/AddressTxsCrossChain.tsx b/src/features/cross-chain-txs/pages/address/AddressTxsCrossChain.tsx index d0ae40487e..010fc724dd 100644 --- a/src/features/cross-chain-txs/pages/address/AddressTxsCrossChain.tsx +++ b/src/features/cross-chain-txs/pages/address/AddressTxsCrossChain.tsx @@ -10,7 +10,7 @@ import Pagination from 'src/shared/pagination/Pagination'; import TransactionsCrossChainContent from '../../components/txs/TransactionsCrossChainContent'; import type { Props } from '../../components/txs/TransactionsCrossChainContent'; -const AddressCrossChainTxs = ({ pagination, isLoading, ...rest }: Props) => { +const AddressTxsCrossChain = ({ pagination, isLoading, ...rest }: Props) => { const isMobile = useIsMobile(); return ( @@ -31,4 +31,4 @@ const AddressCrossChainTxs = ({ pagination, isLoading, ...rest }: Props) => { ); }; -export default React.memo(AddressCrossChainTxs); +export default React.memo(AddressTxsCrossChain); diff --git a/src/features/multichain/pages/address/MultichainAddressTokenTransfers.tsx b/src/features/multichain/pages/address/MultichainAddressTokenTransfers.tsx index 8093fe85a9..14685120b5 100644 --- a/src/features/multichain/pages/address/MultichainAddressTokenTransfers.tsx +++ b/src/features/multichain/pages/address/MultichainAddressTokenTransfers.tsx @@ -10,6 +10,8 @@ import type { TabItemRegular } from 'src/toolkit/components/AdaptiveTabs/types'; import { SocketProvider } from 'src/api/socket/context'; import getSocketUrl from 'src/api/socket/get-socket-url'; +import ActionBar, { ACTION_BAR_HEIGHT_DESKTOP } from 'src/shell/page/action-bar/ActionBar'; + import useAddressCountersQuery from 'src/slices/address/hooks/useAddressCountersQuery'; import AddressTokenTransfersLocal from 'src/slices/address/pages/details/token-transfers/AddressTokenTransfersLocal'; import useAddressTokenTransfersQuery from 'src/slices/address/pages/details/token-transfers/useAddressTokenTransfersQuery'; @@ -17,14 +19,19 @@ import TokenTransferFilter from 'src/slices/token-transfer/components/TokenTrans import { getTokenFilterValue } from 'src/slices/token/utils/list-utils'; import AddressAdvancedFilterLink from 'src/features/advanced-filter/components/AddressAdvancedFilterLink'; +import TokenTransfersCrossChainContent from 'src/features/cross-chain-txs/components/token-transfers/TokenTransfersCrossChainContent'; +import { INTERCHAIN_TRANSFER } from 'src/features/cross-chain-txs/stubs/messages'; import CsvExport from 'src/features/csv-export/components/CsvExport'; import multichainConfig from 'src/features/multichain/chains-config'; import ChainSelect from 'src/features/multichain/components/ChainSelect'; import ListCounterText from 'src/features/multichain/components/ListCounterText'; import { MultichainProvider } from 'src/features/multichain/context'; +import config from 'src/config'; import useIsMobile from 'src/shared/hooks/useIsMobile'; import Pagination from 'src/shared/pagination/Pagination'; +import useQueryWithPages from 'src/shared/pagination/useQueryWithPages'; +import { generateListStub } from 'src/shared/pagination/utils'; import getQueryParamString from 'src/shared/router/get-query-param-string'; import { EmptyState } from 'src/toolkit/chakra/empty-state'; @@ -62,6 +69,15 @@ const MultichainAddressTokenTransfers = ({ addressData, isLoading }: Props) => { const chainIds = React.useMemo(() => getAvailableChainIds(addressData), [ addressData ]); + const transfersQueryCrossChain = useQueryWithPages({ + resourceName: 'interchainIndexer:address_transfers', + pathParams: { hash }, + options: { + placeholderData: generateListStub<'interchainIndexer:address_transfers'>(INTERCHAIN_TRANSFER, 50, { next_page_params: undefined }), + enabled: !isLoading && !isLocalTab, + }, + }); + const transfersQueryLocal = useAddressTokenTransfersQuery({ currentAddress: hash, enabled: isLocalTab && !isLoading && chainIds.length > 0, @@ -164,14 +180,34 @@ const MultichainAddressTokenTransfers = ({ addressData, isLoading }: Props) => { ); } - return null; + if (isMobile) { + return null; + } + + return ; })(); const tabs: Array = [ { id: 'token_transfers_cross_chain', title: 'Cross-chain', - component: , + component: config.features.crossChainTxs.isEnabled ? ( + <> + { isMobile && !isLocalTab && transfersQueryCrossChain.pagination.isVisible && ( + + + + ) } + + + ) : , }, { id: [ 'token_transfers_local', 'token_transfers' ], diff --git a/src/features/multichain/pages/address/MultichainAddressTxs.tsx b/src/features/multichain/pages/address/MultichainAddressTxs.tsx index 2f8ef77705..95b485bc09 100644 --- a/src/features/multichain/pages/address/MultichainAddressTxs.tsx +++ b/src/features/multichain/pages/address/MultichainAddressTxs.tsx @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-Blockscout -import { HStack } from '@chakra-ui/react'; +import { Flex, HStack } from '@chakra-ui/react'; import { useRouter } from 'next/router'; import React from 'react'; @@ -10,21 +10,26 @@ import type { TabItemRegular } from 'src/toolkit/components/AdaptiveTabs/types'; import { SocketProvider } from 'src/api/socket/context'; import getSocketUrl from 'src/api/socket/get-socket-url'; -import { ACTION_BAR_HEIGHT_DESKTOP } from 'src/shell/page/action-bar/ActionBar'; +import ActionBar, { ACTION_BAR_HEIGHT_DESKTOP } from 'src/shell/page/action-bar/ActionBar'; import useAddressCountersQuery from 'src/slices/address/hooks/useAddressCountersQuery'; import AddressTxsFilter from 'src/slices/address/pages/details/txs/AddressTxsFilter'; import useAddressTxsQuery from 'src/slices/address/pages/details/txs/useAddressTxsQuery'; import TxsWithApiSorting from 'src/slices/tx/pages/index/list/TxsWithApiSorting'; +import TransactionsCrossChainContent from 'src/features/cross-chain-txs/components/txs/TransactionsCrossChainContent'; +import { INTERCHAIN_MESSAGE } from 'src/features/cross-chain-txs/stubs/messages'; import CsvExport from 'src/features/csv-export/components/CsvExport'; import multichainConfig from 'src/features/multichain/chains-config'; import ChainSelect from 'src/features/multichain/components/ChainSelect'; import ListCounterText from 'src/features/multichain/components/ListCounterText'; import { MultichainProvider } from 'src/features/multichain/context'; +import config from 'src/config'; import useIsMobile from 'src/shared/hooks/useIsMobile'; import Pagination from 'src/shared/pagination/Pagination'; +import useQueryWithPages from 'src/shared/pagination/useQueryWithPages'; +import { generateListStub } from 'src/shared/pagination/utils'; import getQueryParamString from 'src/shared/router/get-query-param-string'; import { EmptyState } from 'src/toolkit/chakra/empty-state'; @@ -62,6 +67,15 @@ const MultichainAddressTxs = ({ addressData, isLoading }: Props) => { const chainIds = React.useMemo(() => getAvailableChainIds(addressData), [ addressData ]); + const txsQueryCrossChain = useQueryWithPages({ + resourceName: 'interchainIndexer:address_messages', + pathParams: { hash }, + options: { + placeholderData: generateListStub<'interchainIndexer:address_messages'>(INTERCHAIN_MESSAGE, 50, { next_page_params: undefined }), + enabled: !isLoading && !isLocalTab, + }, + }); + const txsQueryLocal = useAddressTxsQuery({ addressHash: hash, enabled: !isLoading && isLocalTab && chainIds.length > 0, @@ -124,35 +138,57 @@ const MultichainAddressTxs = ({ addressData, isLoading }: Props) => { return ( <> - - { txsLocalFilter } - { chainSelect } - - - { countersText } + + + { txsLocalFilter } + { chainSelect } + + + { countersText } + ); } - return null; + if (isMobile) { + return null; + } + + return ; })(); const tabs: Array = [ { id: 'txs_cross_chain', title: 'Cross-chain', - component: , + component: config.features.crossChainTxs.isEnabled ? ( + <> + { isMobile && !isLocalTab && txsQueryCrossChain.pagination.isVisible && ( + + + + ) } + + + ) : , }, { id: [ 'txs_local', 'txs' ], diff --git a/src/features/multichain/pages/home/LatestTxsCrossChain.tsx b/src/features/multichain/pages/home/LatestTxsCrossChain.tsx index 7b4d41e19e..482691fed3 100644 --- a/src/features/multichain/pages/home/LatestTxsCrossChain.tsx +++ b/src/features/multichain/pages/home/LatestTxsCrossChain.tsx @@ -1,5 +1,7 @@ // SPDX-License-Identifier: LicenseRef-Blockscout +import { Separator } from '@chakra-ui/react'; +import { route } from 'nextjs-routes'; import React from 'react'; import useApiQuery from 'src/api/hooks/useApiQuery'; @@ -9,6 +11,8 @@ import { INTERCHAIN_MESSAGE } from 'src/features/cross-chain-txs/stubs/messages' import { generateListStub } from 'src/shared/pagination/utils'; +import { Link } from 'src/toolkit/chakra/link'; + const TXS_NUM = 3; const LatestTxsCrossChain = () => { @@ -19,11 +23,23 @@ const LatestTxsCrossChain = () => { }); return ( - + <> + + + + View all transactions + + ); }; diff --git a/src/features/multichain/pages/token-transfers/MultichainTokenTransfers.tsx b/src/features/multichain/pages/token-transfers/MultichainTokenTransfers.tsx index 912ee94f70..e236943033 100644 --- a/src/features/multichain/pages/token-transfers/MultichainTokenTransfers.tsx +++ b/src/features/multichain/pages/token-transfers/MultichainTokenTransfers.tsx @@ -12,10 +12,12 @@ import useTokenTransfersQuery from 'src/slices/token-transfer/hooks/useTokenTran import TokenTypeFilter from 'src/slices/token/components/TokenTypeFilter'; import { getTokenFilterValue } from 'src/slices/token/utils/list-utils'; +import TokenTransfersCrossChain from 'src/features/cross-chain-txs/pages/token-transfers/TokenTransfersCrossChain'; import multichainConfig from 'src/features/multichain/chains-config'; import ChainSelect from 'src/features/multichain/components/ChainSelect'; import { MultichainProvider } from 'src/features/multichain/context'; +import config from 'src/config'; import PopoverFilter from 'src/shared/filters/PopoverFilter'; import useIsMobile from 'src/shared/hooks/useIsMobile'; import Pagination from 'src/shared/pagination/Pagination'; @@ -67,7 +69,7 @@ const MultichainTokenTransfers = () => { { id: 'index', title: 'Cross-chain', - component: , + component: config.features.crossChainTxs.isEnabled ? : , }, { id: 'local', diff --git a/src/features/multichain/pages/txs/MultichainTxs.tsx b/src/features/multichain/pages/txs/MultichainTxs.tsx index bdf4b5746f..cd86a290a4 100644 --- a/src/features/multichain/pages/txs/MultichainTxs.tsx +++ b/src/features/multichain/pages/txs/MultichainTxs.tsx @@ -7,10 +7,12 @@ import type { TabItemRegular } from 'src/toolkit/components/AdaptiveTabs/types'; import PageTitle from 'src/shell/page/title/PageTitle'; +import TransactionsCrossChain from 'src/features/cross-chain-txs/pages/txs/TransactionsCrossChain'; import ChainSelect from 'src/features/multichain/components/ChainSelect'; import { MultichainProvider } from 'src/features/multichain/context'; import useRoutedChainSelect from 'src/features/multichain/hooks/useRoutedChainSelect'; +import config from 'src/config'; import getQueryParamString from 'src/shared/router/get-query-param-string'; import { EmptyState } from 'src/toolkit/chakra/empty-state'; @@ -35,7 +37,7 @@ const MultichainTxs = () => { { id: 'txs_cross_chain', title: 'Cross-chain', - component: , + component: config.features.crossChainTxs.isEnabled ? : , }, { id: 'txs_local', diff --git a/src/shared/values/entity/TokenValueInterchain.tsx b/src/shared/values/entity/TokenValueInterchain.tsx index 1d06052573..28ab3a76ba 100644 --- a/src/shared/values/entity/TokenValueInterchain.tsx +++ b/src/shared/values/entity/TokenValueInterchain.tsx @@ -37,7 +37,6 @@ const TokenValueInterchain = ({ token, tokenEntityProps, chain, ...rest }: Props chain={ chain } noCopy onlySymbol - flexShrink={ 0 } w="fit-content" ml={ 2 } icon={{ marginRight: 1, marginRightShield: '14px' }} diff --git a/src/slices/token/components/entity/TokenEntityExternal.tsx b/src/slices/token/components/entity/TokenEntityExternal.tsx index 7c4a1d8ba5..092a77c99a 100644 --- a/src/slices/token/components/entity/TokenEntityExternal.tsx +++ b/src/slices/token/components/entity/TokenEntityExternal.tsx @@ -8,6 +8,8 @@ import type { ExternalChain } from 'src/shared/external-chains/types'; import type { EntityProps } from 'src/slices/token/components/entity/TokenEntity'; import TokenEntity from 'src/slices/token/components/entity/TokenEntity'; +import multichainConfig from 'src/features/multichain/chains-config'; + import { stripTrailingSlash } from 'src/toolkit/utils/url'; interface Props extends EntityProps, JsxStyleProps { @@ -38,6 +40,7 @@ const TokenEntityExternal = ({ chain, ...props }: Props) => { href={ href } noLink={ props.noLink || !href } link={{ external: true }} + chain={ multichainConfig() ? chain : undefined } /> ); }; From bc4b855da6d890b05d9f143250e5b5469ed0d67b Mon Sep 17 00:00:00 2001 From: tom Date: Wed, 24 Jun 2026 20:06:09 +0200 Subject: [PATCH 03/13] add preset for chiado chain --- .github/workflows/deploy-review.yml | 1 + .vscode/tasks.json | 1 + tools/dev-server/registry.json | 1 + 3 files changed, 3 insertions(+) diff --git a/.github/workflows/deploy-review.yml b/.github/workflows/deploy-review.yml index 95f3ded615..48a995d518 100644 --- a/.github/workflows/deploy-review.yml +++ b/.github/workflows/deploy-review.yml @@ -35,6 +35,7 @@ on: - filecoin - garnet - gnosis + - gnosis_chiado - immutable - mega_eth - multichain diff --git a/.vscode/tasks.json b/.vscode/tasks.json index edd58f6059..823a4db987 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -327,6 +327,7 @@ "filecoin", "garnet", "gnosis", + "gnosis_chiado", "immutable", "mega_eth", "multichain", diff --git a/tools/dev-server/registry.json b/tools/dev-server/registry.json index 868af6c93a..49836417b7 100644 --- a/tools/dev-server/registry.json +++ b/tools/dev-server/registry.json @@ -10,6 +10,7 @@ "filecoin": "https://filecoin.blockscout.com", "garnet": "https://explorer.garnetchain.com", "gnosis": "https://gnosis.blockscout.com", + "gnosis_chiado": "https://gnosis-chiado.blockscout.com", "immutable": "https://explorer.immutable.com", "mega_eth": "https://megaeth.blockscout.com", "multichain": "https://explorer.blockscout.com", From 903e9d5d9a335b5f4f27b03074047506b2d84717 Mon Sep 17 00:00:00 2001 From: tom Date: Wed, 24 Jun 2026 20:13:52 +0200 Subject: [PATCH 04/13] bug fixes --- .../pages/bridged-tokens/BridgedTokensTableItem.tsx | 1 + .../pages/tx/TxCrossChainDetailsLifecycle.tsx | 3 ++- .../pages/tx/TxDetailsCrossChainTransfers.tsx | 5 ++++- src/shell/navigation/useNavItems.tsx | 2 +- src/slices/token-transfer/pages/tx/TxTokenTransfer.tsx | 7 ++++--- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/features/cross-chain-txs/pages/bridged-tokens/BridgedTokensTableItem.tsx b/src/features/cross-chain-txs/pages/bridged-tokens/BridgedTokensTableItem.tsx index 6a5d30f0c1..af9d38a2d0 100644 --- a/src/features/cross-chain-txs/pages/bridged-tokens/BridgedTokensTableItem.tsx +++ b/src/features/cross-chain-txs/pages/bridged-tokens/BridgedTokensTableItem.tsx @@ -35,6 +35,7 @@ const BridgedTokensTableItem = ({ data, token, index, page, isLoading }: Props) return toTokenModel({ ...token, decimals: String(token.decimals ?? '0'), + address_hash: token.token_address, }); }, [ token ]); diff --git a/src/features/cross-chain-txs/pages/tx/TxCrossChainDetailsLifecycle.tsx b/src/features/cross-chain-txs/pages/tx/TxCrossChainDetailsLifecycle.tsx index c136fe2048..feae46b1cb 100644 --- a/src/features/cross-chain-txs/pages/tx/TxCrossChainDetailsLifecycle.tsx +++ b/src/features/cross-chain-txs/pages/tx/TxCrossChainDetailsLifecycle.tsx @@ -22,7 +22,8 @@ const TxCrossChainDetailsLifecycle = ({ data, isLoading }: Props) => { const firstStepContent = (() => { if (!data.source_transaction_hash) { - return ; + const status = data.destination_transaction_hash ? 'success' : 'unfinalized'; + return ; } const isLast = isError && !data.destination_transaction_hash; diff --git a/src/features/cross-chain-txs/pages/tx/TxDetailsCrossChainTransfers.tsx b/src/features/cross-chain-txs/pages/tx/TxDetailsCrossChainTransfers.tsx index 6d3595a4db..b945920366 100644 --- a/src/features/cross-chain-txs/pages/tx/TxDetailsCrossChainTransfers.tsx +++ b/src/features/cross-chain-txs/pages/tx/TxDetailsCrossChainTransfers.tsx @@ -3,6 +3,8 @@ import { route } from 'nextjs-routes'; import React from 'react'; +import { useMultichainContext } from 'src/features/multichain/context'; + import config from 'src/config'; import * as DetailedInfo from 'src/shared/detailed-info/DetailedInfo'; @@ -18,10 +20,11 @@ interface Props { const TxDetailsCrossChainTransfers = ({ hash, isLoading: isLoadingProp }: Props) => { const { data, isPending } = useTxCrossChainTransfersQuery({ hash }); + const multichainContext = useMultichainContext(); const isLoading = isLoadingProp || isPending; - if ((!isPending && (!data || !data.items.length)) || !config.features.crossChainTxs.isEnabled) { + if ((!isPending && (!data || !data.items.length)) || !(multichainContext?.chain.app_config ?? config).features.crossChainTxs.isEnabled) { return null; } diff --git a/src/shell/navigation/useNavItems.tsx b/src/shell/navigation/useNavItems.tsx index 331cefbc5d..f0fd534386 100644 --- a/src/shell/navigation/useNavItems.tsx +++ b/src/shell/navigation/useNavItems.tsx @@ -293,7 +293,7 @@ export default function useNavItems(): ReturnType { icon: 'navigation/gas_tracker', isActive: pathname.startsWith('/gas-tracker'), }, - config.features.crossChainTxs.isEnabled && { + config.features.crossChainTxs.isEnabled && !config.features.multichain.isEnabled && { text: 'ICTT users', nextRoute: { pathname: '/ictt-users' as const }, icon: 'navigation/ictt_users', diff --git a/src/slices/token-transfer/pages/tx/TxTokenTransfer.tsx b/src/slices/token-transfer/pages/tx/TxTokenTransfer.tsx index 4f32952a53..a583ca652a 100644 --- a/src/slices/token-transfer/pages/tx/TxTokenTransfer.tsx +++ b/src/slices/token-transfer/pages/tx/TxTokenTransfer.tsx @@ -43,6 +43,7 @@ const TxTokenTransfer = ({ txQuery, tokenTransferFilter, noCrossChain }: Props) const tab = getQueryParamString(router.query.tab); const areQueriesEnabled = !txQuery.isPlaceholderData && Boolean(txQuery.data?.status && txQuery.data?.hash); + const chainConfig = multichainContext?.chain?.app_config ?? config; const [ typeFilter, setTypeFilter ] = React.useState>( getTokenFilterValue(router.query.type, multichainContext?.chain?.app_config) || [], @@ -60,17 +61,17 @@ const TxTokenTransfer = ({ txQuery, tokenTransferFilter, noCrossChain }: Props) const crossChainQuery = useTxCrossChainTransfersQuery({ hash: String(txQuery.data?.hash), - enabled: areQueriesEnabled && !noCrossChain, + enabled: areQueriesEnabled && !noCrossChain && chainConfig.features.crossChainTxs.isEnabled, }); const hasCrossChainTab = - config.features.crossChainTxs.isEnabled && + chainConfig.features.crossChainTxs.isEnabled && Boolean(!crossChainQuery.isPlaceholderData && crossChainQuery.data?.items.length) && !noCrossChain; const isLocalTab = tab === 'token_transfers' || (tab !== 'token_transfers_cross_chain' && !hasCrossChainTab); const isTabsLoading = useIsInitialLoading( localQuery.isPlaceholderData || - (config.features.crossChainTxs.isEnabled && crossChainQuery.isPlaceholderData && !noCrossChain), + (chainConfig.features.crossChainTxs.isEnabled && crossChainQuery.isPlaceholderData && !noCrossChain), ); const tabs = [ From a3128361077bfd79f75ceb5d811951f2677ee336 Mon Sep 17 00:00:00 2001 From: tom Date: Wed, 24 Jun 2026 20:23:18 +0200 Subject: [PATCH 05/13] envs-validator: enable cross chain txs in multichain schema --- deploy/tools/envs-validator/schema_multichain.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/deploy/tools/envs-validator/schema_multichain.ts b/deploy/tools/envs-validator/schema_multichain.ts index 4b31a2591b..72f2021ed6 100644 --- a/deploy/tools/envs-validator/schema_multichain.ts +++ b/deploy/tools/envs-validator/schema_multichain.ts @@ -69,6 +69,7 @@ const schema = yup .concat(uiSchemas.footerSchema) .concat(uiSchemas.miscSchema) .concat(featuresSchemas.adsSchema) + .concat(featuresSchemas.crossChainTxsSchema) .concat(featuresSchemas.defiDropdownSchema) .concat(featuresSchemas.multichainButtonSchema) .concat(featuresSchemas.userOpsSchema) From 27471142de95bd75d9fba27e71b8bc81c74375fd Mon Sep 17 00:00:00 2001 From: tom Date: Wed, 24 Jun 2026 20:36:39 +0200 Subject: [PATCH 06/13] add empty line to end of .env.extra file --- .env.extra | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.extra b/.env.extra index 27b090f6b4..16e533486b 100644 --- a/.env.extra +++ b/.env.extra @@ -9,4 +9,4 @@ # git-ignored). For purely-local, personal overrides use .env.local (git-ignored). NEXT_PUBLIC_CROSS_CHAIN_TXS_ENABLED=true -NEXT_PUBLIC_INTERCHAIN_INDEXER_API_HOST=https://interchain-indexer.k8s-dev.blockscout.com \ No newline at end of file +NEXT_PUBLIC_INTERCHAIN_INDEXER_API_HOST=https://interchain-indexer.k8s-dev.blockscout.com From 4bc1df520ff8702b3a62414a39f83e0a91b4df90 Mon Sep 17 00:00:00 2001 From: tom Date: Wed, 24 Jun 2026 20:40:53 +0200 Subject: [PATCH 07/13] fix: don't drop last env var when env file lacks trailing newline The entrypoint's `while IFS='=' read` loop skipped the final line of any env file without a trailing newline, silently dropping that variable (bit us with NEXT_PUBLIC_INTERCHAIN_INDEXER_API_HOST in .env.extra). Add the `|| [ -n "$name" ]` idiom so the last line is always processed. Co-Authored-By: Claude Opus 4.8 (1M context) --- deploy/scripts/entrypoint.sh | 4 +++- tools/dev-server/CONTEXT.md | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/deploy/scripts/entrypoint.sh b/deploy/scripts/entrypoint.sh index 17e270e8b9..5bb8947601 100755 --- a/deploy/scripts/entrypoint.sh +++ b/deploy/scripts/entrypoint.sh @@ -5,7 +5,9 @@ export_envs_from_file() { local file="$1" [ -f "$file" ] || return 0 - while IFS='=' read -r name value; do + # `|| [ -n "$name" ]` keeps the final line even when the file has no trailing + # newline — otherwise `read` returns non-zero at EOF and silently drops it. + while IFS='=' read -r name value || [ -n "$name" ]; do if [[ -n "$name" && "$name" != \#* ]]; then export "$name"="$value" fi diff --git a/tools/dev-server/CONTEXT.md b/tools/dev-server/CONTEXT.md index 2762c83124..887d6f309a 100644 --- a/tools/dev-server/CONTEXT.md +++ b/tools/dev-server/CONTEXT.md @@ -52,7 +52,8 @@ lives here): (e.g. `HOMEPAGE_HERO_BANNER_CONFIG`, `MARKETPLACE_ESSENTIAL_DAPPS_CONFIG`). So `fetch.ts` emits raw values, exactly like the old committed presets. Because raw values are **not `source`-safe**, the container entrypoint reads `.env.tmp` via a `while IFS='=' read` loop, - never `source`. + never `source`. That loop uses `read … || [ -n "$name" ]` so a file with no trailing + newline doesn't silently drop its last variable (this bit us with `.env.extra`). - **dotenv-cli precedence: the FIRST `-e` file wins** (not the last). The run scripts therefore list env files **highest-priority-first**. - **`--omit-local-envs` is the dev/container switch.** Dev mode applies `localEnvs` (so APP_HOST From e245abbf4ed3314839df57fa6766d542e3e8271b Mon Sep 17 00:00:00 2001 From: tom Date: Thu, 25 Jun 2026 12:40:07 +0200 Subject: [PATCH 08/13] make demo docker image agnostic to review variant --- .agents/skills/deploy-demo/SKILL.md | 2 +- .github/workflows/deploy-review.yml | 5 ++++- deploy/values/review-2/values.yaml.gotmpl | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.agents/skills/deploy-demo/SKILL.md b/.agents/skills/deploy-demo/SKILL.md index 71e87942fc..a272401577 100644 --- a/.agents/skills/deploy-demo/SKILL.md +++ b/.agents/skills/deploy-demo/SKILL.md @@ -47,7 +47,7 @@ _Note:_ In the command output, format all URLs as clickable Markdown links: `[Li **c. `build_image`** — whether to build & publish a fresh image (default `true`). - The image is preset-agnostic, so **re-pointing an existing demo to a different chain does not need a rebuild**. If the user asks to *redeploy / re-point / switch an existing demo to another preset* ("redeploy it for celo", "switch the demo to base without rebuilding", "re-point to gnosis"), pass `-f build_image=false` — this skips the multi-minute image build and just re-runs the deploy (~1–2 min), changing `ENVS_PRESET` so the pods roll. - For a first/normal deploy, skip the flag (default `true`, builds fresh). -- **Caveat:** `build_image=false` only works if an image for this branch + `variant` already exists (a prior successful build). If unsure, prefer building. Keep `variant` the same as the original deploy when re-pointing — the image tag and namespace are `-`. +- **Caveat:** `build_image=false` only works if an image for this branch already exists (a prior successful build). If unsure, prefer building. The image tag is `review-` — **variant-independent** (the image is both preset- and variant-agnostic). So an image built under either variant can be reused by the other: e.g. after a `review` build you can deploy `review-2` with `build_image=false`. Only the namespace/hostname (`-`) differ per variant, so the two demos coexist. ### 4. Trigger the workflow and capture the run ID diff --git a/.github/workflows/deploy-review.yml b/.github/workflows/deploy-review.yml index 48a995d518..d285eee609 100644 --- a/.github/workflows/deploy-review.yml +++ b/.github/workflows/deploy-review.yml @@ -86,8 +86,11 @@ jobs: if: ${{ inputs.build_image }} uses: './.github/workflows/publish-image.yml' with: + # Variant-independent tag: the image is preset- AND variant-agnostic, + # so one image serves both the `review` and `review-2` demos. This lets a + # deploy for one variant reuse (build_image=false) an image built under the other. tags: | - type=raw,value=${{ inputs.variant }}-${{ needs.make_slug.outputs.REF_SLUG }} + type=raw,value=review-${{ needs.make_slug.outputs.REF_SLUG }} platforms: linux/amd64 secrets: inherit diff --git a/deploy/values/review-2/values.yaml.gotmpl b/deploy/values/review-2/values.yaml.gotmpl index 12c1aa1297..4da42b81c5 100644 --- a/deploy/values/review-2/values.yaml.gotmpl +++ b/deploy/values/review-2/values.yaml.gotmpl @@ -23,7 +23,7 @@ frontend: replicaCount: 1 image: repository: ghcr.io/blockscout/frontend-private - tag: review-2-{{ requiredEnv "GITHUB_REF_NAME_SLUG" }} + tag: review-{{ requiredEnv "GITHUB_REF_NAME_SLUG" }} pullPolicy: Always ingress: enabled: true From d95a8540241fe6ffb75fbaaf2d52785c5c106259 Mon Sep 17 00:00:00 2001 From: tom Date: Thu, 25 Jun 2026 15:32:09 +0200 Subject: [PATCH 09/13] add cross-chain stats --- .../pages/details/ChainStatsDetails.tsx | 15 +++++++++++++-- .../components/ChainStatsDetailsCrossChainTxs.tsx | 13 ++++++++----- .../components/ChartWidgetContainerCrossChain.tsx | 4 +++- .../hooks/useCrossChainChartQuery.ts | 7 +++++-- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/features/chain-stats/pages/details/ChainStatsDetails.tsx b/src/features/chain-stats/pages/details/ChainStatsDetails.tsx index cd765fef78..fe98982540 100644 --- a/src/features/chain-stats/pages/details/ChainStatsDetails.tsx +++ b/src/features/chain-stats/pages/details/ChainStatsDetails.tsx @@ -13,6 +13,7 @@ import useChartQuery from 'src/features/chain-stats/hooks/useChartQuery'; import ChainStatsDetailsCrossChainTxs from 'src/features/cross-chain-txs/components/ChainStatsDetailsCrossChainTxs'; import useCrossChainChartQuery from 'src/features/cross-chain-txs/hooks/useCrossChainChartQuery'; import { CROSS_CHAIN_TXS_CHARTS } from 'src/features/cross-chain-txs/utils/chain-stats'; +import multichainConfig from 'src/features/multichain/chains-config'; import config from 'src/config'; import isCustomAppError from 'src/shared/errors/is-custom-app-error'; @@ -33,6 +34,7 @@ const ChainStatsDetails = () => { const { updateQuery } = useQueryParams(); const id = getQueryParamString(router.query.id); + const chainId = getQueryParamString(router.query.chain_id); const intervalFromQuery = getIntervalFromQuery(router); const resolutionFromQuery = getResolutionFromQuery(router); const counterPartyChainIdsFromQuery = Array.isArray(router.query.counterparty_chain_ids) ? @@ -47,10 +49,18 @@ const ChainStatsDetails = () => { counterPartyChainIdsFromQuery.length > 0 ? counterPartyChainIdsFromQuery : [ ALL_OPTION.value ], ); - const crossChainTxsChart = config.features.crossChainTxs.isEnabled ? CROSS_CHAIN_TXS_CHARTS.find((chart) => chart.id === id) : undefined; + const chainData = React.useMemo(() => { + if (chainId) { + return multichainConfig()?.chains.find(({ id }) => id === chainId); + } + }, [ chainId ]); + + const crossChainTxsChart = (chainData?.app_config ?? config).features.crossChainTxs.isEnabled ? + CROSS_CHAIN_TXS_CHARTS.find((chart) => chart.id === id) : + undefined; const queryBase = useChartQuery({ id, resolution, interval, enabled: !crossChainTxsChart }); - const queryCrossChain = useCrossChainChartQuery({ id, interval, counterPartyChainIds, enabled: Boolean(crossChainTxsChart) }); + const queryCrossChain = useCrossChainChartQuery({ id, interval, counterPartyChainIds, enabled: Boolean(crossChainTxsChart), chainData }); const query = crossChainTxsChart ? queryCrossChain : queryBase; const isInitialLoading = useIsInitialLoading(query.isPlaceholderData); @@ -108,6 +118,7 @@ const ChainStatsDetails = () => { { return chainsQuery.data?.items - .filter((chain) => chain.id !== config.chain.id) + .filter((chain) => chain.id !== (baseChain?.app_config ?? config).chain.id) .map((chain) => ({ id: chain.id, name: chain.name, logo: chain.logo, explorer_url: chain.explorer_url, })) || []; - }, [ chainsQuery.data ]); + }, [ baseChain?.app_config, chainsQuery.data?.items ]); const chainSelect = ( { - const chainNameElement = { config.chain.name }; + const chainNameElement = { (baseChain?.app_config ?? config).chain.name }; if (chart.id === 'outgoing-messages-paths') { return ( @@ -130,11 +133,11 @@ const ChainStatsDetailsCrossChainTxs = ({ Source - { isOutgoing ? config.chain.name : counterPartyChainNames } + { isOutgoing ? (baseChain?.app_config ?? config).chain.name : counterPartyChainNames } Destination - { isOutgoing ? counterPartyChainNames : config.chain.name } + { isOutgoing ? counterPartyChainNames : (baseChain?.app_config ?? config).chain.name } Txns { isOutgoing ? 'sent' : 'received' } diff --git a/src/features/cross-chain-txs/components/ChartWidgetContainerCrossChain.tsx b/src/features/cross-chain-txs/components/ChartWidgetContainerCrossChain.tsx index 1e77e6cacc..11f97dd73f 100644 --- a/src/features/cross-chain-txs/components/ChartWidgetContainerCrossChain.tsx +++ b/src/features/cross-chain-txs/components/ChartWidgetContainerCrossChain.tsx @@ -6,6 +6,7 @@ import React from 'react'; import type { Props as ChartWidgetContainerProps } from 'src/features/chain-stats/components/ChartWidgetContainer'; import { getChartUrl } from 'src/features/chain-stats/utils/chart'; +import { useMultichainContext } from 'src/features/multichain/context'; import { SankeyChartWidget } from 'src/toolkit/components/charts/sankey/SankeyChartWidget'; @@ -18,7 +19,8 @@ interface Props extends Omit { const ChartWidgetContainerCrossChain = ({ id, interval, isLoading, onLoadingError, className, href, title, description }: Props) => { - const query = useCrossChainChartQuery({ id, interval, enabled: !isLoading }); + const chainData = useMultichainContext()?.chain; + const query = useCrossChainChartQuery({ id, interval, enabled: !isLoading, chainData }); React.useEffect(() => { if (query.isError) { diff --git a/src/features/cross-chain-txs/hooks/useCrossChainChartQuery.ts b/src/features/cross-chain-txs/hooks/useCrossChainChartQuery.ts index 0c17ad826a..05d5a124e1 100644 --- a/src/features/cross-chain-txs/hooks/useCrossChainChartQuery.ts +++ b/src/features/cross-chain-txs/hooks/useCrossChainChartQuery.ts @@ -3,6 +3,7 @@ import { pickBy, uniqBy } from 'es-toolkit'; import type { ChartDataPayloadSankey, StatsIntervalIds } from 'src/features/chain-stats/types/client'; +import type { ClusterChainConfig } from 'src/features/multichain/types/client'; import useApiQuery from 'src/api/hooks/useApiQuery'; @@ -19,9 +20,10 @@ interface Props { interval: StatsIntervalIds; enabled?: boolean; counterPartyChainIds?: Array; + chainData?: ClusterChainConfig; } -export default function useCrossChainChartQuery({ id, interval, enabled = true, counterPartyChainIds }: Props) { +export default function useCrossChainChartQuery({ id, interval, enabled = true, counterPartyChainIds, chainData }: Props) { const chart = CROSS_CHAIN_TXS_CHARTS.find((chart) => chart.id === id) ?? CROSS_CHAIN_TXS_CHARTS[0]; const { start: startDate, end: endDate } = getDatesFromInterval(interval); @@ -29,7 +31,8 @@ export default function useCrossChainChartQuery({ id, interval, enabled = true, const resourceName = chart.resourceName; return useApiQuery(resourceName, { - pathParams: { chainId: config.chain.id }, + pathParams: { chainId: (chainData?.app_config ?? config).chain.id }, + chain: chainData, queryParams: pickBy({ from: startDate, to: endDate, From d14c6e3aa9fffef52efbe8a033e58e6d756dfe8d Mon Sep 17 00:00:00 2001 From: tom Date: Thu, 25 Jun 2026 16:04:21 +0200 Subject: [PATCH 10/13] allow to change base chain on stats details page --- .../pages/details/ChainStatsDetails.tsx | 16 ++++- .../ChainStatsDetailsCrossChainTxs.tsx | 69 ++++++++++++++----- 2 files changed, 67 insertions(+), 18 deletions(-) diff --git a/src/features/chain-stats/pages/details/ChainStatsDetails.tsx b/src/features/chain-stats/pages/details/ChainStatsDetails.tsx index fe98982540..5e9c4868f1 100644 --- a/src/features/chain-stats/pages/details/ChainStatsDetails.tsx +++ b/src/features/chain-stats/pages/details/ChainStatsDetails.tsx @@ -14,6 +14,7 @@ import ChainStatsDetailsCrossChainTxs from 'src/features/cross-chain-txs/compone import useCrossChainChartQuery from 'src/features/cross-chain-txs/hooks/useCrossChainChartQuery'; import { CROSS_CHAIN_TXS_CHARTS } from 'src/features/cross-chain-txs/utils/chain-stats'; import multichainConfig from 'src/features/multichain/chains-config'; +import useRoutedChainSelect from 'src/features/multichain/hooks/useRoutedChainSelect'; import config from 'src/config'; import isCustomAppError from 'src/shared/errors/is-custom-app-error'; @@ -34,7 +35,6 @@ const ChainStatsDetails = () => { const { updateQuery } = useQueryParams(); const id = getQueryParamString(router.query.id); - const chainId = getQueryParamString(router.query.chain_id); const intervalFromQuery = getIntervalFromQuery(router); const resolutionFromQuery = getResolutionFromQuery(router); const counterPartyChainIdsFromQuery = Array.isArray(router.query.counterparty_chain_ids) ? @@ -49,11 +49,22 @@ const ChainStatsDetails = () => { counterPartyChainIdsFromQuery.length > 0 ? counterPartyChainIdsFromQuery : [ ALL_OPTION.value ], ); + const chainIdsWithCrossChain = React.useMemo(() => { + return multichainConfig()?.chains + .filter((chain) => chain.app_config.features.crossChainTxs.isEnabled) + .map((chain) => chain.id); + }, []); + + const chainSelectCrossChain = useRoutedChainSelect({ + chainIds: chainIdsWithCrossChain, + }); + const chainData = React.useMemo(() => { + const chainId = chainSelectCrossChain.value?.[0]; if (chainId) { return multichainConfig()?.chains.find(({ id }) => id === chainId); } - }, [ chainId ]); + }, [ chainSelectCrossChain.value ]); const crossChainTxsChart = (chainData?.app_config ?? config).features.crossChainTxs.isEnabled ? CROSS_CHAIN_TXS_CHARTS.find((chart) => chart.id === id) : @@ -119,6 +130,7 @@ const ChainStatsDetails = () => { chart={ crossChainTxsChart } data={ query.data?.data } baseChain={ chainData } + baseChainSelectProps={ chainSelectCrossChain } isLoading={ query.isPlaceholderData } isError={ query.isError } isInitialLoading={ isInitialLoading } diff --git a/src/features/cross-chain-txs/components/ChainStatsDetailsCrossChainTxs.tsx b/src/features/cross-chain-txs/components/ChainStatsDetailsCrossChainTxs.tsx index 34cf7ba800..60fea4678b 100644 --- a/src/features/cross-chain-txs/components/ChainStatsDetailsCrossChainTxs.tsx +++ b/src/features/cross-chain-txs/components/ChainStatsDetailsCrossChainTxs.tsx @@ -10,6 +10,8 @@ import type { SankeyChartData } from 'src/toolkit/components/charts/sankey/types import useApiQuery from 'src/api/hooks/useApiQuery'; import ChartIntervalSelect from 'src/features/chain-stats/components/ChartIntervalSelect'; +import ChainSelectMultichain from 'src/features/multichain/components/ChainSelect'; +import type useRoutedChainSelect from 'src/features/multichain/hooks/useRoutedChainSelect'; import config from 'src/config'; import * as mixpanel from 'src/services/mixpanel'; @@ -24,6 +26,7 @@ interface Props { chart: ChainStatsChart; data?: SankeyChartData; baseChain?: ClusterChainConfig; + baseChainSelectProps?: ReturnType; isLoading: boolean; isError: boolean; isInitialLoading: boolean; @@ -37,6 +40,7 @@ const ChainStatsDetailsCrossChainTxs = ({ chart, data, baseChain, + baseChainSelectProps, isLoading, isError, isInitialLoading, @@ -64,33 +68,66 @@ const ChainStatsDetailsCrossChainTxs = ({ })) || []; }, [ baseChain?.app_config, chainsQuery.data?.items ]); - const chainSelect = ( - - ); - const chainFilter = (() => { - const chainNameElement = { (baseChain?.app_config ?? config).chain.name }; + const counterPartyChainSelect = ( + + ); + + const baseChainSelect = baseChainSelectProps ? ( + + ) : null; + + const chainName = { (baseChain?.app_config ?? config).chain.name }; + if (chart.id === 'outgoing-messages-paths') { + if (baseChainSelect) { + return ( + + { baseChainSelect } + to + { counterPartyChainSelect } + + ); + } + return ( - From { chainNameElement } to - { chainSelect } + + From { chainName } to + + { counterPartyChainSelect } ); } if (chart.id === 'incoming-messages-paths') { + if (baseChainSelect) { + return ( + + { counterPartyChainSelect } + to + { baseChainSelect } + + ); + } + return ( - { chainSelect } - to { chainNameElement } + { counterPartyChainSelect } + + to { chainName } + ); } From 27b8955c79bac3b5663088b7aaa00bd3d80b647a Mon Sep 17 00:00:00 2001 From: tom Date: Thu, 25 Jun 2026 19:49:42 +0200 Subject: [PATCH 11/13] fix tests --- src/shared/values/entity/SimpleValue.tsx | 2 +- .../values/entity/TokenValueInterchain.tsx | 1 + .../components/entity/TxEntityInterchain.tsx | 2 +- .../pages/design-system/tabs/Values.pw.tsx | 4 +++- .../pages/design-system/tabs/Values.tsx | 21 ++++++++++++++++++ .../Values.pw.tsx_default_default-1.png | Bin 97757 -> 97841 bytes 6 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/shared/values/entity/SimpleValue.tsx b/src/shared/values/entity/SimpleValue.tsx index 5649a51a50..2b2f0a96d8 100644 --- a/src/shared/values/entity/SimpleValue.tsx +++ b/src/shared/values/entity/SimpleValue.tsx @@ -56,7 +56,7 @@ const SimpleValue = ({ }, [ postfix, prefix, value, tooltipContentBefore ]); return ( - + { startElement } ); diff --git a/src/slices/tx/components/entity/TxEntityInterchain.tsx b/src/slices/tx/components/entity/TxEntityInterchain.tsx index 97aa353b85..c8f3c272e4 100644 --- a/src/slices/tx/components/entity/TxEntityInterchain.tsx +++ b/src/slices/tx/components/entity/TxEntityInterchain.tsx @@ -23,7 +23,7 @@ const TxEntityInterchain = ({ chain, ...props }: Props) => { const multichainChainInfo = multichainConfig()?.chains.find(({ id }) => id === chain?.id); if (isCurrentChain || multichainChainInfo) { - return ; + return ; } return ; diff --git a/src/toolkit/pages/design-system/tabs/Values.pw.tsx b/src/toolkit/pages/design-system/tabs/Values.pw.tsx index ba38f24441..e71a6cdbee 100644 --- a/src/toolkit/pages/design-system/tabs/Values.pw.tsx +++ b/src/toolkit/pages/design-system/tabs/Values.pw.tsx @@ -4,9 +4,11 @@ import { TabsRoot } from 'src/toolkit/chakra/tabs'; import { test, expect } from 'playwright/lib'; +import { TOKEN } from './Link'; import Values from './Values'; -test('default', async({ render }) => { +test('default', async({ render, mockAssetResponse }) => { + await mockAssetResponse(TOKEN.icon_url!, './playwright/mocks/duck.png'); const component = await render(); await expect(component).toHaveScreenshot(); }); diff --git a/src/toolkit/pages/design-system/tabs/Values.tsx b/src/toolkit/pages/design-system/tabs/Values.tsx index f1fd435e04..0790c263e3 100644 --- a/src/toolkit/pages/design-system/tabs/Values.tsx +++ b/src/toolkit/pages/design-system/tabs/Values.tsx @@ -3,15 +3,20 @@ import BigNumber from 'bignumber.js'; import React from 'react'; +// import * as interchainTransferMock from 'src/features/cross-chain-txs/mocks/transfers'; + import AssetValue from 'src/shared/values/entity/AssetValue'; import GasPriceValue from 'src/shared/values/entity/GasPriceValue'; import NativeCoinValue from 'src/shared/values/entity/NativeCoinValue'; import SimpleValue from 'src/shared/values/entity/SimpleValue'; import TokenValue from 'src/shared/values/entity/TokenValue'; +// import TokenValueInterchain from 'src/shared/values/entity/TokenValueInterchain'; import { Section, Container, SectionHeader, SamplesStack, Sample, SectionSubHeader } from '../parts'; import { TOKEN } from './Link'; +export const EXTERNAL_CHAIN_LOGO_URL = 'https://blockscout-icons.s3.us-east-1.amazonaws.com/ethereum.svg'; + const ValuesShowcase = () => { return ( @@ -170,6 +175,22 @@ const ValuesShowcase = () => { + { /* + + */ } diff --git a/src/toolkit/pages/design-system/tabs/__screenshots__/Values.pw.tsx_default_default-1.png b/src/toolkit/pages/design-system/tabs/__screenshots__/Values.pw.tsx_default_default-1.png index d43fcfc0671938d02a06811bb40cbd392f8eff5d..c04ecb52073fa966ada9a2b001eee61953edb981 100644 GIT binary patch delta 55300 zcmc$`cU)6jw>HY&il{UNDT06vkPgzjfS~j$k&g5hdT&cbK&eV6l+cS1LJPe}m)=7M z>Ai+f1Kh;@?)Q{?&Ue3izW4s_Uo%;2{bm_!t~ti@%xBD*bNmtvesNkHFnXGL)i~6A zi&gwHU*b2W48GWs@F$Et2(ZQVfM$(yU3>yLeKyBnpcd)w9#R~y>n^*oOW9?3*^AKC z*7we}qCn6k@ci)9>>?@=%5nQT!X}s>af>7>?dvssf97=tU0sEA{10`hr2dUb$-BqC zjjLI10=xcwr>UP`KD>^H2jIQGDU18@|3gV}`x7&unrdfbBjUCZgV%h9-lU?Vqobf; z#C8WyzqUv-^Vj}j2mV0k`#-Mz{Di&sgTD|;a}$4n!e0>AV_Q8wP{@M*$qerKBJf2k zr$%?Tqvkn*&kYoI;|VGCIc^&$w<4}YS_vSv za1?E@Ge1$vU7Od=#TlI1vpn_2u-tJrbAv~+Vh`M(XaFRMqXOw921T2^(V1-P^REc7 z&HbWrl-Ir=8=cEOq*wx3@i^-Uo%0h*ZlG)^?0G8zxT4$v*hzymnI+7}BQ6&+kue*T z-~D*J7~yNly;v<6zbPuP*0C%B#M5L_;JWYlsE_1Rg8?llepl?7$-+W3KQY>gFjaMW ze_GDke?EF2W+3Lkr9UXN+=ibi+k!+CRPsHO4v|l-F?LsYmg8BmB3_$gc=s`<>1mga zJY>fbMB@Sb*$3bMT(uOYLzu(VWwUYW*xTG&!khD2Ptg!=eXmp4HV%jw4r)=$tsV*R z+eULB=w+X@MI`Kcqnzmz@HCyC6L8t@Bfi6_!#q_5M6a$H} z8)t(-fzk9^wx{4i3AydLikYi->V41qKP@cepV{}x!+clbJ2>B7R-Jvow*_(8`EO6D zA1)M)oAojyh#TI=2my>9moMvA^j+MXN>e%dE#mX^KE35}IJo^NYiSyRzgXT>Gm4_J z*IX>jK?mFp_ll^l!4L(c(%FUz2z*YUt~b

0#-9%Zm<9Nf|eKYcnb;Fb>HOKBuEo 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

(y7L?Bk8J|$d?25aWXQ*oxRx9jGq^> zL9)}EQKH`UPp=qsY8zV=iseNY-{O0fs2U^;WTkc%(QVcaW_cGRF**q4LLzAzswC9X ztN?*^>qm+&!7p64{TV9OK7C6aq?Y*U%$4Idv@+LEW*IG5jS(?j%k`Zy1=V(8F!Cq+=*a-^%8BVH1~}BupUg@v?qkXm~v)5_>m#MO5mC|4E}y zTqR1y%DQWbo%BwFfgIU8wYegpHeP~XakG+imE4DPDXYna|5vya_?s?G9z1-SA8_C( z?RD*CWuTxHCt>wuF^45OA!E0w()|G#=Cb(kCF1sDbR&nttK?2W$p#PQ_Np|$_14MQ zY)Ab(HneZ~X$NhTgeslvjC+23uI}VJ53^05HpC@^;CZ6T7 zVTTa#aD1|1{3OcBifX<_tzP3M>!z=pf;Ns^yV+LZ)dvO{*7H49tH6N3{qEx@{|NTy zGfTt|BTe>jPiqN<6ykf21u^0bIdp*Ke9|8!iy$%|Q-XL_L*s~ebPMK&m>&x*)N2RL zxDEEr#Nnpl<&7{-HPae#_uMzJ5edIuw^Dspx{B97v_<_cC$837T&EIoNYj_7XdeP~*Oa!T6ya0u zVE#nP0*NpRp%jf~Zk?-wsJ9AG%`8*(Sw@w*_3v*`f61@#b>UtvPk;gP zWvu8*{aKR{frFue>N4pN*u7$OpdpF42<2-fdn;PhXYuIfR^D$LfVaf6qQ+#TMxjX^ z-DN0Tfk&a7TAIB`V8g`R4=#(X$qU)f^#i0!Y$Mt<9S(#y=yRCf1QpBrE{5*MA7OxA zl=(d@H6}T5m#ob{zc)ViMKbwh*mkmrA$fBywu)SBvpcP8{KN*AQLdsUcJ_jc4r<@9 ziYoVD*I}ZLnGcVru%y!GKFpFqZiZEvVAcm%KA)gZ(Fd&^*&G|DLgoP0^+cd~g5k%s$lHpd%*~z86G1h`*ZR2Bo`@;SQ5WhR zyK2KLPPWXw$*C_t!7daeLmdK=|KMvW0PFf=}$DVdgbE8Qu^>BDD zxaA%qqJOSmN(OpIx6PBS4I){Nu`Ibu@PsL)?|!FMM#}`{geJEbpB1fURoK9My5->d zW%uaC!%`%Cd=U|X!+=P`8m?^b*Qh=i_dI%uAkGO9sC@tEaWGm-6o~D+nN$Y2Jhwhj zmLA!AK(R{IpCN6q0NeR;bnM^@r^cMDf;zHU?3G}-<2-)*30)gi>b`Q0Fe?GyU;Ja3 z$z5G?Pa|z%2A5j%sFVNRvd7?Lv}9XFps*T^+yzdG^;=SG&NnLnJ%8Hz7=XUX?9k_O zg+gd=?4y4WTJzmSZ!hfEB=Bw0Z)?Rz_Vi*)M}n}L*9z&iAjX{{-uL1MQ1ad1(F8H-p0WeQhht*NiA5v#?)M{1`cjyI1<`}4I&VO>V z{N{z@=Kn*&VsWZ&pTRAY{)8XLet)W4e}us3`T%c8ON;U!)dlzc_Lc`IntRJ{&Qbb% z-IgX4Vf*1uLiandjgfu=pJE(smU<{re^A|SdUn4uEPluEx}LH1y8*~@xo-ckd0JMf zx`wAF0b$p(m7e{`9z78qI$6Y+$7g~Nw&~n?pnx5yeSIIiwpT~Z@$ymfVRR#eu$}hH zg_hi6RzI3mCDe5)P;8$g%axVxg+*R4d2Xo5s1bPSu>SH7trH$sKvh!w3WS%&X4h_V zsdj{@%%OEZmRG7>2Bd%*Wpu}HSD6$KZ8)!}4i(?gp<2$5BunH!b{?h{S^o!SxSmk_ z5TY~OtQ1TwqjY88e|VVrN=<}8!smVGPQL0~>&aKa$gN^EN43gq_0&iUVXWlloxi+d zN;)r}O(m$Al!KeG9Z-mlg$1l{7C4 zirGFw?g}O}s{4h+79RnyH9VgqiVYzo3~?rpn&v1x%S?9as$kX!$?6jZf#^F7&o(>8 zC4xwvy`k@l(u{ppIm9egIZE;TzDNMkAD3ttBW(6|?OP6G^5Ey}tEKzf9B`9T$@qIK z3EUh>FYHGR$lnE%M86~p$~p`wau~;v94XsL+?M8{??YL3Kz1P>t*&Rz&J$HilJO8K zUH_XaC@iwRAHJWD0JfyU|Aqr|OHs#8(w=9G`&UK};|}cKyl};>*uY3*ZMc|WUYgt; z@rt~>gPFUE9QLqkt6Dusnov2IcYFG(uySlCMGBa#2z?L1*dQLt%#0x{Tvfa6%PYf~ zmpA6qC8k3ssLCpo0kYL038)Xx9KXv42|;tW`}&TEmoK*ws*s4Lwc#*Pbg{n_UFMR2 zX(d%tlSpXKbPnP_SA<=qfl-_vAm*3RbjKQ2>ZT2^`b>0k%02r>I9rj=+NY5&Ge;OOyu9<3+z+5o5@gwH z62s@0cRRQ*3+Uia(d}a~X3wUZ=C^z(JKw9s!fTt-?U-xe)U2KGxpKGhjk+dU=Ar>4 zoHEpL`u*3N)M4oS09NXuJu%*f5Yh9)*k0+ac81PMz@K!SK`HE4mAcXes*xm*nR$v@ zR6v1pq9{-@W>_=SE z;*?fsubN19$H=VH-dadovlx;!;b!5=3Ar2j>ZQ->1)+NS2`wLujXo~jY3E%TU3QO= zs+(JaDRZ1*4EiTGp>maadyClR772PuAljmcs|;yT#Ao)n(oSc&Ec4>@ueYJ8^aa&z zx-sGbGJr9n-b)}!hPO>W#<1e+T}RXYy0FGDbUkI~Rc1z{D=cHdWE39=6iyb78AJAo@khZ&%4Tq+~!mg$W`eK?P zkp6L@U!uORtrsg{4bFsDhp%oRlb~CpYHj`2mg&&6A}y7nIg+ycw>hZI8x1-es?f?S ztNW?J?)6Ky2pWanCV=Z^)0SYs2@hl$w!69|2R3Su7jQ0L?t??V#S@pJtF&EN^)cB) z17FdKixs`hRFXyh`qH> ziA>=)LUnF1-Crmu*-k9GA~Sq_f*G)n=qhK?Db>RcLHv4bbMJd;k~bU6N%PsPHbl9F z>EKG=_l}ao{Wnk2v5%CrGYJ3K?%oKwXV{m1>Q8r)(`F1O(=1ea{^Yv`boC?t=DXU` z!uG=(8@crj6j=m`bNxGHvR@h-_~N{^L#f!bpfW)Q5C{eT{5eUIr$N#>58k0p#tT%3 z!DmHRy5(#)#GWhA72K#4X$cfI>>2>CIiM?y%{y7gJ(AM+Mb&r(D{m@ie16Es(EMTJ z{3z81SuIg_b1})Wes}6eOm&+j9rJL1$7kd3ucfYSUWv}|142xWFOt5G!4AiY@bAgs zNME2NwMC@~ZiTc}LZE%;#@~LAEw6hK^x2_&ih$77)@H7lyEHRIYsI$Gc!6T2M0wfp zIrggNKRK(Ua&g~ITlR#nJ^BGsRjJ-yiaV(!M!7j#qB&SKkdlayU2V-(l?U&AhZ&HG zrJS#ZIt*m(@hq-{Z>F-=CJj6pyLL2U42z3vR!H}6boa6`NC4W$NUrV0L zoC>Io{7q54-j@6VF-&=)#Nq{wv*Zawj%%}sIq3f7SlXNdn^crP&fhL*8QXB z(5^INHI9jkiHy`aa4S9kr(0>Z2hS~&a8u7qz;92fdZn_5xp|X~nBS9x;#)DdJOT1g`w( z=`2M%SpKaoTn-uVcO#)8O!s$2;&Y~3er%P14W(Ei0?jXDmwim~9?HXd!rARIA5mlS zAKvQ@nsL&?V&!i5b+07tJEC`lA#?hUsI$u^h!Bh;M`~9oy=&)K(`))gjpAtPC!i4 zFI*|DXfQe#WENo(%#kW>xgN?om)W4nX8icposPpXMJ8`!{3a+qvPD3)1iy*n?Z zywdn?6~xOb^Y|c7^vI1iz~$GEsF>Kn+U?S?X~q&JU=DF$o3&W2pk_$?WthoeHfcAl zz!-W^@LLMpn>$;qWXFQvw8ITRKvgT4-nQJ501YfokK>ZZJ}#&84Wwn>b%rjxsl`z27o(N58Jt z+~3`TtS@kt?R?hfG0qgbNB`Ep2l&&#XVa4|>R;KMg598ozt9}+ihM&KHmOX}CffG_ zy~~DZEK0n+*P-id|E2eFLdW?1FIQ8;*4c?n>3DW4E?kHAB*7DnnV2JZ{~<>;NA(#z zBvPcH>S2Z=21$DCbfs@@p60ur>IDbP{;%HNJDlx5Y#Z*@txK(VxV=eo}8yv|GN+@;cMM(Ba0)>|FpJZ%ga2ZwFTu!xkg?i9hY5S9ZbGd$Pb0GhM5 zF@kNvFF71Ldtni;4axqtFrUk&vbVl2`}Ns>v2NV3cylJri`b97#EHU*4}>zXrEeVc zkc?~=0hYPElX21JbcpXnB^1rib$4~L4gd(XAKv{s!!5l&Ga1GrY?89Ow`q83b**r9 zum5QjMks7{_ug8@iM-jb^!QTh(4?Rf4@CCZRyhdW2QpqTx(Mwy%-m;VvC?h+_$R~< z3MaIqAW4g-ho0ZJFt#03A=A?0(G*Unf|{D2LLf4~!wLqIQL26uSZ5V3zaJd8&_&rS zg?jWnZ-A@!&hFW8@;m&OkgNDR{Z&QVkm-pD`c2H^?~yxhXt1Q>IHrHcfOWv zes8zW^f(QGpAteKZPS<)uf*(~bk6zhNnC7XBc7DUa`ImO6T_Ypdx(?SxQ==a6yz5n zpdZ=#cWlrNC0ki4y;Aq;kLNLQAW_B?f|&Ty89tmmQG>37Pu9QdW>==@u{gMHXB46? z_ejFQs`Mg|(4Z&}c*hN48nzidn+aSEZTHPAI!hIp;WB-6ozrvch2R6)lj(c)UqWw(@12IdI6EW#!0X=E*Kg!o>z0nWN zi4@zAEtw|?$-BsbdPB2aG`e0u#$)m;cY;2vAJP_GQ+wv}_+Zz{vHM^95gQEYJuI-d zGofM(EGcmwv?JHDj!0O=SAI?dnCuTwD%;1@NkKYyG zLFPtUNX9Gt=1#}RQyai$YxVn&w-i0P{q}D21gkKz%~Pnq%l0kFRVrlhf}{_y)vMGttv+?*%yEd5m1v!DKx| zXLe$DJNGMJ_|D_e;4ZdC!*!;LDs?Og@bG?n_+;v4+twI` zygj|C%JAAjPS8LP7>2W>8iDKu>xo{+R^M+d0VWeNo> zGwOYBv^xC;F2H~9wRNnm$@^6^By=meX*idUC9to4ubxJQ%UgtAA{7P0c2wWXr7Uzg zvu*O8WAQh@n;~%Oa@A>eNm(A50pF;=#Cts3?)xcY3f?z`XC95xToQxh`*Z;$&$_>D%-)~TMGlqP0g~9Z3fA~0rMsvY>Pa9~p$C2rV znWw`Ju}UoLlE6H%XE3lO$+ALK9)h>tL#7AFz`zTNWi)WTwd`4@-O~;XVvbA(&?!SeCQDk3-t1vYN^+avMlmu>E*4p@<@{zZE+*2C1nf6kdYi5 zWqVE}=b^$4>b=e?fNmzf^~Tqq(fc{r@gI{9mfWz<(z@d@+LQ z@}FSA|4j+vY5xWj6BAp>B^@2k;TahK6h_Wx$#0*nGEcnyx8~YyZ-I(CokUd~f#c-A zB~m;?3i?w%i7$L|em<;Qdp6``!zVl{&112+z^CQ)9P5|D6tAGN2^&*O%VpodLv8`W z1tIi{mfdeBTCRpVw@-cLi`$dO5r0ceiLkK2KXLQe=k0No@}*fr4a=7R)pRNCov)m` zU+UMw1f2BuXwhFWOMu6&Thr86A?Mw$-^C^C-@7Yk?4`eA3EP_qRf}gQ5|irg0c6Sk zrglAjE~MO2W^7R>qYBvRz9@62bw1^AZmN=N>-+bH%x^m`7FN$!q$UK?ncy=woF!=8 zh46K@Dv!~kEEheNaPcmHjh|v<<0Mj_D?PQW^#6@B8o6NKpP}ptys#mJXZ3*9*-mp^ zmEerT8}6=8_4yl|jiyz$`{MVOu~~1A+7w*oGzs=2{kR{ix}KScRSd1FY4v1XZ)$jw znN!WK^8)Xpv+Q6`jv|w?8_|E~);KJec5LGVd?%q>_F-8!K>={B#v#LI-^;}1EyBzo zd$+2fn+lPkW#yyd9!M$bs_S%Dt>nZ6gMOLCbtJe~oh9G>rxY7J+$a7JGA*?qsxx^1iNp1re*PL#NCy;T`*mjV74$Uz*&XB)1*Ks(bHW*H|1?1pn z31z}nE)JHpu#YGQPju#U%i&O;&5ofSR?n*Y(!AI+R9vmqz7-AS9^rB0&Hn5)3Ev#} zmGN}C(mCf1-nYinttUZqB163!()##sxsg)^uZ906vt`Rvv5gl9_atq6ki%zo`t$EH zhwB7Zau(|*nP9@Ni(Ge41J}IzG_UA6LZ&bEkEv1JA1AIsOtVC{>=rdRtY1%75(vpRCpNz2*LX;GIaor|%yw9XoM}o_Z7d zWaMsEw?Nr|MjaPuzNWDvp*)+1mc`C9@Y{4z&d3;KP~LseoLRx@)4tlERlE zp3c*K=cBs0Nk)}%bkLKV@%EvCCBsVU#240m^$V~fGm6!i~iyT+?Tng@2Bn{(d&g=zkjNLzMO@n3kxzSZ@ zH>;r@8AA}+jJ*xF$;vvV5^+bdJZ$`t{`traqbOOr(g4X_VTx7h`q##&y=*HHhfYIN zPQq<^@S{iJ-iK*eG+Tt*rWJw|VQ0?3w{KA)S7=6t22 zy(|=>tP^gFlcjL8D=WYE5KpO#8%5kD#SoCWo z-n9q_%^@txBrxr6AtG6)(`oSrPsI$;#Pm7Z%)q)==6-zc8)kl1nN03(tjB;je|J=A=C--ES4u7X| zwb$yD7BYZgM_!63n_12ySNkWgZxT2<5db=*SsvzROX4*Jsm|Xn6K*qT=fK)XplOp8 z435*bMokH&@eBz)hM7^9tR!>2B9X+?;8x+1UjWti=-v+wy~~;BGa9SOn)TPIZS&3* zACp2kw~eyN*WYYX!v2{s$F5T{_MD&rP_x7sZ}Rr`qDZX&DUnli9^aBiXk$QO9=jh& z6-LZ4H;Zi4&HMaWrK%1z*+1tU7;n`M*zxZV-x}!2-PpF}3)--Gvm0ioO!M92ag(*P zk8Mz{-N{6&ww%Efc~f3FvlqR>tX25yJd?No#)WvR+{+SgWwL%vc`J;n*?co>sr-z} zVwhd%BD$2*yw5ZyX+>mp014r#*EX++FL=SjwJ!?0h*oIOM4dBfk8$O_0J;%Y=iXSH zCDSeM7H`!*r6Kbu|6~QQUKZ4jC5EnOXY=;^ukE5RjYW5kdFWC~F`Fao zk_A-R%-v5PY8mStYcW`ov?`lKi&bzi!R=;=6loC3!4e-HPnCTI) z>4{j!{zwiG3Jl!Q#hKGQp;+(X1Wk>P3lPK49EZ1}{GSj~OfdZ(NzJv+{XT<~Gdr8H zq8*g^V2pQ@IM3Ej9eB8ZTYe5(-{dGy8DD$Wy~C`X&KoosgN1#~#Nj>GEJ&f$ML1GN zG_QNZb=nh>&zQywh~!Ax$bu(Gt?MVFZG}{VVCK_+Dy+5c)(a|2;NxYZXCj`|;7yF= z>bi61&P|bx+4UDg$_-g&ppuYyLt<$mxU}6EQ<6WOFv$-J>5fq->lP^w>Q7x;i)mgy zd)TJK%qUb$LWdYDcSXb+Q~4~%O#ir;xd{Q*i3B%53UDC>)j|>HxBc}_Q?U6`@sL(DuRt(_fH9HFsXrv{Iv&AkUK0ZDvNyI48 z2Oq}~{bsJ9<6@AOXJuRuXrDHB?5etcw$V(uwnXW>hmS*t^N?pc94|XZ8D#fEE~c;- z$NP@&(*dN;F+M&@I(X>B6pYVHJK~h@yYAz^wG}+~m0-C(*e@?Hv(AkJ2R?*e`uAr7 z;=AL)hx;$b0mtJvS=HBLROPE|_tEeJA0i(gznHt+RDu<_7o5W?i_Hp^it-GNk4v2M zMCgami-^D8b|V2YU!ZZ!?Ab7Tt4V~GFU5zzXzNDHA_sRtElncHFA(HPe#Ko@lEO#~ zgIc)urahu+Ofh8bh~pd`cVz-gY4B&S!=B6ZOb3EN3ti~B=$hKdpE`97JzPW0W^Xpl z_8W5c4l-oZ@>R8)vfJ=x=U&YFlA26H&-3?5A7Ha#hXn|@Xvr?~CpKw4A@q&{z>glz z74ML`7H`-fTEQ8^x7&hdPyNZr?+qA{A6Q26DY-D(R+`kJv2!&B{>)MaYN%u))oTtI zxZ>5sm=sW9;PpOv_6jQwU2%2&X7N8;!TBj9}Q3Xy0y!i8OP>-O!7011Ir!_cJ9SbfGWAf%9D!A_?w+hrKWrPI_Cu$5{um z1fMOFdA9WEzUmTT>gS1zT2*QH$(xao+sm7Go>{PixC#5~`T@c2?7M1XU8&$5pwR&i zmc=t|7_-M*vC3sHzG}*dZX52zSn)7}^{IcFtKPF%*!*KWl4-82alyTv8w+`Bjk`am zIFfK*ZFsp9b3Rj3lptZdGKc(#c;gb~sO;|O@^|GgybhN-_<1@fWUE)Pr`nyuDq{;y zCV?SEoHtJDP~crsMa#c40Qo{^AzkF8!SaumZ$q=NhMh%_fT%~vl*-ueBC*FDNzLjz z04`bHxP-Uj5lz@Aj?ZY| zU`=$^nF~z;5Jg~jesy}T$TmRUnnrA@Tk~++nfj-!C3NcR*7lBRyd>H}2-rg>t8)@! zuwdFKE|hLa%9bK200ES7^Vpc`tx4{QrPN(@VJ!nLAKH3}q(r#K>JQ77#1n4Bii9_j z{|*$ee@3{5g-easOHd22d&3k}XakR%Vn`E=UdpPc`iVbu{S^g3ms26L?^DXc7l+JY?_yG^O?k72wIpNHfg1|aEP1ZRG}x!Eb$F2k^1GR`*O@(@#D669 z;rcXePg>`PR^c+tUB4O5O>8~9S{CxWm9t0v%o#S-_6}e>{WW?UqR4$7@x}vCJKr4i zyW_*SHi+~VhTg>;oBIbHD(i33>be6;0cg4Ek*S_D@4J+?T$gc+wtEFXk-PEkMq2xK zQEa#r`I19<)jTV>MaHoU?9FjH_XLECPHdwnddPb@a|hQ2x4`TnOASE|LAZ~tX_Q*e z`jE9Bg)$UO=y$J&0nFhw;A8jd!#4axY=9?y_IZ5P?%GUy@_DksM8z&~Z}wCs#%jIc zPBXsM_Yz#@hD1Z{yN}#Sf6oLW%6c`eSb)C0JKr=Sq{o%y)i}004#vf_D9|STdrEbBRq2+Q;X!oEbN?$zIahK zM(jk2otP_TeFmqgT8!P^<;?Ag{n;C%_op%Ff?T6n zU$7YKBV4-Gi(;=dN5Abj+4`0HC$6OLExq@p&Ug)9w~s46Q5iS8e*k>{(j=J4`tJiD zj^tE7zl5-NJosh*Iywh*oD*TivY(aI{N*uSeNqHco3DV<$CbB&=i1#;%o#m3kd4?O z6u2hH_>bcLBOXk(pU7w{C4Z!hQolzAVuX|is&If8^-6mZwf~+qfpu-mVCo5rs)OG%-7Q)o#31~*6-E9#u z85cU?TV9sQ802qHUt%;^-&$!yO3y3VdAspsShRPsSngio>@njOpMv*kc}bmXeRP16 z_sXjbAg;qv9zWc@F{}-q531exIHOYGUBw>~w5Gu0b|uct^Y#!tZAeomZR{CL1?yGw zkfT=ZNv8az{L!J>?gqKP48ebd)zs!oOtAB~V?KHu5JdNY=$=MRa>p6?mDvu?4MM&V zkoKzr9aN?&-6<=MwlGPS6oM21IW{R`{ub)qWiIsaOgR)P|M;zRThK;iJnXE`GUiUR zIw6Kb`;7)K{xgv+@>P1yBC-(e^DiB@oSyDD;EJkZmD2=cDw|lQ%4e(TDcJ&D(aEww zJev?(g`9=5H&O#4b|@)b*Z3}=r}0kCR~b*f7&G*=4;Jyw2>c8XH93iFCi}ur#lePJ za>B+O;ugWEf9FkYBk5d_ja;sEQ~%|~I-(^{+C!ms%k<`jk0fsic(K8jVMNF7v$T9_ z%6{8TU@2ZE*}dCrd_kiajM+EYN4Echg()f*)sV++dl#rdJBwEz-3{A3rc`XOxY}@M zh~v=TTpzXdq;vUqtxUgMa`Acl#^!86GpF$HcH+Hwvx3d75_wo%L@ww)LA~s6k@p!~Xc60YBW?v|@^X%~XZ@92JlC*qgFbt_Vj+sO_S~GGg`z}p=6{#zgXi4O zR=h0bP@zHXi(ok*LjU?SjIjHua{bBh4N56iGk8eQ+9N;=||L`g;xFI%UdhBvq_e|?y zZnZ>}ymRcXQ3Yuu&8@)BA~JmY*NrC^+D;!Z0>4Q;ck)qm?5P9C9;i@%$DcWN=lsXw z%4!v_YfW2EA_5+RZpukKdl$9+L!I!<&g(q7TJphx2X4H6jNQOj3@+(s;jFl{xGq#G zpv8tlBGg(yXG zO`ULw;+lHm&U!iQVSMw*hpC`j;WcI8pk@D&1buGFDGC2YV^YFsn%D($Rvqys5OVOU zpfx7Arr_9bS)hFb@L+wC^$g)D<&o=ewq*&=4tSlwCD$799rg;KoR!X4?d$QXV`A%j0!mSJ zd1QD?z++sizo2gj3XN`Y@*Z|P(7mGrDhZ{x-_9di%x!$FVPY2i zvCNIyI-e{LvCRgFRO`#n$i~6lL(|fSaY{**=4FF$mdOOxDvOe~t=Td~#G2*)}FBWGv1G$`a|P zerBZi=gtVFR8(1IEk(*zpm#fNp%BEkHMq;RDJ$?k2H@TIDEOj9s0$}8@TJMc7Qsx6+5N%JkFNti8yP+MT4UNX_F0@Q z6yvkS2V^@x?lQk!>d7f#P~Z3bu*8L{w!FC+r?c}2^{yHn>e23ggQjg)3&|8bdC zThEUdRFF8ff0kT|Is8C0>iV_MrNr{WK_Skg#KNB>>h`0`)b+qk%6Q<@pu)AmJh#d5 zy3JwsLpF{mzW$m3<#YxPSo+%4V;1>|&per~Bm~mfecTbVUM6;~FM;~~PgHzq+uWtw z)`s^}K877Q$F?kTHz>O8k!qy}q<7!I zAukuoTgJ6eGW!<)rKA0~MD|)9NUKO{EhEE--$QGh=5Y*@#d>#KBjBIhz(}VYVMzq% zE{(2YX2X!%<|~aUl)GA@~EG6eix1kV>j{v@=ghi>D|n+WI)5|;YayVstP z@Tbxw(0DD_lgX+cJJx}=-$IYiMj9UAs*ahSwzpq&#YaYQOs>byXDjq@z8Xh!09p|$J|4%c&D!}mIqvJpl*l8gD zQQyzOVnH!dkTp@n5mHWzXpOs{-MT9bjv87IYuQ8&)eYom2wHtSCqZ2l5<{(NWs3)f zlDyTo3;Q8(%TQHuwdcHe4;zPn@9S!^+66UqzmZK%M&slu8#1+;Pp)j&v_Sgy_G&(j ze$y#JnP$Z@ymlSOvjH*73a3C5*Z4cw@~`e+rQ_4wzQI2G4*Am@5?%hClhdzY4yhW#Bi zG-@^ML4~nHqL;Fa+rCwCoJ03`gVv&`|IxCCPt45>OMY|3xdo=}ZaPJBJWc#m0bUXu8%u>9`t#+S%6BISJ@Z#R6Ei>W^ zotxU(2}Do!DaKnl|00Fq?H8lo%XDhnf=bE>O8)J0l8U0U0j^ao(W@7mu3SfjOW1OGSEO zyrj9^?TD6Z3#p@JYZ_%YvYc54t}q}wz}mq5BO@cm2S7j7wR70cXVoS6%=Sz~H zjfm&MLlL3ndyM(1n~Pif?xURxV7z_G9d)QT2AR<*>b~tTK zi&!$`{;g-stT%}+0=t!2R5WyLl;IUVCZiUM>gDfZi@p`|^X&*FRziiof!SY}r(I9p zXD|JINJI3AxmyM2H&LWvjP=EWO;IoVW{3uY0(S-atQ5%ReSMDv5MP#pO zk#-$ccz6qot{cxhF;4~bhW;dKR_N;s!3{YQ#6=}V`dpjGpEnIw-w1FlG_hbb5el-U zVo`LV0@4)~G-@+xv z!G-ZY{JDefXJ(v4``2X0iZ)Fa<|M&RAVXK^GNcaWQKjX3Gn{9-Uf{M-r-nkdT$MBb zl$T$)}S9GhbVy@GeMxFSFQziyOd!s^F=WH(seF5bW-(i;`T=WNYvg3=b;j z_wlTYmbKh4|2ZTH!&#cxnib-OBZju0)=2Ma0z3tH+0Dq=2-E&`&h z)bT)$xLSSK;KP7|UgFZjY?=9+Wd&_Z!dCsIkvEE9jEw+yxTyKkd8496mpe)CTQmre znasw82WPScvk}YSgEtNeBF@_#)B?V?fS6V7YgSOy@FJEJhHh~izXphGoJxm>hT=*f zV;-Czr|w2%YsL>Qty*@=A)fRcCk7X{Ge72?&Iuil`H%R7%gOuL{yE5^mG##O=^3jw zTWhm2!58NpDjQ9><};1*4x4k)N6#X()@xs-;i06m*6a>>m6D^AWmua(8UkLqUD`{7>ruS7k_l$86{<*n%=KawUR8#m~_1srm_FJKY@ z2<|cG=~D}PN6^+A9QIWsxc@jHI#%##r%PqK?t3jf#&!z4#}wpPoPvMz zZ*m3K$pK!uamEwhPkEGBrYcuWyXRA}#mQF8uSMzlQQ2ER6eQ-(ry$GlDP{|L$C!$% zgf6*UV}`{pXceqYxIyIosl}O|Wp;FE8KxM70j{7&7MGIFom~mpM=ZGFX2PEeN6p3~ zju@#`1&%Fl)Fsyn9g!G;kj#oaR)o&Q6}hht7AVMS2+ACKm)dsQId1I2X#-6}atEp->|dDsxv+Hx7NhnXROmDEw7 z{|{xsXNh2f7Z3EclqK@ZAZSv@LGfGZ3f4ECKA zkv(S97U@QUW=IZLf~g5IT|!b{{vCK>qa*yLts1K7bK8a}Yb2y(K*=GmeQ05WU>*NL zaY;^Vju=&wW6BX#JBG?|8Gi=!v%LZxPsXEOAU@-g@=V*~^Kz6G-B9+Ox>gRBs}gm? z;;aB@ya9+9lsrSNhI%{x!kT2t&tFimerjBAhv~7MUZEEb8lcNl4uxF{@u(ZVlImrg zC${s@^{VVp;^ohHP{Fb-vVq#5cYg=j zmb+M&yQNcwDj1f4Cf{uB2eBLRwf8$O3n_3I&f?J9B|c+OvzO5Z`pLC6i6V2}on|%- zNfDbFkpgvitc6gnsYgLztZaEfWq@Ie_b0jC%etCl{94X;Zq0?!CVfUj0pF0`1aZ(( zfYYZ`5Ir?Pc`!lQhGeL%;)#ww{T~Z0=#qJgHpN8UeWpqYe?^XB~J-L_WR ztC#ryBaGZg$TTp&V?ZgfC=~YqkiRbToX&|WH41C>c|K93e8!A)zRDnzboykkWy$&i z=U$t4#hz^0up2DkCTjeiGo#+9At!cg5+)}*Fqp&(UDGint!>cb?o*v+3yLHvmxc%J zN@$#r@;6hZff+h~!AU-iL=(*Un}gpOWt#<#olUW1lv?4Hsyc+7 zKiGo0JCFkk!HjHxC%cX4Qdm$<7&SGuH~S0OyWW_(ovFRId(?5rdC|SjZ%Hh5y2$m# zNt@xXb`}4E)@=WR){E%Mnq)s{(Ww2#hHWgNyfVLuOPCx89Tc0n(r;hslrrQ&IXP5l zVMCI_lf`6I1}wAID}pL=92;SsM=>@ja(I9Ml}+)VFPI@X%oD=UkLG6!EloWJj)^8| zEwZZfxl5bllh-?=!YeT2lb?KveB58ep3eCucE^+kD|7E-wJ*yDS#%+MW#FVgxkhLk zHnA9Fel=e-x$4^^F)Q&DGgV`UEjOKxIW`~RnrF@%$Dd$bpc<}i6^P`oG>E7+P~K3L zA^Vw2L2|=nQAam|A^R;lQ-#JV@Pt(XZSNwLlgPSf@BpQ7wD*gsK^sP&BD32#~OhztSyWr%L z1{0n@F~8m$-}=6Vk4>-r6k9$HIYaj#nJq-F$(|9H$Zfu%mZQ2HAgDsE)#~~x6g#r~ zvA?@??GDH>4du7@sX{v~M&MeAPS5_{TdOy{0qr}s|EPRlXKMx55>{Fw;RsY%-~Bsn)uEWYOJ= z7T))?u>UXW{uq3Xqsc5cGiq#hrJO$xRpfuX!qxVLlOeR7y~9@<>43|zGkof>Yd@G! zaY|PqzRd~xx$_@K4$~1)r*9h8!qhoto1{%T$mH2iQ(C=I<%E%x}z2{iAwFAwkG3DGzX8pZRM>cXi3}Y^EI|&g0K@`Y&-3R4mpt7IEq3QawkDXr)|UOy^N0lb(CuG)TND1w zOw%3Zu_;f_Lc+-P{dqs|?$XHZOmQ|pGR(kckJMo;ePAD|hWd4mSMajKPQjJCJt!~D zj%USHPE!V%eMNywy>+)lj~<)tOKMj1557molxnTrWSzb*0{{{$aFsIgjj%T2a2+1( zQG^q^1$zVX$v1)#YxZ8$o=9;_o80Z&r-6T#hQSpxH2;~`ll@yz zj%T}LBwH)MD_8qwN}CzDEVIYm=Ok+UZfDh%%_Lefo28-blFS*)emH56Fl_* zMnEo+GLamR@}_QvHMKuLvobg(pAAJ%YSA3H=HAxuTzZf&Wo8_IHdQiF7E;;)LDK{j zF^M&`-ov}h1h`AvX6D7{2nW-uQDuLIyd<;czW*@Jmfkx}ox_QKVE;45WDa%sn;4)# zTLXYGU*X7Ds^VUXo5sjO?AG2eAn%wn`Z-pexJmTvO8rW{R|$cJ&V6sMU+DJ^(@N_Y zbcpV@P0QJomEFx@?PT7j}4XzK@%7 z(#PUTjgZcC#od|1K#li~7D_Ec?(_IgMZt;8GIE<(rGii}e6ya-NxvF!hx|6&samSb znS1;EGX}@YdmHM%w-uS~qeEFXxkHUX=YLkqsMYY4>RHz!*Al@3!@;dgjQ7GQ+wKIe zevg!I$Y;R(q-9RHp|f$HxjxbgEa+%shZF-@)S$!6K$DF$ZZQ7&(L-}A?SxKxl~r4) zPiva7&yN#3Z-MP?Fd(mo(ddU`BlqX|T1o(MP*pKR?R|%|KCR5R22h$?Z!?Tk?{9x9}mV6Ts30b*-sLe?O{F7uL;+C`_=C%?zb} z7A5#3L%Q{CXhX8>v;q~)%xnHFambe1!N;eG`KzxTmAfF(oQr?dT2I%Wv({bvrxEZ()RnfnAfo4)?;VVi5& zz0Ys%w-(hugxr>StaV$?nHf}i*H%X{09qmI1YWHVq^IX4XNgEyTAPh-xMy4C#*Omh zU}HP=&dCNRU_FU3M{@p?Q?^$fV=UF&rk9%hX+dF^w!pt-#M;(M3E62@DJiz9!Ir9J z!k#9voN4zJD3$Qs34&z@{`^M&Z$Do(^@#3`SH zFn)Nm7z?eZyav~q=`TAxPIG3G)7Y|W;?W&rp(VbEbf1G#z}KS&T&4{{5Wiu#Mfh(KJhpXU2C;W_g(=(b!yodqfF~e6U0=OX{joY%h6|fwQQHY$z4LZ5(U&X z5AsJ{QOqvT{nnXjHzYo+_P(cvc*|>crKIfD>6P8pSz}u-+O|D@_`8CE0L1Hro_!3E zhI%`(Hw>wqmFq6=tHVONIJzl}C3yh>_D>s*?a1dN+=x0PmFqAo4JEl&;9?A}lf#q$ z-b}ijcpdS(Vz*F;@ywTfD!S{=_+jy*{&RGS46r)la5T27;}l#YO?8A9{2_BQR#T}M zTVtwwW+rs_{xC*9#USVuQ60m6wk9M4k>Y1^4PKaAVJV?Dn_th5Hi{q6(QmLtn)mq{ zDBO(K6cH+2Yy2jk|*gveLwSBEj4jc4s;RouX$5Ktt zd50O6)`=PjRCw_QtFK?`$XezduZPRLMQsDtRBB+9!~U~JC~O(GgM-^g#X$uLOf#do zd}>Zl_kx&~u|bW02QM$uW_NQt^)=jiETznGZU{_N*$HU;TzBe}ZC(()M4qMAlV*hg z`yJ#~*m-prB*zkQjQw!(GNyd8ac1K6bvkWXFyU5cURg$M4@wd(<@Q51APsG5mK-k# z;fz=iBPLsuZL}}P}uoY zh$(l;Nbk^ZHKbdCX$bvlmHVG$UFqUBh;*lkZw;2iyTc_^gvV0FL%=PBaflVqWLXBJ zz(Rx~WTVKkp^m5zs!#o zI81TTj#{r&+OF7aFEMw~v9+ELLo|C#WZ?B*9#|D{^#IFPSoYLZGznd6oCkBW_qnJ1 z6>>bebK%7)*gMTZbo%Y+exqDe@9ZiqA6cKPFw>8~j@cJ()2ximul?#@U!$MV%U_#A z*wlSUJQ7)WzR7UztW)Ox2C5o`Sbm#%$w}ywi#s> zBlYkE)7Etk-^DHOd}0vA4xrZ?>p!Lqf1%7{n7e~oQ!#8iIv62%*bN}pcQYc0#WE-uQd&hGVf0!frUGn+dvnk80-E(IAlGk=3 zuLlo|wtl}wFObmQh)(^8=t*Puj{_E`7B0@Ue3LBL&pcl;f|-WRh3=@S+;Af-z|T^;c$umq6|z`*(L^tE^1>1>k=m zQ{{DG2H#kPioBz~rx9)9HgCnF3*KUZSk1xZxSw)c@H4ah1URK(`i+O{6Rf8$GVkXu zUX`(FPBD+fFo+Lq<5#mwZeWX<#Ia_SciiY^LX+@)H}|$`{*w zQ=b_L-_ge~8HQEY=M?*?vX;*R%yv}I@~Z?r%tIRbw*CI@S@LWqQLM+Gclj;uv;b-) zWRfA-IbJnh4DQ124WXX{Y0ULM6IPl;y_CW=f2iWvbK1^usv;#lHEm^r#hiP2SEh@! zVO!&^arziHH+S5ny}P~O@!O56ezi;dh<^O)QWylYqd3hjU3VXT{BH^ zq_T&k^5$15xt-I7TIDWAQod8NTn?kmZfW*_q%t8~m;v_GcFA)D{((}fe>-1CIPwpcRxC~K)~2P;ISF%}(4L;;(? z(iYM4GXu-+2FKLRVv{EnpQ{GV76LuV=RYw}+mlHOdh>og_d_ik(6rV%V12BevFHdQ zApvTKr~ar3W}ev#)@#BERA9DRF<9U-*8>HsPx20Ct5rfV>l1HZz{eQ8&U^C@m;d>W zI#sn-8`$UXJc0Q18N5HXzIO@%6l!^@CF+^f&yJ3cuC7bpzq}y#gO^<{^$P^lOM&eE z1Z!{5xX2=twfC6J l1H#9(S??a(w@?osXs~%rJtx4O&3fm+6Ak@GMQV1h{|8QOp=AI7 From 02f4956699c3e934ad747144a240787bd66f5e4c Mon Sep 17 00:00:00 2001 From: tom Date: Wed, 1 Jul 2026 08:46:21 +0200 Subject: [PATCH 12/13] bug fixes --- .../pages/details/ChainStatsDetails.tsx | 4 ++-- .../components/ChainStatsDetailsCrossChainTxs.tsx | 14 +++++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/features/chain-stats/pages/details/ChainStatsDetails.tsx b/src/features/chain-stats/pages/details/ChainStatsDetails.tsx index 5e9c4868f1..b1182a2f89 100644 --- a/src/features/chain-stats/pages/details/ChainStatsDetails.tsx +++ b/src/features/chain-stats/pages/details/ChainStatsDetails.tsx @@ -129,8 +129,8 @@ const ChainStatsDetails = () => { { + const counterPartyChainsConfig = React.useMemo(() => { return chainsQuery.data?.items .filter((chain) => chain.id !== (baseChain?.app_config ?? config).chain.id) .map((chain) => ({ @@ -68,12 +69,18 @@ const ChainStatsDetailsCrossChainTxs = ({ })) || []; }, [ baseChain?.app_config, chainsQuery.data?.items ]); + const baseChainIds = React.useMemo(() => { + return multichainConfig()?.chains + .filter((chain) => chain.app_config.features.crossChainTxs.isEnabled) + .map((chain) => chain.id); + }, []); + const chainFilter = (() => { const counterPartyChainSelect = ( ) : null; @@ -141,7 +149,7 @@ const ChainStatsDetailsCrossChainTxs = ({ } return counterPartyChainIds.map((chainId) => { - return chainsConfig.find((chain) => chain.id === chainId)?.name || `Chain ${ chainId }`; + return counterPartyChainsConfig.find((chain) => chain.id === chainId)?.name || `Chain ${ chainId }`; }).join(', '); })(); From e65fde36f63700fa4ac1a2c66bffe21adb43cfd8 Mon Sep 17 00:00:00 2001 From: tom Date: Wed, 1 Jul 2026 10:58:28 +0200 Subject: [PATCH 13/13] Address Copilot review feedback on cross-chain query gating and shield fallback. Co-authored-by: Cursor --- .../pages/tx/TxDetailsCrossChainTransfers.tsx | 8 +++++-- .../MultichainAddressTokenTransfers.tsx | 2 +- .../pages/address/MultichainAddressTxs.tsx | 2 +- .../components/entity/AddressEntity.tsx | 7 ++++++- .../pages/design-system/tabs/Values.tsx | 21 ------------------- 5 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/features/cross-chain-txs/pages/tx/TxDetailsCrossChainTransfers.tsx b/src/features/cross-chain-txs/pages/tx/TxDetailsCrossChainTransfers.tsx index b945920366..507eccd934 100644 --- a/src/features/cross-chain-txs/pages/tx/TxDetailsCrossChainTransfers.tsx +++ b/src/features/cross-chain-txs/pages/tx/TxDetailsCrossChainTransfers.tsx @@ -19,12 +19,16 @@ interface Props { const TxDetailsCrossChainTransfers = ({ hash, isLoading: isLoadingProp }: Props) => { - const { data, isPending } = useTxCrossChainTransfersQuery({ hash }); const multichainContext = useMultichainContext(); + const chainConfig = multichainContext?.chain.app_config ?? config; + const { data, isPending } = useTxCrossChainTransfersQuery({ + hash, + enabled: chainConfig.features.crossChainTxs.isEnabled, + }); const isLoading = isLoadingProp || isPending; - if ((!isPending && (!data || !data.items.length)) || !(multichainContext?.chain.app_config ?? config).features.crossChainTxs.isEnabled) { + if ((!isPending && (!data || !data.items.length)) || !chainConfig.features.crossChainTxs.isEnabled) { return null; } diff --git a/src/features/multichain/pages/address/MultichainAddressTokenTransfers.tsx b/src/features/multichain/pages/address/MultichainAddressTokenTransfers.tsx index 14685120b5..f9a225ab5a 100644 --- a/src/features/multichain/pages/address/MultichainAddressTokenTransfers.tsx +++ b/src/features/multichain/pages/address/MultichainAddressTokenTransfers.tsx @@ -74,7 +74,7 @@ const MultichainAddressTokenTransfers = ({ addressData, isLoading }: Props) => { pathParams: { hash }, options: { placeholderData: generateListStub<'interchainIndexer:address_transfers'>(INTERCHAIN_TRANSFER, 50, { next_page_params: undefined }), - enabled: !isLoading && !isLocalTab, + enabled: !isLoading && !isLocalTab && config.features.crossChainTxs.isEnabled, }, }); diff --git a/src/features/multichain/pages/address/MultichainAddressTxs.tsx b/src/features/multichain/pages/address/MultichainAddressTxs.tsx index 95b485bc09..2a913070df 100644 --- a/src/features/multichain/pages/address/MultichainAddressTxs.tsx +++ b/src/features/multichain/pages/address/MultichainAddressTxs.tsx @@ -72,7 +72,7 @@ const MultichainAddressTxs = ({ addressData, isLoading }: Props) => { pathParams: { hash }, options: { placeholderData: generateListStub<'interchainIndexer:address_messages'>(INTERCHAIN_MESSAGE, 50, { next_page_params: undefined }), - enabled: !isLoading && !isLocalTab, + enabled: !isLoading && !isLocalTab && config.features.crossChainTxs.isEnabled, }, }); diff --git a/src/slices/address/components/entity/AddressEntity.tsx b/src/slices/address/components/entity/AddressEntity.tsx index 6d166c0e91..e201031ac7 100644 --- a/src/slices/address/components/entity/AddressEntity.tsx +++ b/src/slices/address/components/entity/AddressEntity.tsx @@ -130,7 +130,12 @@ const Icon = (props: IconProps) => { size={ props.size ?? (props.variant === 'heading' ? 30 : 20) } hash={ getDisplayedAddress(props.address) } /> - { shield && }/> } + { shield && ( + } : {}) } + /> + ) } { isDelegatedAddress && } diff --git a/src/toolkit/pages/design-system/tabs/Values.tsx b/src/toolkit/pages/design-system/tabs/Values.tsx index 0790c263e3..f1fd435e04 100644 --- a/src/toolkit/pages/design-system/tabs/Values.tsx +++ b/src/toolkit/pages/design-system/tabs/Values.tsx @@ -3,20 +3,15 @@ import BigNumber from 'bignumber.js'; import React from 'react'; -// import * as interchainTransferMock from 'src/features/cross-chain-txs/mocks/transfers'; - import AssetValue from 'src/shared/values/entity/AssetValue'; import GasPriceValue from 'src/shared/values/entity/GasPriceValue'; import NativeCoinValue from 'src/shared/values/entity/NativeCoinValue'; import SimpleValue from 'src/shared/values/entity/SimpleValue'; import TokenValue from 'src/shared/values/entity/TokenValue'; -// import TokenValueInterchain from 'src/shared/values/entity/TokenValueInterchain'; import { Section, Container, SectionHeader, SamplesStack, Sample, SectionSubHeader } from '../parts'; import { TOKEN } from './Link'; -export const EXTERNAL_CHAIN_LOGO_URL = 'https://blockscout-icons.s3.us-east-1.amazonaws.com/ethereum.svg'; - const ValuesShowcase = () => { return ( @@ -175,22 +170,6 @@ const ValuesShowcase = () => { - { /* - - */ }