diff --git a/.github/workflows/label-issues-in-release.yml b/.github/workflows/label-issues-in-release.yml index 244112c25c..c1b5ddf98a 100644 --- a/.github/workflows/label-issues-in-release.yml +++ b/.github/workflows/label-issues-in-release.yml @@ -223,7 +223,7 @@ jobs: const issues = associatedPullRequests .nodes - .filter(({ closingIssuesReferences: { nodes: issues } }) => !issues?.some(({ labels }) => labels?.nodes?.some(({ description }) => description.toLowerCase().startsWith('release')))) + .filter(({ closingIssuesReferences: { nodes: issues } }) => !issues?.some(({ labels }) => labels?.nodes?.some(({ description }) => description?.toLowerCase().startsWith('release')))) .map(({ closingIssuesReferences: { nodes: issues } }) => issues.map(({ number }) => number)) .flat(); diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index dac641c42a..b4d0341e6a 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -15,18 +15,20 @@ jobs: contents: read pull-requests: write - # publish_image: - # image will be published in e2e-tests.yml workflow - # name: Publish Docker image - # uses: './.github/workflows/publish-image.yml' - # secrets: inherit - - e2e_tests: - name: Run e2e tests - needs: checks - uses: "./.github/workflows/e2e-tests.yml" + publish_image: + name: Publish Docker image + uses: './.github/workflows/publish-image.yml' secrets: inherit - permissions: write-all + with: + platforms: linux/amd64 + + # e2e_tests: + # decided to disable e2e temporarily + # name: Run e2e tests + # needs: checks + # uses: "./.github/workflows/e2e-tests.yml" + # secrets: inherit + # permissions: write-all version: name: Pre-release version info diff --git a/configs/app/features/rollup.ts b/configs/app/features/rollup.ts index 2eb5625060..248dc88f99 100644 --- a/configs/app/features/rollup.ts +++ b/configs/app/features/rollup.ts @@ -15,15 +15,13 @@ const L2WithdrawalUrl = getEnvValue('NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL'); const parentChain: ParentChain | undefined = (() => { const envValue = parseEnvJson(getEnvValue('NEXT_PUBLIC_ROLLUP_PARENT_CHAIN')); - const baseUrl = stripTrailingSlash(getEnvValue('NEXT_PUBLIC_ROLLUP_L1_BASE_URL') || ''); - - if (!baseUrl && !envValue?.baseUrl) { + if (!envValue?.baseUrl) { return; } return { ...envValue, - baseUrl: baseUrl || envValue?.baseUrl || '', + baseUrl: stripTrailingSlash(envValue.baseUrl), }; })(); diff --git a/configs/envs/.env.arbitrum b/configs/envs/.env.arbitrum index 16a81329a4..2d95cd692e 100644 --- a/configs/envs/.env.arbitrum +++ b/configs/envs/.env.arbitrum @@ -55,7 +55,6 @@ NEXT_PUBLIC_NETWORK_RPC_URL=https://arbitrum-one.publicnode.com NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/arbitrum-one.png NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth.blockscout.com NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth.blockscout.com','currency':{'name':'Ether','symbol':'ETH','decimals':18},'isTestnet':false,'id':1,'name':'Ethereum Mainnet','rpcUrls':['https://eth.drpc.org']} NEXT_PUBLIC_ROLLUP_STAGE_INDEX=1 NEXT_PUBLIC_ROLLUP_TYPE=arbitrum diff --git a/configs/envs/.env.arbitrum_nova b/configs/envs/.env.arbitrum_nova index db12015ca8..b2e1f14314 100644 --- a/configs/envs/.env.arbitrum_nova +++ b/configs/envs/.env.arbitrum_nova @@ -31,8 +31,8 @@ NEXT_PUBLIC_NETWORK_RPC_URL=https://arbitrum.llamarpc.com NEXT_PUBLIC_NETWORK_SHORT_NAME=Arbitrum Nova NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/arbitrum-nova.png -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth.blockscout.com NEXT_PUBLIC_ROLLUP_TYPE=arbitrum +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth.blockscout.com'} NEXT_PUBLIC_TRANSACTION_INTERPRETATION_PROVIDER=blockscout NEXT_PUBLIC_VIEWS_CONTRACT_SOLIDITYSCAN_ENABLED=true NEXT_PUBLIC_VISUALIZE_API_HOST=https://visualizer.services.blockscout.com \ No newline at end of file diff --git a/configs/envs/.env.arbitrum_sepolia b/configs/envs/.env.arbitrum_sepolia index 7ef99fd5c1..f152652597 100644 --- a/configs/envs/.env.arbitrum_sepolia +++ b/configs/envs/.env.arbitrum_sepolia @@ -44,7 +44,6 @@ NEXT_PUBLIC_NETWORK_RPC_URL=https://sepolia-rollup.arbitrum.io/rpc NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/arbitrum-sepolia.png NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth-sepolia.blockscout.com NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth-sepolia.blockscout.com','currency':{'name':'Ether','symbol':'ETH','decimals':18},'isTestnet':true,'id':11155111,'name':'Sepolia','rpcUrls':['https://eth-sepolia.public.blastapi.io']} NEXT_PUBLIC_ROLLUP_TYPE=arbitrum NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service diff --git a/configs/envs/.env.base b/configs/envs/.env.base index d4d5b15b19..7cc32179fc 100644 --- a/configs/envs/.env.base +++ b/configs/envs/.env.base @@ -67,7 +67,7 @@ NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/base-mainnet.png NEXT_PUBLIC_OTHER_LINKS=[{'url':'https://base.drpc.org?ref=559183','text':'Public RPC'}] NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth.blockscout.com/ +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth.blockscout.com'} NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://bridge.base.org/withdraw NEXT_PUBLIC_ROLLUP_STAGE_INDEX=1 NEXT_PUBLIC_ROLLUP_TYPE=optimistic diff --git a/configs/envs/.env.celo b/configs/envs/.env.celo index bb27299472..665b7673cc 100644 --- a/configs/envs/.env.celo +++ b/configs/envs/.env.celo @@ -55,7 +55,7 @@ NEXT_PUBLIC_NETWORK_SHORT_NAME=Mainnet NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/celo.png NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth.blockscout.com/ +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth.blockscout.com'} NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://mondo.celo.org/bridge NEXT_PUBLIC_ROLLUP_TYPE=optimistic NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service diff --git a/configs/envs/.env.garnet b/configs/envs/.env.garnet index c4c6027e60..f6a49db44a 100644 --- a/configs/envs/.env.garnet +++ b/configs/envs/.env.garnet @@ -46,7 +46,7 @@ NEXT_PUBLIC_OG_DESCRIPTION=Redstone is the home for onchain games, worlds, and o NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/garnet.png NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth-holesky.blockscout.com/ +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth-holesky.blockscout.com'} NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://garnet.qry.live/withdraw NEXT_PUBLIC_ROLLUP_TYPE=optimistic NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service diff --git a/configs/envs/.env.mega_eth b/configs/envs/.env.mega_eth index cd9fa192f5..67f5e8ef19 100644 --- a/configs/envs/.env.mega_eth +++ b/configs/envs/.env.mega_eth @@ -49,7 +49,7 @@ NEXT_PUBLIC_NETWORK_RPC_URL=https://alpha.megaeth.com/rpc NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/mega-eth.png NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth.blockscout.com/ +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth.blockscout.com'} NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://www.megaeth.com/ NEXT_PUBLIC_ROLLUP_TYPE=optimistic NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service diff --git a/configs/envs/.env.multichain_prod b/configs/envs/.env.multichain_prod index 79cdf2f72d..a04d64289d 100644 --- a/configs/envs/.env.multichain_prod +++ b/configs/envs/.env.multichain_prod @@ -8,6 +8,16 @@ NEXT_PUBLIC_APP_HOST=localhost NEXT_PUBLIC_APP_PORT=3000 NEXT_PUBLIC_APP_ENV=development +NEXT_PUBLIC_NETWORK_ICON=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/multichain-light.svg +NEXT_PUBLIC_NETWORK_ICON_DARK=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/multichain-dark.svg +NEXT_PUBLIC_NETWORK_LOGO=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/multichain-light.svg +NEXT_PUBLIC_NETWORK_LOGO_DARK=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/multichain-dark.svg +NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/multichain.png +FAVICON_MASTER_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/favicons/multichain.png +NEXT_PUBLIC_HOMEPAGE_HERO_BANNER_CONFIG={'background':['linear-gradient(89deg,rgba(83,83,211) 50.49%,rgba(155,155,255) 99.38%)'],'text_color':['rgba(225,225,255,1)'],'button':{'_default':{'background':['rgba(16,17,18,1)']},'_hover':{'background':['rgba(74,71,127,1)']}}} +NEXT_PUBLIC_COLOR_THEME_OVERRIDES={'bg':{'primary':{'_light':{'value':'rgba(255,255,255,1)'},'_dark':{'value':'rgba(35,43,55,1)'}}},'text':{'primary':{'_light':{'value':'rgba(16,17,18,0.8)'},'_dark':{'value':'rgba(255,255,255,0.8)'}},'secondary':{'_light':{'value':'rgba(113,128,150,1)'},'_dark':{'value':'rgba(160,174,192,1)'}}},'hover':{'_light':{'value':'rgba(155,155,255,1)'},'_dark':{'value':'rgba(155,155,255,1)'}},'selected':{'control':{'text':{'_light':{'value':'rgba(16,17,18,1)'},'_dark':{'value':'rgba(247,250,252,1)'}},'bg':{'_light':{'value':'rgba(16,17,18,0.04)'},'_dark':{'value':'rgba(247,250,252,0.06)'}}},'option':{'bg':{'_light':{'value':'rgba(83,83,211,1)'},'_dark':{'value':'rgba(114,114,233,1)'}}}},'icon':{'primary':{'_light':{'value':'rgba(113,128,150,1)'},'_dark':{'value':'rgba(160,174,192,1)'}},'secondary':{'_light':{'value':'rgba(160,174,192,1)'},'_dark':{'value':'rgba(113,128,150,1)'}}},'button':{'primary':{'_light':{'value':'rgba(83,83,211,1)'},'_dark':{'value':'rgba(114,114,233,1)'},'text':{'_light':{'value':'rgba(255,255,255,0.92)'},'_dark':{'value':'rgba(255,255,255,0.92)'}}}},'link':{'primary':{'_light':{'value':'rgba(83,83,211,1)'},'_dark':{'value':'rgba(114,114,233,1)'}}},'graph':{'line':{'_light':{'value':'rgba(94,87,112,1)'},'_dark':{'value':'rgba(194,190,208,1)'}},'gradient':{'start':{'_light':{'value':'rgba(94,87,112,0.3)'},'_dark':{'value':'rgba(194,190,208,0.3)'}},'stop':{'_light':{'value':'rgba(94,87,112,0)'},'_dark':{'value':'rgba(194,190,208,0)'}}}},'stats':{'bg':{'_light':{'value':'rgba(16,17,18,0.04)'},'_dark':{'value':'rgba(255,255,255,0.06)'}}},'topbar':{'bg':{'_light':{'value':'rgba(16,17,18,0.04)'},'_dark':{'value':'rgba(255,255,255,0.06)'}}},'navigation':{'text':{'selected':{'_light':{'value':'rgba(16,17,18,1)'},'_dark':{'value':'rgba(247,250,252,1)'}}},'bg':{'selected':{'_light':{'value':'rgba(16,17,18,0.04)'},'_dark':{'value':'rgba(255,255,255,0.06)'}}}},'tabs':{'text':{'primary':{'_light':{'value':'rgba(113,128,150,1)'},'_dark':{'value':'rgba(160,174,192,1)'}}}}} + + NEXT_PUBLIC_MULTICHAIN_ENABLED=true NEXT_PUBLIC_MULTICHAIN_AGGREGATOR_API_HOST=https://multichain-aggregator.services.blockscout.com NEXT_PUBLIC_MULTICHAIN_CLUSTER=multichain diff --git a/configs/envs/.env.optimism b/configs/envs/.env.optimism index ad5887c6d1..f708fc2bd4 100644 --- a/configs/envs/.env.optimism +++ b/configs/envs/.env.optimism @@ -63,7 +63,7 @@ NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/optimism-mainnet.png NEXT_PUBLIC_OTHER_LINKS=[{'url':'https://optimism.drpc.org?ref=559183','text':'Public RPC'}] NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth.blockscout.com/ +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth.blockscout.com'} NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://app.optimism.io/bridge/withdraw NEXT_PUBLIC_ROLLUP_STAGE_INDEX=1 NEXT_PUBLIC_ROLLUP_TYPE=optimistic diff --git a/configs/envs/.env.optimism_sepolia b/configs/envs/.env.optimism_sepolia index 817aa5dbfa..85a942525b 100644 --- a/configs/envs/.env.optimism_sepolia +++ b/configs/envs/.env.optimism_sepolia @@ -50,7 +50,7 @@ NEXT_PUBLIC_NETWORK_NAME=OP Sepolia NEXT_PUBLIC_NETWORK_RPC_URL=https://sepolia.optimism.io NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth-sepolia.blockscout.com/ +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth-sepolia.blockscout.com'} NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://app.optimism.io/bridge/withdraw NEXT_PUBLIC_ROLLUP_TYPE=optimistic NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service diff --git a/configs/envs/.env.rari_testnet b/configs/envs/.env.rari_testnet index b12cc76952..94e5290ba0 100644 --- a/configs/envs/.env.rari_testnet +++ b/configs/envs/.env.rari_testnet @@ -30,7 +30,7 @@ NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=false NEXT_PUBLIC_OTHER_LINKS=[] NEXT_PUBLIC_ROLLUP_DA_CELESTIA_CELENIUM_URL=https://mocha-4.celenium.io/blob NEXT_PUBLIC_ROLLUP_DA_CELESTIA_NAMESPACE=0x00000000000000000000000000000000000000ca1de12a9905be97beaf -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://arbitrum-sepolia.blockscout.com/ +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://arbitrum-sepolia.blockscout.com'} NEXT_PUBLIC_ROLLUP_TYPE=arbitrum NEXT_PUBLIC_SEO_ENHANCED_DATA_ENABLED=false NEXT_PUBLIC_VIEWS_ADDRESS_IDENTICON_TYPE=jazzicon diff --git a/configs/envs/.env.scroll_sepolia b/configs/envs/.env.scroll_sepolia index 546263780b..a35824ac93 100644 --- a/configs/envs/.env.scroll_sepolia +++ b/configs/envs/.env.scroll_sepolia @@ -39,7 +39,7 @@ NEXT_PUBLIC_NETWORK_RPC_URL=https://sepolia-rpc.scroll.io NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/scroll-testnet.png NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth-sepolia.blockscout.com +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth-sepolia.blockscout.com'} NEXT_PUBLIC_ROLLUP_TYPE=scroll NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service NEXT_PUBLIC_STATS_API_HOST=https://scroll-sepolia.blockscout.com diff --git a/configs/envs/.env.shibarium b/configs/envs/.env.shibarium index ff3b4934cf..6c399c01f4 100644 --- a/configs/envs/.env.shibarium +++ b/configs/envs/.env.shibarium @@ -56,7 +56,7 @@ NEXT_PUBLIC_NETWORK_SHORT_NAME=Puppynet NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/shibarium-mainnet.png NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth.blockscout.com/ +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth.blockscout.com'} NEXT_PUBLIC_ROLLUP_TYPE=shibarium NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service NEXT_PUBLIC_STATS_API_HOST=https://www.shibariumscan.io diff --git a/configs/envs/.env.tac_spb b/configs/envs/.env.tac_spb index a798512b55..73a4ab3303 100644 --- a/configs/envs/.env.tac_spb +++ b/configs/envs/.env.tac_spb @@ -40,7 +40,8 @@ NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-c NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service NEXT_PUBLIC_STATS_API_HOST=https://spb.explorer.tac.build -NEXT_PUBLIC_TAC_OPERATION_LIFECYCLE_API_HOST=https://tac-spb-operation-lifecycle.k8s.blockscout.com +# NEXT_PUBLIC_TAC_OPERATION_LIFECYCLE_API_HOST=https://tac-spb-operation-lifecycle.k8s.blockscout.com +NEXT_PUBLIC_TAC_OPERATION_LIFECYCLE_API_HOST=https://tac-spb-operation-lifecycle.k8s-dev.blockscout.com NEXT_PUBLIC_TAC_TON_EXPLORER_URL=https://testnet.tonviewer.com NEXT_PUBLIC_TRANSACTION_INTERPRETATION_PROVIDER=blockscout NEXT_PUBLIC_VIEWS_TOKEN_SCAM_TOGGLE_ENABLED=true diff --git a/configs/envs/.env.zkevm b/configs/envs/.env.zkevm index 9ea9fc19d1..347fd3da7c 100644 --- a/configs/envs/.env.zkevm +++ b/configs/envs/.env.zkevm @@ -39,7 +39,7 @@ NEXT_PUBLIC_NETWORK_NAME=Polygon CDK Stavanger NEXT_PUBLIC_NETWORK_RPC_URL=https://sn2-stavanger-rpc.eu-north-2.gateway.fm NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth-sepolia.blockscout.com +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth-sepolia.blockscout.com'} NEXT_PUBLIC_ROLLUP_TYPE=zkEvm NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service NEXT_PUBLIC_STATS_API_HOST=https://polygon-cdk-stavanger.blockscout.com diff --git a/configs/envs/.env.zksync b/configs/envs/.env.zksync index fbbb0a149a..229f0e3dda 100644 --- a/configs/envs/.env.zksync +++ b/configs/envs/.env.zksync @@ -51,7 +51,7 @@ NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/zksync.png NEXT_PUBLIC_OTHER_LINKS=[{'url':'https://zksync.drpc.org?ref=559183','text':'Public RPC'}] NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth.blockscout.com/ +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth.blockscout.com'} NEXT_PUBLIC_ROLLUP_TYPE=zkSync NEXT_PUBLIC_SAFE_TX_SERVICE_URL=https://safe-transaction-zksync.safe.global NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service diff --git a/configs/envs/.env.zora b/configs/envs/.env.zora index 75e6aee03c..2d399901e2 100644 --- a/configs/envs/.env.zora +++ b/configs/envs/.env.zora @@ -54,7 +54,7 @@ NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=validation NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_OG_IMAGE_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/og-images/zora-mainnet.png NEXT_PUBLIC_PUZZLE_GAME_BADGE_CLAIM_LINK=https://badges.blockscout.com/mint/capyPuzzleBadge -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth.blockscout.com/ +NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://eth.blockscout.com'} NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://bridge.zora.energy NEXT_PUBLIC_ROLLUP_TYPE=optimistic NEXT_PUBLIC_STATS_API_BASE_PATH=/stats-service diff --git a/deploy/tools/envs-validator/index.ts b/deploy/tools/envs-validator/index.ts index 0d55fcb991..17e1363fb8 100644 --- a/deploy/tools/envs-validator/index.ts +++ b/deploy/tools/envs-validator/index.ts @@ -152,12 +152,7 @@ function getEnvsPlaceholders(filePath: string): Promise> { } function printDeprecationWarning(envsMap: Record) { - if ( - envsMap.NEXT_PUBLIC_ROLLUP_L1_BASE_URL - ) { - // eslint-disable-next-line max-len - console.warn('❗ The NEXT_PUBLIC_ROLLUP_L1_BASE_URL variables are now deprecated and will be removed in the next release. Please migrate to the NEXT_PUBLIC_ROLLUP_PARENT_CHAIN variable.'); - } + } function checkDeprecatedEnvs(envsMap: Record) { diff --git a/deploy/tools/envs-validator/schema.ts b/deploy/tools/envs-validator/schema.ts index 78508aa79e..da9ef07747 100644 --- a/deploy/tools/envs-validator/schema.ts +++ b/deploy/tools/envs-validator/schema.ts @@ -13,7 +13,6 @@ import type { AddressProfileAPIConfig } from 'types/client/addressProfileAPIConf import type { GasRefuelProviderConfig } from 'types/client/gasRefuelProviderConfig'; import { GAS_UNITS } from 'types/client/gasTracker'; import type { GasUnit } from 'types/client/gasTracker'; -import type { MultichainProviderConfig } from 'types/client/multichainProviderConfig'; import { PROVIDERS as TX_INTERPRETATION_PROVIDERS } from 'types/client/txInterpretation'; import { VALIDATORS_CHAIN_TYPE } from 'types/client/validators'; import type { ValidatorsChainType } from 'types/client/validators'; @@ -30,14 +29,6 @@ import * as uiSchemas from './schemas/ui'; import * as featuresSchemas from './schemas/features'; import servicesSchema from './schemas/services'; -const multichainProviderConfigSchema: yup.ObjectSchema = yup.object({ - name: yup.string().required(), - url_template: yup.string().required(), - logo: yup.string().required(), - dapp_id: yup.string(), - promo: yup.boolean(), -}); - const schema = yup .object() .noUnknown(true, (params) => { @@ -79,11 +70,6 @@ const schema = yup NEXT_PUBLIC_SAFE_TX_SERVICE_URL: yup.string().test(urlTest), NEXT_PUBLIC_IS_SUAVE_CHAIN: yup.boolean(), NEXT_PUBLIC_METASUITES_ENABLED: yup.boolean(), - NEXT_PUBLIC_MULTICHAIN_BALANCE_PROVIDER_CONFIG: yup - .array() - .transform(replaceQuotes) - .json() - .of(multichainProviderConfigSchema), NEXT_PUBLIC_GAS_REFUEL_PROVIDER_CONFIG: yup .mixed() .test('shape', 'Invalid schema were provided for NEXT_PUBLIC_GAS_REFUEL_PROVIDER_CONFIG, it should have name and url template', (data) => { @@ -170,6 +156,7 @@ const schema = yup .concat(featuresSchemas.highlightsConfigSchema) .concat(featuresSchemas.marketplaceSchema) .concat(featuresSchemas.megaEthSchema) + .concat(featuresSchemas.multichainButtonSchema) .concat(featuresSchemas.nameServicesSchema) .concat(featuresSchemas.rollupSchema) .concat(featuresSchemas.tacSchema) diff --git a/deploy/tools/envs-validator/schema_multichain.ts b/deploy/tools/envs-validator/schema_multichain.ts index 58c87c550a..85e6f76ff4 100644 --- a/deploy/tools/envs-validator/schema_multichain.ts +++ b/deploy/tools/envs-validator/schema_multichain.ts @@ -12,6 +12,7 @@ import * as uiSchemas from './schemas/ui'; import * as featuresSchemas from './schemas/features'; import servicesSchemas from './schemas/services'; import { replaceQuotes } from 'configs/app/utils'; +import { IDENTICON_TYPES } from 'types/views/address'; const schema = yup .object() @@ -38,6 +39,10 @@ const schema = yup NEXT_PUBLIC_NETWORK_SHORT_NAME: yup.string(), NEXT_PUBLIC_IS_TESTNET: yup.boolean(), + // 3. UI views configuration + // Some settings that we actually support in multichain mode + NEXT_PUBLIC_VIEWS_ADDRESS_IDENTICON_TYPE: yup.string().oneOf(IDENTICON_TYPES), + // 5. Features configuration // NOTE!: Not all features are supported in multichain mode, and some of them not relevant or enabled per chain basis // Below listed supported features and the features that are enabled by default, so we have to turn them off @@ -63,8 +68,9 @@ const schema = yup .concat(uiSchemas.footerSchema) .concat(uiSchemas.miscSchema) .concat(featuresSchemas.adsSchema) - .concat(featuresSchemas.userOpsSchema) .concat(featuresSchemas.defiDropdownSchema) + .concat(featuresSchemas.multichainButtonSchema) + .concat(featuresSchemas.userOpsSchema) .concat(servicesSchemas); export default schema; diff --git a/deploy/tools/envs-validator/schemas/features/index.ts b/deploy/tools/envs-validator/schemas/features/index.ts index ef31d9e1cc..09ee5796c4 100644 --- a/deploy/tools/envs-validator/schemas/features/index.ts +++ b/deploy/tools/envs-validator/schemas/features/index.ts @@ -9,6 +9,7 @@ export * from './defiDropdown'; export * from './highlights'; export * from './marketplace'; export * from './megaEth'; +export * from './multichainButton'; export * from './nameServices'; export * from './rollup'; export * from './tac'; diff --git a/deploy/tools/envs-validator/schemas/features/multichainButton.ts b/deploy/tools/envs-validator/schemas/features/multichainButton.ts new file mode 100644 index 0000000000..236739990a --- /dev/null +++ b/deploy/tools/envs-validator/schemas/features/multichainButton.ts @@ -0,0 +1,21 @@ +import { replaceQuotes } from 'configs/app/utils'; +import { MultichainProviderConfig } from 'types/client/multichainProviderConfig'; +import * as yup from 'yup'; + +const multichainProviderConfigSchema: yup.ObjectSchema = yup.object({ + name: yup.string().required(), + url_template: yup.string().required(), + logo: yup.string().required(), + dapp_id: yup.string(), + promo: yup.boolean(), +}); + +export const multichainButtonSchema = yup + .object() + .shape({ + NEXT_PUBLIC_MULTICHAIN_BALANCE_PROVIDER_CONFIG: yup + .array() + .transform(replaceQuotes) + .json() + .of(multichainProviderConfigSchema) + }); \ No newline at end of file diff --git a/deploy/tools/envs-validator/schemas/features/rollup.ts b/deploy/tools/envs-validator/schemas/features/rollup.ts index 175c3e96eb..d5b44905bd 100644 --- a/deploy/tools/envs-validator/schemas/features/rollup.ts +++ b/deploy/tools/envs-validator/schemas/features/rollup.ts @@ -12,46 +12,46 @@ const parentChainCurrencySchema = yup decimals: yup.number().required(), }); -const parentChainSchema = yup - .object() - .transform(replaceQuotes) - .json() - .shape({ - id: yup.number(), - name: yup.string(), - baseUrl: yup.string().test(urlTest).required(), - rpcUrls: yup.array().of(yup.string().test(urlTest)), - currency: yup - .mixed() - .test( - 'shape', - (ctx) => { - try { - parentChainCurrencySchema.validateSync(ctx.originalValue); - throw new Error('Unknown validation error'); - } catch (error: unknown) { - const message = getYupValidationErrorMessage(error); - return 'in \"currency\" property ' + (message ? `${ message }` : ''); - } - }, - (data) => { - const isUndefined = data === undefined; - return isUndefined || parentChainCurrencySchema.isValidSync(data); - }, - ), - isTestnet: yup.boolean(), - }); - export const rollupSchema = yup .object() .shape({ NEXT_PUBLIC_ROLLUP_TYPE: yup.string().oneOf(ROLLUP_TYPES), - NEXT_PUBLIC_ROLLUP_L1_BASE_URL: yup - .string() + NEXT_PUBLIC_ROLLUP_PARENT_CHAIN: yup + .object() .when('NEXT_PUBLIC_ROLLUP_TYPE', { is: (value: string) => value, - then: (schema) => schema.test(urlTest).required(), - otherwise: (schema) => schema.max(-1, 'NEXT_PUBLIC_ROLLUP_L1_BASE_URL cannot not be used if NEXT_PUBLIC_ROLLUP_TYPE is not defined'), + then: (schema) => { + return schema.transform(replaceQuotes).json().shape({ + id: yup.number(), + name: yup.string(), + baseUrl: yup.string().test(urlTest).required(), + rpcUrls: yup.array().of(yup.string().test(urlTest)), + currency: yup + .mixed() + .test( + 'shape', + (ctx) => { + try { + parentChainCurrencySchema.validateSync(ctx.originalValue); + throw new Error('Unknown validation error'); + } catch (error: unknown) { + const message = getYupValidationErrorMessage(error); + return 'in \"currency\" property ' + (message ? `${ message }` : ''); + } + }, + (data) => { + const isUndefined = data === undefined; + return isUndefined || parentChainCurrencySchema.isValidSync(data); + }, + ), + isTestnet: yup.boolean(), + }) + }, + otherwise: (schema) => schema.test( + 'not-exist', + 'NEXT_PUBLIC_ROLLUP_PARENT_CHAIN cannot not be used if NEXT_PUBLIC_ROLLUP_TYPE is not defined', + value => value === undefined, + ), }), NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL: yup .string() @@ -113,34 +113,6 @@ export const rollupSchema = yup value => value === undefined, ), }), - NEXT_PUBLIC_ROLLUP_PARENT_CHAIN: yup - .mixed() - .when('NEXT_PUBLIC_ROLLUP_TYPE', { - is: (value: string) => value, - then: (schema) => { - return schema.test( - 'shape', - (ctx) => { - try { - parentChainSchema.validateSync(ctx.originalValue); - throw new Error('Unknown validation error'); - } catch (error: unknown) { - const message = getYupValidationErrorMessage(error); - return 'Invalid schema were provided for NEXT_PUBLIC_ROLLUP_PARENT_CHAIN' + (message ? `: ${ message }` : ''); - } - }, - (data) => { - const isUndefined = data === undefined; - return isUndefined || parentChainSchema.isValidSync(data); - } - ) - }, - otherwise: (schema) => schema.test( - 'not-exist', - 'NEXT_PUBLIC_ROLLUP_PARENT_CHAIN cannot not be used if NEXT_PUBLIC_ROLLUP_TYPE is not defined', - value => value === undefined, - ), - }), NEXT_PUBLIC_ROLLUP_DA_CELESTIA_NAMESPACE: yup .string() .min(60) diff --git a/deploy/tools/envs-validator/test/.env.arbitrum b/deploy/tools/envs-validator/test/.env.arbitrum index 06ac5055bd..1cf856f053 100644 --- a/deploy/tools/envs-validator/test/.env.arbitrum +++ b/deploy/tools/envs-validator/test/.env.arbitrum @@ -1,5 +1,4 @@ NEXT_PUBLIC_ROLLUP_TYPE=arbitrum -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://example.com NEXT_PUBLIC_ROLLUP_HOMEPAGE_SHOW_LATEST_BLOCKS=true NEXT_PUBLIC_ROLLUP_PARENT_CHAIN={'baseUrl':'https://explorer.duckchain.io','currency':{'name':'Quack','symbol':'QUACK','decimals':18},'isTestnet':true,'id':42,'name':'DuckChain','rpcUrls':['https://rpc.duckchain.io']} diff --git a/deploy/tools/envs-validator/test/.env.multichain b/deploy/tools/envs-validator/test/.env.multichain index 0de9ee6113..cd65449496 100644 --- a/deploy/tools/envs-validator/test/.env.multichain +++ b/deploy/tools/envs-validator/test/.env.multichain @@ -11,6 +11,7 @@ NEXT_PUBLIC_API_DOCS_TABS=[] NEXT_PUBLIC_FEATURED_NETWORKS=http://example.com NEXT_PUBLIC_FOOTER_LINKS=http://example.com NEXT_PUBLIC_HOMEPAGE_HERO_BANNER_CONFIG={'background':['linear-gradient(90deg, rgb(232, 52, 53) 0%, rgb(139, 28, 232) 100%)'],'text_color':['rgb(255, 255, 255)']} +NEXT_PUBLIC_MULTICHAIN_BALANCE_PROVIDER_CONFIG=[{'name': 'zerion', 'url_template': 'https://app.zerion.io/{address}/overview', 'logo': 'https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/marketplace-logos/zerion.svg'}] NEXT_PUBLIC_NETWORK_ICON=http://example.com NEXT_PUBLIC_NETWORK_ICON_DARK=http://example.com NEXT_PUBLIC_NETWORK_LOGO=http://example.com diff --git a/deploy/tools/envs-validator/test/.env.optimism b/deploy/tools/envs-validator/test/.env.optimism index 0a21caefa0..f717685f3f 100644 --- a/deploy/tools/envs-validator/test/.env.optimism +++ b/deploy/tools/envs-validator/test/.env.optimism @@ -1,5 +1,4 @@ NEXT_PUBLIC_ROLLUP_TYPE=optimistic -NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://example.com NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://example.com NEXT_PUBLIC_FAULT_PROOF_ENABLED=true NEXT_PUBLIC_ROLLUP_HOMEPAGE_SHOW_LATEST_BLOCKS=true diff --git a/docs/DEPRECATED_ENVS.md b/docs/DEPRECATED_ENVS.md index 3bb2aadcde..4cb8702d9c 100644 --- a/docs/DEPRECATED_ENVS.md +++ b/docs/DEPRECATED_ENVS.md @@ -31,3 +31,4 @@ | NEXT_PUBLIC_VIEWS_CONTRACT_LANGUAGE_FILTERS | `Array<'solidity' \| 'vyper' \| 'yul' \| 'scilla' \| 'geas' \| 'stylus_rust'>` | Pass an array of contract languages that will be displayed as options in the filter on the verified contract page. | - | `['solidity','vyper','yul','geas','stylus_rust']` | `['solidity','vyper','yul','scilla']` | v1.37.0+ | v2.6.0+ | Replaced with configuration retrieved from the API. | | NEXT_PUBLIC_SAVE_ON_GAS_ENABLED | `boolean` | Set to "true" to enable the feature | - | - | `true` | v1.35.0+ | v2.7.0+ | Feature is deprecated. | | NEXT_PUBLIC_API_SPEC_URL | `string` | Spec of Blockscout core API to be displayed on the page. | - | `https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml` | `https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml` | v1.0.x+ | v2.7.0+ | The URL is now constructed automatically based on the configuration received from the API. | +| NEXT_PUBLIC_ROLLUP_L1_BASE_URL | `string` | Blockscout base URL for parent network. | Required | - | `'http://eth-goerli.blockscout.com'` | v1.24.0+ | v2.7.0+ | Replaced with NEXT_PUBLIC_ROLLUP_PARENT_CHAIN | diff --git a/docs/ENVS.md b/docs/ENVS.md index 8c6b960a40..cca871ea41 100644 --- a/docs/ENVS.md +++ b/docs/ENVS.md @@ -530,7 +530,7 @@ Ads are enabled by default on all self-hosted instances. If you would like to di | Variable | Type| Description | Compulsoriness | Default value | Example value | Version | | --- | --- | --- | --- | --- | --- | --- | | NEXT_PUBLIC_ROLLUP_TYPE | `'optimistic' \| 'arbitrum' \| 'shibarium' \| 'zkEvm' \| 'zkSync' \| 'scroll'` | Rollup chain type | Required | - | `'optimistic'` | v1.24.0+ | -| NEXT_PUBLIC_ROLLUP_L1_BASE_URL | `string` | Blockscout base URL for parent network. **DEPRECATED** _Use `NEXT_PUBLIC_ROLLUP_PARENT_CHAIN` instead_ | Required | - | `'http://eth-goerli.blockscout.com'` | v1.24.0+ | +| NEXT_PUBLIC_ROLLUP_PARENT_CHAIN | `ParentChain`, see details [below](#parent-chain-configuration-properties) | Configuration parameters for the parent chain. | Required | - | `{'baseUrl':'https://explorer.duckchain.io'}` | v1.38.0+ | | NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL | `string` | URL for rollup to parent chain withdrawals (Optimistic stack only) | - | - | `https://app.optimism.io/bridge/withdraw` | v1.24.0+ | | NEXT_PUBLIC_ROLLUP_LAYER_NUMBER | `number` | Layer number of the rollup | - | `2` | `3` | v2.7.0+ | | NEXT_PUBLIC_ROLLUP_STAGE_INDEX | `1 \| 2` | Reflects the maturity and decentralization level of the chain based on [L2BEAT's framework](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe). The label will be added to the sidebar according to the provided stage index. Not applicable for testnets. | - | - | `1` | v2.1.0+ | @@ -539,7 +539,6 @@ Ads are enabled by default on all self-hosted instances. If you would like to di | NEXT_PUBLIC_INTEROP_ENABLED | `boolean` | Enables "Interop messages" page (Optimistic stack only) | - | `false` | `true` | v1.39.0+ | | NEXT_PUBLIC_ROLLUP_HOMEPAGE_SHOW_LATEST_BLOCKS | `boolean` | Set to `true` to display "Latest blocks" widget instead of "Latest batches" on the home page | - | - | `true` | v1.36.0+ | | NEXT_PUBLIC_ROLLUP_OUTPUT_ROOTS_ENABLED | `boolean` | Enables "Output roots" page (Optimistic stack only) | - | `false` | `true` | v1.37.0+ | -| NEXT_PUBLIC_ROLLUP_PARENT_CHAIN | `ParentChain`, see details [below](#parent-chain-configuration-properties) | Configuration parameters for the parent chain. | - | - | `{'baseUrl':'https://explorer.duckchain.io'}` | v1.38.0+ | | NEXT_PUBLIC_ROLLUP_DA_CELESTIA_NAMESPACE | `string` | Hex-string for creating a link to the transaction batch on the [Celenium explorer](https://celenium.io). "0x"-format and 60 symbol length. Available only for Arbitrum roll-ups. | - | - | `0x00000000000000000000000000000000000000ca1de12a9905be97beaf` | v1.38.0+ | | NEXT_PUBLIC_ROLLUP_DA_CELESTIA_CELENIUM_URL | `string` | URL for the Selenium explorer. It is used to create links to the Data Availability Blobs page. The URL should contain the full path without any search parameters related to the blob, as these will be constructed at runtime for each blob separately. Available only for Optimistic or Arbitrum roll-ups. | - | - | `https://mocha.celenium.io/blob` | v2.0.2+ | @@ -547,9 +546,9 @@ Ads are enabled by default on all self-hosted instances. If you would like to di | Variable | Type| Description | Compulsoriness | Default value | Example value | | --- | --- | --- | --- | --- | --- | +| baseUrl | `string` | Base url of the chain explorer. | Required | - | `https://explorer.duckchain.io` | | id | `number` | Chain id, see [https://chainlist.org](https://chainlist.org) for the reference. | - | - | `42` | | name | `string` | Displayed name of the chain. Set to customize parent chain transaction status labels in the UI (e.g., "Sent to "). Currently, this setting is applicable only for Arbitrum-based chains. | - | - | `DuckChain` | -| baseUrl | `string` | Base url of the chain explorer. | Required | - | `https://explorer.duckchain.io` | | rpcUrls | `Array` | Chain public RPC server urls, see [https://chainlist.org](https://chainlist.org) for the reference. | - | - | `['https://rpc.duckchain.io']` | | currency | `{ name: string; symbol: string; decimals: number; }` | Chain currency config. | - | - | `{ name: Quack, symbol: QUA, decimals: 18 }` | | isTestnet | `boolean` | Set to true if network is testnet. | - | - | `true` | diff --git a/lib/operations/tac.ts b/lib/operations/tac.ts index 16940d61cc..3dc5bc3373 100644 --- a/lib/operations/tac.ts +++ b/lib/operations/tac.ts @@ -14,6 +14,8 @@ export function getTacOperationStatus(type: tac.OperationType) { return 'Error'; case tac.OperationType.ROLLBACK: return 'Rollback'; + case tac.OperationType.INSUFFICIENT_FEE: + return 'Insufficient fee'; case tac.OperationType.PENDING: return 'Pending'; default: diff --git a/lib/rollbar/index.tsx b/lib/rollbar/index.tsx index edab663503..d21ab10e26 100644 --- a/lib/rollbar/index.tsx +++ b/lib/rollbar/index.tsx @@ -55,6 +55,7 @@ export const clientConfig: Configuration | undefined = feature.isEnabled ? { const originFileName = getExceptionOriginFileName(item); const IGNORED_ORIGIN_FILE_NAMES_CHUNKS = [ '/node_modules/@walletconnect', + '/node_modules/@reown', ]; if (originFileName && IGNORED_ORIGIN_FILE_NAMES_CHUNKS.some((chunk) => originFileName.includes(chunk))) { diff --git a/nextjs/PageNextJs.tsx b/nextjs/PageNextJs.tsx index 40e4bee47d..39759cd51c 100644 --- a/nextjs/PageNextJs.tsx +++ b/nextjs/PageNextJs.tsx @@ -2,7 +2,6 @@ import React from 'react'; import type { Route } from 'nextjs-routes'; import type { Props as PageProps } from 'nextjs/getServerSideProps/handlers'; -import PageMetadata from 'nextjs/PageMetadata'; import useAdblockDetect from 'lib/hooks/useAdblockDetect'; import useGetCsrfToken from 'lib/hooks/useGetCsrfToken'; @@ -27,12 +26,7 @@ const PageNextJs = (props: Props) const isMixPanelInitialized = mixpanel.useInit(); mixpanel.useLogPageView(isMixPanelInitialized); - return ( - <> - - { isMounted ? props.children : null } - - ); + return isMounted ? props.children : null; }; export default React.memo(PageNextJs); diff --git a/package.json b/package.json index 23eeb112ac..79d59f3baa 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@blockscout/multichain-aggregator-types": "2.1.2", "@blockscout/points-types": "1.4.0-alpha.1", "@blockscout/stats-types": "2.11.1", - "@blockscout/tac-operation-lifecycle-types": "0.0.1-alpha.6", + "@blockscout/tac-operation-lifecycle-types": "1.1.0", "@blockscout/visualizer-types": "0.2.0", "@blockscout/zetachain-cctx-types": "^1.0.0-rc.6", "@chakra-ui/react": "3.33.0", diff --git a/pages/_app.tsx b/pages/_app.tsx index 76f6ac184a..ecae1c2453 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -8,6 +8,9 @@ import React from 'react'; import type { NextPageWithLayout } from 'nextjs/types'; +import type { Route } from 'nextjs-routes'; +import PageMetadata from 'nextjs/PageMetadata'; + import config from 'configs/app'; import getSocketUrl from 'lib/api/getSocketUrl'; import useQueryClientConfig from 'lib/api/useQueryClientConfig'; @@ -57,7 +60,7 @@ If you don't understand what this console is for, close it now and stay safe.`; const CONSOLE_SCAM_WARNING_DELAY_MS = 500; -function MyApp({ Component, pageProps }: AppPropsWithLayout) { +function MyApp({ Component, pageProps, router }: AppPropsWithLayout) { const growthBook = initGrowthBook(pageProps.uuid); useLoadFeatures(growthBook); @@ -96,34 +99,37 @@ function MyApp({ Component, pageProps }: AppPropsWithLayout) { const socketUrl = !config.features.multichain.isEnabled ? getSocketUrl() : undefined; return ( - - - - - - - - - - - - { content } - - - - - - - - - - - - - + <> + + + + + + + + + + + + + { content } + + + + + + + + + + + + + + ); } diff --git a/playwright/fixtures/mockEnvs.ts b/playwright/fixtures/mockEnvs.ts index b34c950b9b..d6365efc6a 100644 --- a/playwright/fixtures/mockEnvs.ts +++ b/playwright/fixtures/mockEnvs.ts @@ -31,20 +31,20 @@ export const ENVS_MAP: Record> = { ], shibariumRollup: [ [ 'NEXT_PUBLIC_ROLLUP_TYPE', 'shibarium' ], - [ 'NEXT_PUBLIC_ROLLUP_L1_BASE_URL', 'https://localhost:3101' ], + [ 'NEXT_PUBLIC_ROLLUP_PARENT_CHAIN', '{"baseUrl":"https://localhost:3101"}' ], ], zkEvmRollup: [ [ 'NEXT_PUBLIC_ROLLUP_TYPE', 'zkEvm' ], - [ 'NEXT_PUBLIC_ROLLUP_L1_BASE_URL', 'https://localhost:3101' ], + [ 'NEXT_PUBLIC_ROLLUP_PARENT_CHAIN', '{"baseUrl":"https://localhost:3101"}' ], ], zkSyncRollup: [ [ 'NEXT_PUBLIC_ROLLUP_TYPE', 'zkSync' ], - [ 'NEXT_PUBLIC_ROLLUP_L1_BASE_URL', 'https://localhost:3101' ], + [ 'NEXT_PUBLIC_ROLLUP_PARENT_CHAIN', '{"baseUrl":"https://localhost:3101"}' ], [ 'NEXT_PUBLIC_VIEWS_CONTRACT_EXTRA_VERIFICATION_METHODS', 'none' ], ], scrollRollup: [ [ 'NEXT_PUBLIC_ROLLUP_TYPE', 'scroll' ], - [ 'NEXT_PUBLIC_ROLLUP_L1_BASE_URL', 'https://localhost:3101' ], + [ 'NEXT_PUBLIC_ROLLUP_PARENT_CHAIN', '{"baseUrl":"https://localhost:3101"}' ], ], bridgedTokens: [ [ 'NEXT_PUBLIC_BRIDGED_TOKENS_CHAINS', '[{"id":"1","title":"Ethereum","short_title":"ETH","base_url":"https://eth.blockscout.com/token/"},{"id":"56","title":"Binance Smart Chain","short_title":"BSC","base_url":"https://bscscan.com/token/"},{"id":"99","title":"POA","short_title":"POA","base_url":"https://blockscout.com/poa/core/token/"}]' ], @@ -103,7 +103,7 @@ export const ENVS_MAP: Record> = { ], interop: [ [ 'NEXT_PUBLIC_ROLLUP_TYPE', 'optimistic' ], - [ 'NEXT_PUBLIC_ROLLUP_L1_BASE_URL', 'https://localhost:3101' ], + [ 'NEXT_PUBLIC_ROLLUP_PARENT_CHAIN', '{"baseUrl":"https://localhost:3101"}' ], [ 'NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL', 'https://localhost:3102' ], [ 'NEXT_PUBLIC_INTEROP_ENABLED', 'true' ], ], diff --git a/toolkit/chakra/select.tsx b/toolkit/chakra/select.tsx index 9b02adcd3c..113c859718 100644 --- a/toolkit/chakra/select.tsx +++ b/toolkit/chakra/select.tsx @@ -16,7 +16,7 @@ export type ViewMode = 'default' | 'compact'; export interface SelectOption { label: string; - renderLabel?: () => React.ReactNode; + renderLabel?: (place: 'item' | 'value-text') => React.ReactNode; value: Value; icon?: React.ReactNode; afterElement?: React.ReactNode; @@ -166,7 +166,7 @@ export const SelectValueText = React.forwardRef< WebkitBoxOrient: 'vertical', display: '-webkit-box', }}> - { item.renderLabel ? item.renderLabel() : context.collection.stringifyItem(item) } + { item.renderLabel ? item.renderLabel('value-text') : context.collection.stringifyItem(item) } ) } @@ -272,7 +272,7 @@ export const Select = React.forwardRef((props, ref) .map((item: SelectOption) => ( - { item.renderLabel ? item.renderLabel() : item.label } + { item.renderLabel ? item.renderLabel('item') : item.label } { item.afterElement } @@ -292,7 +292,7 @@ export interface SelectAsyncProps extends Omit { } export const SelectAsync = React.forwardRef((props, ref) => { - const { placeholder, portalled = true, loading, loadOptions, extraControls, onValueChange, errorText, mode, ...rest } = props; + const { placeholder, portalled = true, loading, loadOptions, extraControls, onValueChange, errorText, mode, contentHeader, ...rest } = props; const [ collection, setCollection ] = React.useState>(createListCollection({ items: [] })); const [ inputValue, setInputValue ] = React.useState(''); @@ -340,9 +340,10 @@ export const SelectAsync = React.forwardRef((p /> { extraControls } + { contentHeader } { collection.items.map((item) => ( - { item.renderLabel ? item.renderLabel() : item.label } + { item.renderLabel ? item.renderLabel('item') : item.label } )) } diff --git a/toolkit/components/Hint/Hint.tsx b/toolkit/components/Hint/Hint.tsx index 870d2b1941..4fec25ba67 100644 --- a/toolkit/components/Hint/Hint.tsx +++ b/toolkit/components/Hint/Hint.tsx @@ -8,14 +8,14 @@ import { IconButton } from '../../chakra/icon-button'; import type { TooltipProps } from '../../chakra/tooltip'; import { Tooltip } from '../../chakra/tooltip'; -interface Props extends IconButtonProps { +export interface HintProps extends IconButtonProps { label: string | React.ReactNode; tooltipProps?: Partial; isLoading?: boolean; as?: React.ElementType; } -export const Hint = React.memo(({ label, tooltipProps, isLoading, boxSize = 5, ...rest }: Props) => { +export const Hint = React.memo(({ label, tooltipProps, isLoading, boxSize = 5, ...rest }: HintProps) => { return ( { const [ isLoading, setIsLoading ] = React.useState(false); const apiFetchFactory = React.useCallback(async(recaptchaToken?: string) => { - const url = buildUrl('general:advanced_filter_csv', undefined, { - ...filters, - recaptcha_response: recaptchaToken, - }, undefined, multichainContext?.chain); + const url = buildUrl('general:advanced_filter_csv', undefined, filters, undefined, multichainContext?.chain); const response = await fetch(url, { headers: { diff --git a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_dark-color-mode_flatten-source-code-method-dark-mode-mobile-1.png b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_dark-color-mode_flatten-source-code-method-dark-mode-mobile-1.png index 5cdff99ac2..3c3f5ec044 100644 Binary files a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_dark-color-mode_flatten-source-code-method-dark-mode-mobile-1.png and b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_dark-color-mode_flatten-source-code-method-dark-mode-mobile-1.png differ diff --git a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_flatten-source-code-method-dark-mode-mobile-1.png b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_flatten-source-code-method-dark-mode-mobile-1.png index c301b20047..bcf092c002 100644 Binary files a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_flatten-source-code-method-dark-mode-mobile-1.png and b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_flatten-source-code-method-dark-mode-mobile-1.png differ diff --git a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_multi-part-files-method-1.png b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_multi-part-files-method-1.png index 6194df4bcf..ee931353bf 100644 Binary files a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_multi-part-files-method-1.png and b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_multi-part-files-method-1.png differ diff --git a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_solidity-foundry-method-1.png b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_solidity-foundry-method-1.png index 47debb5cb7..cc9fd63f8c 100644 Binary files a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_solidity-foundry-method-1.png and b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_solidity-foundry-method-1.png differ diff --git a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_solidity-hardhat-method-1.png b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_solidity-hardhat-method-1.png index 122a239bb6..d716d8ad00 100644 Binary files a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_solidity-hardhat-method-1.png and b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_solidity-hardhat-method-1.png differ diff --git a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_standard-input-json-method-1.png b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_standard-input-json-method-1.png index 3437f832b2..fd2cc5f1ae 100644 Binary files a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_standard-input-json-method-1.png and b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_standard-input-json-method-1.png differ diff --git a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_verification-of-stylus-rust-contract-1.png b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_verification-of-stylus-rust-contract-1.png index 18022a710b..1faad87ac7 100644 Binary files a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_verification-of-stylus-rust-contract-1.png and b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_verification-of-stylus-rust-contract-1.png differ diff --git a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_verification-of-zkSync-contract-1.png b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_verification-of-zkSync-contract-1.png index 67ee4f57cd..4ec2f3e6a7 100644 Binary files a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_verification-of-zkSync-contract-1.png and b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_default_verification-of-zkSync-contract-1.png differ diff --git a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_mobile_flatten-source-code-method-dark-mode-mobile-1.png b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_mobile_flatten-source-code-method-dark-mode-mobile-1.png index 56cde724fa..322c801ab5 100644 Binary files a/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_mobile_flatten-source-code-method-dark-mode-mobile-1.png and b/ui/contractVerification/__screenshots__/ContractVerificationForm.pw.tsx_mobile_flatten-source-code-method-dark-mode-mobile-1.png differ diff --git a/ui/crossChain/transfers/TokenTransfersCrossChainListItem.tsx b/ui/crossChain/transfers/TokenTransfersCrossChainListItem.tsx index 543fb77507..6faf941294 100644 --- a/ui/crossChain/transfers/TokenTransfersCrossChainListItem.tsx +++ b/ui/crossChain/transfers/TokenTransfersCrossChainListItem.tsx @@ -48,7 +48,7 @@ const TokenTransfersCrossChainListItem = ({ data, isLoading, rowGap = 3, current