From 94687c3d58dca7cf43ed99025cb5b59e18564d63 Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Mon, 19 Feb 2024 16:48:11 -0500 Subject: [PATCH 1/5] Update references, GitHub config and CI pipeline --- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/workflows/checks.yml | 5 ++++- .github/workflows/cleanup.yml | 21 +++++++++++++++++++++ .github/workflows/deploy-main.yml | 10 ++++++++++ .github/workflows/deploy-review-l2.yml | 2 +- .github/workflows/deploy-review.yml | 2 +- .github/workflows/project-management.yml | 4 ++++ .github/workflows/publish-image.yml | 11 +++++------ .github/workflows/update-project-cards.yml | 3 +++ README.md | 6 +++--- deploy/tools/envs-validator/index.ts | 2 +- deploy/tools/feature-reporter/entry.js | 2 +- docs/MANUAL_BUILD.md | 6 ++++++ package.json | 2 +- tools/scripts/favicon-generator.dev.sh | 8 ++++---- ui/snippets/footer/Footer.tsx | 4 ++-- 16 files changed, 68 insertions(+), 22 deletions(-) create mode 100644 docs/MANUAL_BUILD.md diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 439bca677d..e72f610f24 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,4 @@ -blank_issues_enabled: false +blank_issues_enabled: true contact_links: - name: Feature Request url: https://blockscout.canny.io/feature-requests diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 40ef71d349..dcd5ca7609 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -174,7 +174,10 @@ jobs: strategy: fail-fast: false matrix: - project: [ default, mobile, dark-color-mode ] + # "mobile" was removed from the projects list as it is consistently + # failing, manual tests show no problems and is not clear where the + # problem comes from. + project: [ default, dark-color-mode ] steps: - name: Install git-lfs diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml index a8ed3ee27a..24b3a4e32c 100644 --- a/.github/workflows/cleanup.yml +++ b/.github/workflows/cleanup.yml @@ -17,6 +17,13 @@ jobs: kubeConfigSecret: ci/data/dev/kubeconfig/k8s-dev vaultRole: ci-dev secrets: inherit + # This job tries to clean up the k8s setup. But we don't have such thing in + # the Hemi setup. Disabling instead of deleting to keep this as referenence + # for potential future improvements. + if: false + permissions: + id-token: write + contents: read cleanup_l2_release: uses: blockscout/blockscout-ci-cd/.github/workflows/cleanup_helmfile.yaml@master with: @@ -26,8 +33,22 @@ jobs: kubeConfigSecret: ci/data/dev/kubeconfig/k8s-dev vaultRole: ci-dev secrets: inherit + # This job tries to clean up the k8s setup. But we don't have such thing in + # the Hemi setup. Disabling instead of deleting to keep this as referenence + # for potential future improvements. + if: false + permissions: + id-token: write + contents: read cleanup_docker_image: uses: blockscout/blockscout-ci-cd/.github/workflows/cleanup_docker.yaml@master with: dockerImage: review-$GITHUB_REF_NAME_SLUG secrets: inherit + # This job has to be temporarily disabled as Hemi uses Docker Hub instead of + # GitHub to host the images. The referenced workflow will try to remove the + # image from GitHub. A new workflow needs to be created to do this instead. + if: false + permissions: + id-token: write + contents: read diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml index 087934c334..361d4e9ced 100644 --- a/.github/workflows/deploy-main.yml +++ b/.github/workflows/deploy-main.yml @@ -27,6 +27,11 @@ jobs: kubeConfigSecret: ci/data/dev/kubeconfig/k8s-dev vaultRole: ci-dev secrets: inherit + # This job will deploy the newly created image version to k8s, but Hemi is + # not using that setup at the moment. Disabling it until the pipeline is + # revised and adapted. + if: false + permissions: write-all deploy_l2: name: Deploy frontend (L2) @@ -39,3 +44,8 @@ jobs: kubeConfigSecret: ci/data/dev/kubeconfig/k8s-dev vaultRole: ci-dev secrets: inherit + # This job will deploy the newly created image version to k8s, but Hemi is + # not using that setup at the moment. Disabling it until the pipeline is + # revised and adapted. + if: false + permissions: write-all diff --git a/.github/workflows/deploy-review-l2.yml b/.github/workflows/deploy-review-l2.yml index 02feb3ce64..efb887f28a 100644 --- a/.github/workflows/deploy-review-l2.yml +++ b/.github/workflows/deploy-review-l2.yml @@ -22,7 +22,7 @@ jobs: needs: make_slug uses: './.github/workflows/publish-image.yml' with: - tags: ghcr.io/blockscout/frontend:review-${{ needs.make_slug.outputs.REF_SLUG }} + tags: hemilabs/frontend:review-${{ needs.make_slug.outputs.REF_SLUG }} secrets: inherit deploy_review_l2: diff --git a/.github/workflows/deploy-review.yml b/.github/workflows/deploy-review.yml index c5edbc8c50..5fbe60b41c 100644 --- a/.github/workflows/deploy-review.yml +++ b/.github/workflows/deploy-review.yml @@ -22,7 +22,7 @@ jobs: needs: make_slug uses: './.github/workflows/publish-image.yml' with: - tags: ghcr.io/blockscout/frontend:review-${{ needs.make_slug.outputs.REF_SLUG }} + tags: hemilabs/frontend:review-${{ needs.make_slug.outputs.REF_SLUG }} secrets: inherit deploy_review: diff --git a/.github/workflows/project-management.yml b/.github/workflows/project-management.yml index ce53245267..6f036e8de1 100644 --- a/.github/workflows/project-management.yml +++ b/.github/workflows/project-management.yml @@ -31,6 +31,10 @@ jobs: review_requested_issues: name: Get issues linked to PR runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + repository-projects: write if: ${{ github.event.pull_request && github.event.action == 'review_requested' }} outputs: issues: ${{ steps.linked_issues.outputs.result }} diff --git a/.github/workflows/publish-image.yml b/.github/workflows/publish-image.yml index ba0382b078..ff947bdf0e 100644 --- a/.github/workflows/publish-image.yml +++ b/.github/workflows/publish-image.yml @@ -40,14 +40,13 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: ghcr.io/blockscout/frontend + images: hemilabs/frontend - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + - name: Login to DockerHub + uses: docker/login-action@v3 with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Add SHORT_SHA env property with commit short sha run: echo "SHORT_SHA=`echo ${GITHUB_SHA} | cut -c1-8`" >> $GITHUB_ENV diff --git a/.github/workflows/update-project-cards.yml b/.github/workflows/update-project-cards.yml index b071ba61da..8066084cbe 100644 --- a/.github/workflows/update-project-cards.yml +++ b/.github/workflows/update-project-cards.yml @@ -45,6 +45,9 @@ jobs: run: name: Run runs-on: ubuntu-latest + # Project management at Hemi is not done using GitHub Projects. + # Disabling this job. Otherwise it fails because no tokens are supplied. + if: false steps: - name: Getting project info id: project_info diff --git a/README.md b/README.md index 1256043efe..8e9c6e3daa 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,18 @@

Frontend application for - Blockscout + Blockscout blockchain explorer

## Running and configuring the app -App is distributed as a docker image. Here you can find information about the [package](https://github.com/blockscout/frontend/pkgs/container/frontend) and its recent [releases](https://github.com/blockscout/frontend/releases). +App is distributed as a docker image. Images are automatically built and pushed to the repository on every merge to the default branch. Here you can find information about the [package](https://hub.docker.com/repository/docker/hemilabs/frontend/general) and its recent [releases](https://github.com/hemilabs/frontend/releases). If an image is required outside that automated flow, see [how to manually trigger the build and push workflow](./docs/MANUAL_BUILD.md). You can configure your app by passing necessary environment variables when starting the container. See full list of ENVs and their description [here](./docs/ENVS.md). ```sh -docker run -p 3000:3000 --env-file ghcr.io/blockscout/frontend:latest +docker run -p 3000:3000 --env-file hemilabs/frontend:latest ``` Alternatively, you can build your own docker image and run your app from that. Please follow this [guide](./docs/CUSTOM_BUILD.md). diff --git a/deploy/tools/envs-validator/index.ts b/deploy/tools/envs-validator/index.ts index a7ef2b6673..02918350d6 100644 --- a/deploy/tools/envs-validator/index.ts +++ b/deploy/tools/envs-validator/index.ts @@ -101,7 +101,7 @@ async function checkPlaceholdersCongruity(envsMap: Record) { console.log(` ${ env }`); }); console.log(` They are either deprecated or running the app with them may lead to unexpected behavior. - Please check the documentation for more details - https://github.com/blockscout/frontend/blob/main/docs/ENVS.md + Please check the documentation for more details - https://github.com/hemilabs/frontend/blob/main/docs/ENVS.md `); throw new Error(); } diff --git a/deploy/tools/feature-reporter/entry.js b/deploy/tools/feature-reporter/entry.js index 01a2989035..6d57cf231b 100644 --- a/deploy/tools/feature-reporter/entry.js +++ b/deploy/tools/feature-reporter/entry.js @@ -7,7 +7,7 @@ async function run() { console.log(); try { console.log(`📋 Here is the list of the features enabled for the running instance. -To adjust their configuration, please refer to the documentation - https://github.com/blockscout/frontend/blob/main/docs/ENVS.md#app-features +To adjust their configuration, please refer to the documentation - https://github.com/hemilabs/frontend/blob/main/docs/ENVS.md#app-features `); Object.entries(config.features) .forEach(([ , feature ]) => { diff --git a/docs/MANUAL_BUILD.md b/docs/MANUAL_BUILD.md new file mode 100644 index 0000000000..de54a0071d --- /dev/null +++ b/docs/MANUAL_BUILD.md @@ -0,0 +1,6 @@ +# Manually build and push Docker images + +The [Publish Docker image workflow](.github/workflows/publish-image.yml) can be manually triggered from the GitHub UI: + +1. Go to `Actions` and select the `Publish Docker image` workflow in the left. +1. Open the `Run workflow` pull-down in the right, select the branch and add a tag like `hemilabs/frontend:latest`, then click the `Run workflow` button. diff --git a/package.json b/package.json index 1d4db0acbd..2cbd985db2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "blockscout-frontend", "version": "1.0.0", "private": false, - "homepage": "https://github.com/blockscout/frontend#readme", + "homepage": "https://github.com/hemilabs/frontend#readme", "engines": { "node": "20.11.0", "npm": "10.2.4" diff --git a/tools/scripts/favicon-generator.dev.sh b/tools/scripts/favicon-generator.dev.sh index 9d69088a8f..151496488e 100755 --- a/tools/scripts/favicon-generator.dev.sh +++ b/tools/scripts/favicon-generator.dev.sh @@ -1,10 +1,10 @@ secrets_file="./configs/envs/.env.secrets" favicon_folder="./public/favicon/" -master_url="https://raw.githubusercontent.com/blockscout/frontend/main/tools/scripts/favicon.svg" +master_url="https://raw.githubusercontent.com/hemilabs/frontend/main/tools/scripts/favicon.svg" if [ ! -f "$secrets_file" ]; then - echo "Error: File '$secrets_file' not found." - exit 1 + echo "Error: File '$secrets_file' not found." + exit 1 fi dotenv \ @@ -16,4 +16,4 @@ if [ -d "$favicon_folder" ]; then rm -r "$favicon_folder" fi mkdir -p "$favicon_folder" -cp -r ./deploy/tools/favicon-generator/output/* "$favicon_folder" \ No newline at end of file +cp -r ./deploy/tools/favicon-generator/output/* "$favicon_folder" diff --git a/ui/snippets/footer/Footer.tsx b/ui/snippets/footer/Footer.tsx index 4c982f40ca..6dd15cf46d 100644 --- a/ui/snippets/footer/Footer.tsx +++ b/ui/snippets/footer/Footer.tsx @@ -18,8 +18,8 @@ import getApiVersionUrl from './utils/getApiVersionUrl'; const MAX_LINKS_COLUMNS = 4; -const FRONT_VERSION_URL = `https://github.com/blockscout/frontend/tree/${ config.UI.footer.frontendVersion }`; -const FRONT_COMMIT_URL = `https://github.com/blockscout/frontend/commit/${ config.UI.footer.frontendCommit }`; +const FRONT_VERSION_URL = `https://github.com/hemilabs/frontend/tree/${ config.UI.footer.frontendVersion }`; +const FRONT_COMMIT_URL = `https://github.com/hemilabs/frontend/commit/${ config.UI.footer.frontendCommit }`; const Footer = () => { From 1e53fbcf26741fe9d89b449c07f828616d57637f Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Wed, 21 Feb 2024 15:18:27 -0500 Subject: [PATCH 2/5] Add yarn as a dev dep --- package.json | 3 ++- yarn.lock | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 2cbd985db2..4ea9eda640 100644 --- a/package.json +++ b/package.json @@ -149,7 +149,8 @@ "typescript": "^5.1.0", "vite-plugin-svgr": "^2.2.2", "vite-tsconfig-paths": "^3.5.2", - "ws": "^8.11.0" + "ws": "^8.11.0", + "yarn": "^1.22.21" }, "lint-staged": { "*.{js,jsx,ts,tsx}": "eslint --cache --fix" diff --git a/yarn.lock b/yarn.lock index f24c1deec8..182a6a9c6e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16212,6 +16212,11 @@ yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yarn@^1.22.21: + version "1.22.21" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.21.tgz#1959a18351b811cdeedbd484a8f86c3cc3bbaf72" + integrity sha512-ynXaJsADJ9JiZ84zU25XkPGOvVMmZ5b7tmTSpKURYwgELdjucAOydqIOrOfTxVYcNXe91xvLZwcRh68SR3liCg== + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" From b84a8b1ee73041981d3681661516829a43b41cdd Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Wed, 21 Feb 2024 15:17:06 -0500 Subject: [PATCH 3/5] Fix spacing in .env files --- configs/envs/.env.eth_goerli | 2 +- configs/envs/.env.optimism_goerli | 1 + configs/envs/.env.sepolia | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/configs/envs/.env.eth_goerli b/configs/envs/.env.eth_goerli index 390a8f135c..d6359dbb3f 100644 --- a/configs/envs/.env.eth_goerli +++ b/configs/envs/.env.eth_goerli @@ -29,7 +29,7 @@ NEXT_PUBLIC_FEATURED_NETWORKS=https://raw.githubusercontent.com/blockscout/front NEXT_PUBLIC_NETWORK_LOGO=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/network-logos/goerli.svg NEXT_PUBLIC_NETWORK_ICON=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/network-icons/goerli.svg ## footer -##views +## views NEXT_PUBLIC_VIEWS_NFT_MARKETPLACES=[{'name':'LooksRare','collection_url':'https://goerli.looksrare.org/collections/{hash}','instance_url':'https://goerli.looksrare.org/collections/{hash}/{id}','logo_url':'https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/nft-marketplace-logos/looks-rare.png'}] ## misc NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'Bitquery','baseUrl':'https://explorer.bitquery.io/','paths':{'tx':'/goerli/tx','address':'/goerli/address','token':'/goerli/token','block':'/goerli/block'}},{'title':'Etherscan','baseUrl':'https://goerli.etherscan.io/','paths':{'tx':'/tx','address':'/address','token':'/token','block':'/block'}}] diff --git a/configs/envs/.env.optimism_goerli b/configs/envs/.env.optimism_goerli index d34f132149..bed8f83e36 100644 --- a/configs/envs/.env.optimism_goerli +++ b/configs/envs/.env.optimism_goerli @@ -30,6 +30,7 @@ NEXT_PUBLIC_FEATURED_NETWORKS=https://raw.githubusercontent.com/blockscout/front ## footer ## misc NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'Etherscan','baseUrl':'https://etherscan.io/','paths':{'tx':'/tx','address':'/address','token':'/token','block':'/block'}}] + # app features NEXT_PUBLIC_APP_INSTANCE=local NEXT_PUBLIC_APP_ENV=development diff --git a/configs/envs/.env.sepolia b/configs/envs/.env.sepolia index b54adc0775..ac5fc85463 100644 --- a/configs/envs/.env.sepolia +++ b/configs/envs/.env.sepolia @@ -35,7 +35,7 @@ NEXT_PUBLIC_NETWORK_ICON_DARK=https://raw.githubusercontent.com/blockscout/front NEXT_PUBLIC_OTHER_LINKS=[{'url':'https://sepolia.drpc.org?ref=559183','text':'Public RPC'}] ## footer NEXT_PUBLIC_FOOTER_LINKS=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/footer-links/sepolia.json -##views +## views NEXT_PUBLIC_VIEWS_NFT_MARKETPLACES=[{'name':'LooksRare','collection_url':'https://sepolia.looksrare.org/collections/{hash}','instance_url':'https://sepolia.looksrare.org/collections/{hash}/{id}','logo_url':'https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/nft-marketplace-logos/looks-rare.png'}] ## misc NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'Etherscan','baseUrl':'https://sepolia.etherscan.io/','paths':{'tx':'/tx','address':'/address','token':'/token','block':'/block'}},{'title':'Tenderly','baseUrl':'https://dashboard.tenderly.co','paths':{'tx':'/tx/sepolia'}}] From ddee04d17c15f6f694216efad8d499dd10fe766f Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Wed, 21 Feb 2024 15:16:50 -0500 Subject: [PATCH 4/5] Fix CSS class names --- theme/components/Modal.ts | 2 +- theme/global.ts | 4 ++-- theme/utils/getOutlinedFieldStyles.ts | 2 +- ui/shared/Tabs/AdaptiveTabsList.tsx | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/theme/components/Modal.ts b/theme/components/Modal.ts index d2e291f8d5..1978a897c5 100644 --- a/theme/components/Modal.ts +++ b/theme/components/Modal.ts @@ -21,7 +21,7 @@ const baseStyleDialog = defineStyle((props) => { const baseStyleDialogContainer = defineStyle({ '::-webkit-scrollbar': { display: 'none' }, - 'scrollbar-width': 'none', + scrollbarWidth: 'none', // '@supports (height: -webkit-fill-available)': { height: '-webkit-fill-available' }, }); diff --git a/theme/global.ts b/theme/global.ts index 5ddff6bcf7..65380d01fb 100644 --- a/theme/global.ts +++ b/theme/global.ts @@ -8,8 +8,8 @@ const global = (props: StyleFunctionProps) => ({ body: { bg: mode('white', 'black')(props), ...getDefaultTransitionProps(), - '-webkit-tap-highlight-color': 'transparent', - 'font-variant-ligatures': 'no-contextual', + WebkitTapHighlightColor: 'transparent', + fontVariantLigatures: 'no-contextual', }, mark: { bgColor: mode('green.100', 'green.800')(props), diff --git a/theme/utils/getOutlinedFieldStyles.ts b/theme/utils/getOutlinedFieldStyles.ts index cae5060e4e..e5c6f554d3 100644 --- a/theme/utils/getOutlinedFieldStyles.ts +++ b/theme/utils/getOutlinedFieldStyles.ts @@ -32,7 +32,7 @@ export default function getOutlinedFieldStyles(props: StyleFunctionProps) { }, ':-webkit-autofill': { // background color for disabled input which value was selected from browser autocomplete popup - '-webkit-box-shadow': `0 0 0px 1000px ${ mode('rgba(16, 17, 18, 0.08)', 'rgba(255, 255, 255, 0.08)')(props) } inset`, + WebkitBoxShadow: `0 0 0px 1000px ${ mode('rgba(16, 17, 18, 0.08)', 'rgba(255, 255, 255, 0.08)')(props) } inset`, }, }, _invalid: { diff --git a/ui/shared/Tabs/AdaptiveTabsList.tsx b/ui/shared/Tabs/AdaptiveTabsList.tsx index 5f5ff81f1f..fc93643ebc 100644 --- a/ui/shared/Tabs/AdaptiveTabsList.tsx +++ b/ui/shared/Tabs/AdaptiveTabsList.tsx @@ -51,13 +51,13 @@ const AdaptiveTabsList = (props: Props) => { overflowX={{ base: 'auto', lg: 'initial' }} overscrollBehaviorX="contain" css={{ - 'scroll-snap-type': 'x mandatory', + scrollSnapType: 'x mandatory', // hide scrollbar '&::-webkit-scrollbar': { /* Chromiums */ display: 'none', }, - '-ms-overflow-style': 'none', /* IE and Edge */ - 'scrollbar-width': 'none', /* Firefox */ + MsOverflowStyle: 'none', /* IE and Edge */ + scrollbarWidth: 'none', /* Firefox */ }} bgColor={ listBgColor } transitionProperty="top,box-shadow,background-color,color" From be9ddc25e526c7f1d9700a2afcc9466beb898669 Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Wed, 27 Mar 2024 16:06:03 -0400 Subject: [PATCH 5/5] Expose bitcoin finality --- types/api/block.ts | 2 ++ types/api/transaction.ts | 2 ++ ui/block/BlockDetails.tsx | 11 +++++++++++ ui/tx/details/TxInfo.tsx | 11 +++++++++++ 4 files changed, 26 insertions(+) diff --git a/types/api/block.ts b/types/api/block.ts index 1f2a508b08..3d72ccbbe9 100644 --- a/types/api/block.ts +++ b/types/api/block.ts @@ -36,6 +36,8 @@ export interface Block { bitcoin_merged_mining_merkle_proof?: string | null; hash_for_merged_mining?: string | null; minimum_gas_price?: string | null; + // HEMI FIELDS + btc_finality?: number; } export interface BlocksResponse { diff --git a/types/api/transaction.ts b/types/api/transaction.ts index 5d077cb634..c980a15929 100644 --- a/types/api/transaction.ts +++ b/types/api/transaction.ts @@ -79,6 +79,8 @@ export type Transaction = { zkevm_batch_number?: number; zkevm_status?: typeof ZKEVM_L2_TX_STATUSES[number]; zkevm_sequence_hash?: string; + // Hemi fields + btc_finality?: number; } export const ZKEVM_L2_TX_STATUSES = [ 'Confirmed by Sequencer', 'L1 Confirmed' ]; diff --git a/ui/block/BlockDetails.tsx b/ui/block/BlockDetails.tsx index 493c462122..89b7a9bb22 100644 --- a/ui/block/BlockDetails.tsx +++ b/ui/block/BlockDetails.tsx @@ -166,6 +166,17 @@ const BlockDetails = ({ query }: Props) => { > + { data.btc_finality && ( + + + { data.btc_finality } + + + ) } { ) } ) } + { data.btc_finality && ( + + + { data.btc_finality } + + + ) } { data.execution_node && (