├── .changeset ├── README.md ├── config.json ├── five-garlics-yell.md ├── friendly-beans-begin.md ├── loud-sloths-fold.md ├── lucky-lamps-remember.md ├── rich-tools-search.md ├── shy-goats-travel.md ├── spicy-lobsters-add.md ├── wild-deers-battle.md └── young-spies-eat.md ├── .dockerignore ├── .env.example ├── .env.test ├── .github ├── assets │ └── logo.svg ├── pull_request_template.md └── workflows │ ├── changesets.yml │ ├── ci.yml │ ├── deploy-production.yml │ ├── docker.yml │ ├── docker_dev.yml │ └── nextjs-bundle-analysis.yml ├── .gitignore ├── .npmrc ├── .nvmrc ├── .prettierrc.json ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── Dockerfile ├── LICENSE ├── README.md ├── apps ├── docs │ ├── .eslintrc.json │ ├── .gitignore │ ├── CHANGELOG.md │ ├── jsconfig.json │ ├── next.config.mjs │ ├── package.json │ ├── postcss.config.js │ ├── prettier.config.js │ ├── public │ │ ├── architecture-dark.svg │ │ ├── architecture-light.svg │ │ ├── blobscan-kurtosis.png │ │ ├── logo-dark.svg │ │ ├── logo-light.svg │ │ ├── logomark.svg │ │ └── swagger-ui.png │ ├── src │ │ ├── app │ │ │ ├── docs │ │ │ │ ├── api │ │ │ │ │ └── page.md │ │ │ │ ├── background-jobs │ │ │ │ │ └── page.md │ │ │ │ ├── clis │ │ │ │ │ └── page.md │ │ │ │ ├── code-of-conduct │ │ │ │ │ └── page.md │ │ │ │ ├── codebase-overview │ │ │ │ │ └── page.md │ │ │ │ ├── environment │ │ │ │ │ └── page.md │ │ │ │ ├── features │ │ │ │ │ └── page.md │ │ │ │ ├── funding │ │ │ │ │ └── page.md │ │ │ │ ├── how-to-contribute │ │ │ │ │ └── page.md │ │ │ │ ├── indexer │ │ │ │ │ └── page.md │ │ │ │ ├── installation │ │ │ │ │ └── page.md │ │ │ │ ├── metrics │ │ │ │ │ └── page.md │ │ │ │ ├── running-blobscan-k8s │ │ │ │ │ └── page.md │ │ │ │ ├── running-blobscan-kurtosis │ │ │ │ │ └── page.md │ │ │ │ ├── running-blobscan-locally │ │ │ │ │ └── page.md │ │ │ │ ├── storages │ │ │ │ │ └── page.md │ │ │ │ ├── testing │ │ │ │ │ └── page.md │ │ │ │ └── troubleshooting │ │ │ │ │ └── page.md │ │ │ ├── favicon.ico │ │ │ ├── layout.jsx │ │ │ ├── not-found.jsx │ │ │ ├── page.md │ │ │ └── providers.jsx │ │ ├── components │ │ │ ├── Button.jsx │ │ │ ├── Callout.jsx │ │ │ ├── DocsHeader.jsx │ │ │ ├── DocsLayout.jsx │ │ │ ├── Fence.jsx │ │ │ ├── Figure.jsx │ │ │ ├── Hero.jsx │ │ │ ├── HeroBackground.jsx │ │ │ ├── Icon.jsx │ │ │ ├── Layout.jsx │ │ │ ├── Logo.jsx │ │ │ ├── MobileNavigation.jsx │ │ │ ├── Navigation.jsx │ │ │ ├── PrevNextLinks.jsx │ │ │ ├── Prose.jsx │ │ │ ├── QuickLinks.jsx │ │ │ ├── Search.jsx │ │ │ ├── TableOfContents.jsx │ │ │ ├── ThemeSelector.jsx │ │ │ └── icons │ │ │ │ ├── InstallationIcon.jsx │ │ │ │ ├── LightbulbIcon.jsx │ │ │ │ ├── PluginsIcon.jsx │ │ │ │ ├── PresetsIcon.jsx │ │ │ │ ├── ThemingIcon.jsx │ │ │ │ └── WarningIcon.jsx │ │ ├── fonts │ │ │ ├── lexend.txt │ │ │ └── lexend.woff2 │ │ ├── hooks │ │ │ └── useIsMounted.js │ │ ├── images │ │ │ ├── blur-fuchsia.png │ │ │ └── blur-indigo.png │ │ ├── markdoc │ │ │ ├── nodes.js │ │ │ ├── search.mjs │ │ │ └── tags.js │ │ └── styles │ │ │ ├── prism.css │ │ │ └── tailwind.css │ ├── svgo.config.js │ └── tailwind.config.js ├── rest-api-server │ ├── CHANGELOG.md │ ├── package.json │ ├── public │ │ └── favicon.ico │ ├── scripts │ │ ├── init-bucket.ts │ │ └── postbuild.ts │ ├── src │ │ ├── banner.ts │ │ ├── bigint.ts │ │ ├── index.ts │ │ ├── instrumentation.ts │ │ ├── logger.ts │ │ ├── morgan.ts │ │ ├── openapi.ts │ │ ├── syncers.ts │ │ └── utils.ts │ └── tsconfig.json └── web │ ├── .gitignore │ ├── CHANGELOG.md │ ├── banner.mjs │ ├── next.config.mjs │ ├── package.json │ ├── postcss.config.cjs │ ├── public │ ├── favicon.ico │ ├── logo-dark.svg │ ├── logo-light.svg │ └── rollups │ │ ├── infinaeon.png │ │ ├── lambda.png │ │ ├── manta.png │ │ ├── orderly.png │ │ └── pandasea.png │ ├── sentry.client.config.ts │ ├── sentry.edge.config.ts │ ├── sentry.server.config.ts │ ├── src │ ├── api-client.ts │ ├── blob-decoder.worker.ts │ ├── components │ │ ├── AppLayout │ │ │ ├── AppLayout.tsx │ │ │ ├── BottomBarLayout │ │ │ │ └── index.tsx │ │ │ └── TopBarLayout │ │ │ │ ├── CompactTopBar.tsx │ │ │ │ ├── TopBar.tsx │ │ │ │ ├── TopBarSurface.tsx │ │ │ │ └── index.tsx │ │ ├── Badges │ │ │ ├── Badge.tsx │ │ │ ├── RollupBadge.tsx │ │ │ ├── StatusBadge.tsx │ │ │ └── StorageBadge.tsx │ │ ├── BlobViewer │ │ │ ├── ErrorMessage.tsx │ │ │ ├── Views │ │ │ │ ├── RawBlobView.tsx │ │ │ │ ├── StarknetBlobView.tsx │ │ │ │ └── index.ts │ │ │ └── index.tsx │ │ ├── BlobscanLogo.tsx │ │ ├── BlobscanSocialLinks.tsx │ │ ├── BlobscanVersionInfo.tsx │ │ ├── Button.tsx │ │ ├── Cards │ │ │ ├── Card.tsx │ │ │ ├── ChartCard.tsx │ │ │ ├── MetricCard.tsx │ │ │ └── SurfaceCards │ │ │ │ ├── BlobCard.tsx │ │ │ │ ├── BlobTransactionCard.tsx │ │ │ │ ├── BlockCard.tsx │ │ │ │ └── SurfaceCardBase.tsx │ │ ├── Centered.tsx │ │ ├── ChartSkeleton.tsx │ │ ├── Charts │ │ │ ├── ChartBase │ │ │ │ ├── Legend.tsx │ │ │ │ ├── helpers │ │ │ │ │ ├── colors.ts │ │ │ │ │ ├── formatters.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── toolbox.ts │ │ │ │ │ └── tooltip.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── DailyAvgBlobFeeChart.tsx │ │ │ ├── DailyAvgBlobGasPriceChart.tsx │ │ │ ├── DailyAvgMaxBlobGasFeeChart.tsx │ │ │ ├── DailyBlobFeeChart.tsx │ │ │ ├── DailyBlobGasComparisonChart.tsx │ │ │ ├── DailyBlobGasUsedChart.tsx │ │ │ ├── DailyBlobSizeChart.tsx │ │ │ ├── DailyBlobsChart.tsx │ │ │ ├── DailyBlocksChart.tsx │ │ │ ├── DailyTransactionsChart.tsx │ │ │ ├── DailyUniqueAddressesChart.tsx │ │ │ ├── helpers.ts │ │ │ └── index.ts │ │ ├── Collapsable.tsx │ │ ├── CopyToClipboard.tsx │ │ ├── Copyable.tsx │ │ ├── Displays │ │ │ ├── BlobGasUsageDisplay.tsx │ │ │ ├── EtherUnitDisplay.tsx │ │ │ └── StandardEtherUnitDisplay.tsx │ │ ├── Dropdown │ │ │ ├── Option.tsx │ │ │ └── index.tsx │ │ ├── EthIdenticon.tsx │ │ ├── ExpandableContent.tsx │ │ ├── ExplorerDetails.tsx │ │ ├── FeedbackWidget │ │ │ ├── Emoji.tsx │ │ │ ├── FeedbackCard.tsx │ │ │ └── FeedbackWidget.tsx │ │ ├── Field.tsx │ │ ├── Filters │ │ │ ├── BlockNumberFilter.tsx │ │ │ ├── RollupFilter.tsx │ │ │ ├── SlotFilter.tsx │ │ │ ├── SortToggle.tsx │ │ │ ├── TimestampFilter.tsx │ │ │ └── index.tsx │ │ ├── Header.tsx │ │ ├── Icon.tsx │ │ ├── IconButton.tsx │ │ ├── InfoField.tsx │ │ ├── InfoGrid.tsx │ │ ├── Inputs │ │ │ ├── Input.tsx │ │ │ ├── NumberInput.tsx │ │ │ └── NumberRangeInput.tsx │ │ ├── Layouts │ │ │ ├── DetailsLayout.tsx │ │ │ └── PaginatedListLayout.tsx │ │ ├── Link.tsx │ │ ├── NavArrows.tsx │ │ ├── NavigationMenus.tsx │ │ ├── OptimismCard.tsx │ │ ├── PaginatedTable │ │ │ └── index.tsx │ │ ├── Pagination.tsx │ │ ├── PercentageBar.tsx │ │ ├── Rotable.tsx │ │ ├── Scrollable.tsx │ │ ├── SearchInput │ │ │ ├── SearchResults.tsx │ │ │ └── index.tsx │ │ ├── SidePanel.tsx │ │ ├── SidebarNavigationMenu.tsx │ │ ├── Skeleton.tsx │ │ ├── SlidableList.tsx │ │ ├── Spinners │ │ │ ├── PageSpinner.tsx │ │ │ └── Spinner.tsx │ │ ├── Status.tsx │ │ ├── Table │ │ │ ├── TableCell.tsx │ │ │ ├── TableHeader.tsx │ │ │ ├── TableRow.tsx │ │ │ ├── index.tsx │ │ │ └── utils.ts │ │ ├── ThemeModeButton.tsx │ │ ├── TimestampToggle.tsx │ │ ├── Toggle.tsx │ │ └── Tooltip.tsx │ ├── content.tsx │ ├── declarations.d.ts │ ├── env.mjs │ ├── hooks │ │ ├── useAggregateOverallStats.ts │ │ ├── useBreakpoint.ts │ │ ├── useClickOutside.ts │ │ ├── useDebounce.ts │ │ ├── useHover.ts │ │ ├── useIsHomePage.ts │ │ ├── useIsMounted.ts │ │ ├── useOverflow.ts │ │ ├── useQueryParams.ts │ │ └── useScaledWeiAmounts.ts │ ├── icons │ │ ├── blob-storages │ │ │ ├── file-system.svg │ │ │ ├── google.svg │ │ │ ├── index.ts │ │ │ ├── postgres.svg │ │ │ ├── swarm.svg │ │ │ └── weavevm.svg │ │ ├── chat.svg │ │ ├── close.svg │ │ ├── copy.svg │ │ ├── discord.svg │ │ ├── empty-box.svg │ │ ├── ethereum.svg │ │ ├── gas.svg │ │ ├── github.svg │ │ ├── loading.svg │ │ ├── rollups │ │ │ ├── abstract.svg │ │ │ ├── aevo.svg │ │ │ ├── ancient8.svg │ │ │ ├── arbitrum.svg │ │ │ ├── arenaz.svg │ │ │ ├── base.svg │ │ │ ├── blast.svg │ │ │ ├── bob.svg │ │ │ ├── boba.svg │ │ │ ├── camp.svg │ │ │ ├── debank.svg │ │ │ ├── ethernity.svg │ │ │ ├── fraxtal.svg │ │ │ ├── fuel.svg │ │ │ ├── hashkey.svg │ │ │ ├── hemi.svg │ │ │ ├── hypr.svg │ │ │ ├── index.ts │ │ │ ├── ink.svg │ │ │ ├── karak.svg │ │ │ ├── kinto.svg │ │ │ ├── kroma.svg │ │ │ ├── linea.svg │ │ │ ├── lisk.svg │ │ │ ├── mantle.svg │ │ │ ├── metal.svg │ │ │ ├── metamail.svg │ │ │ ├── metis.svg │ │ │ ├── mint.svg │ │ │ ├── mode.svg │ │ │ ├── morph.svg │ │ │ ├── nal.svg │ │ │ ├── nanonnetwork.svg │ │ │ ├── opbnb.svg │ │ │ ├── optimism.svg │ │ │ ├── optopia.svg │ │ │ ├── paradex.svg │ │ │ ├── parallel.svg │ │ │ ├── pgn.svg │ │ │ ├── phala.svg │ │ │ ├── polynomial.svg │ │ │ ├── r0ar.svg │ │ │ ├── race.svg │ │ │ ├── rari.svg │ │ │ ├── river.svg │ │ │ ├── scroll.svg │ │ │ ├── shape.svg │ │ │ ├── snaxchain.svg │ │ │ ├── soneium.svg │ │ │ ├── starknet.svg │ │ │ ├── superlumio.jpg │ │ │ ├── superlumio.svg │ │ │ ├── superseed.svg │ │ │ ├── swanchain.svg │ │ │ ├── swellchain.svg │ │ │ ├── taiko.svg │ │ │ ├── thebinaryholdings.svg │ │ │ ├── unichain.svg │ │ │ ├── world.svg │ │ │ ├── xga.svg │ │ │ ├── zeronetwork.svg │ │ │ ├── zircuit.svg │ │ │ ├── zksync.svg │ │ │ └── zora.svg │ │ └── x.svg │ ├── instrumentation.node.ts │ ├── instrumentation.ts │ ├── pages │ │ ├── 404.tsx │ │ ├── 500.tsx │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ ├── _error.tsx │ │ ├── address │ │ │ └── [address].tsx │ │ ├── api │ │ │ ├── blob-data.ts │ │ │ ├── env │ │ │ │ └── index.ts │ │ │ ├── feedback │ │ │ │ ├── enabled.ts │ │ │ │ ├── index.ts │ │ │ │ └── rate-limit.ts │ │ │ ├── metrics.ts │ │ │ └── trpc │ │ │ │ └── [...trpc].ts │ │ ├── blob │ │ │ └── [hash].tsx │ │ ├── blobs.tsx │ │ ├── block │ │ │ └── [id].tsx │ │ ├── block_neighbor.tsx │ │ ├── blocks.tsx │ │ ├── index.tsx │ │ ├── search.tsx │ │ ├── stats.tsx │ │ ├── tx │ │ │ └── [hash].tsx │ │ └── txs.tsx │ ├── providers │ │ ├── BlobDecoderWorker.tsx │ │ └── Env.tsx │ ├── server │ │ ├── HttpError.ts │ │ └── default-responder.ts │ ├── styles │ │ └── globals.css │ ├── types │ │ ├── entities.ts │ │ ├── helpers.ts │ │ ├── index.ts │ │ └── styles.ts │ └── utils │ │ ├── arrays.ts │ │ ├── blob-decoders.tsx │ │ ├── bytes.ts │ │ ├── date.ts │ │ ├── index.ts │ │ ├── number.ts │ │ ├── routes.ts │ │ ├── search.ts │ │ ├── text.ts │ │ ├── transformers.ts │ │ ├── web3.ts │ │ └── zod-schemas.ts │ ├── svgo.config.js │ ├── tailwind.config.ts │ ├── tsconfig.json │ └── vercel.json ├── clis ├── blob-propagation-jobs-cli │ ├── CHANGELOG.md │ ├── package.json │ ├── setup.ts │ ├── src │ │ ├── Context.ts │ │ ├── commands │ │ │ ├── count.ts │ │ │ ├── create.ts │ │ │ ├── get.ts │ │ │ ├── index.ts │ │ │ ├── remove.ts │ │ │ └── retry.ts │ │ ├── context-instance.ts │ │ ├── graceful-shutdown.ts │ │ ├── index.ts │ │ ├── main.ts │ │ ├── runner.ts │ │ ├── types.ts │ │ └── utils │ │ │ ├── index.ts │ │ │ ├── jobs.ts │ │ │ ├── options-defs.ts │ │ │ └── queues.ts │ ├── test │ │ ├── commands │ │ │ ├── count.test.ts │ │ │ ├── create.test.ts │ │ │ ├── remove.test.ts │ │ │ └── retry.test.ts │ │ ├── helpers.ts │ │ └── main.test.ts │ ├── tsconfig.json │ └── vitest.config.ts └── stats-aggregation-cli │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ ├── commands │ │ ├── daily.ts │ │ ├── index.ts │ │ └── overall.ts │ ├── error.ts │ ├── graceful-shutdown.ts │ ├── index.ts │ ├── main.ts │ ├── runner.ts │ ├── types.ts │ └── utils.ts │ ├── test │ ├── commands │ │ ├── __snapshots__ │ │ │ ├── daily.test.ts.snap │ │ │ └── overall.test.ts.snap │ │ ├── daily.test.ts │ │ └── overall.test.ts │ ├── helpers.ts │ └── main.test.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── docker-compose.api.yml ├── docker-compose.local.yml ├── docker-compose.prod.yml ├── docker-compose.yml ├── docker-entrypoint.sh ├── funding.json ├── package.json ├── packages ├── api │ ├── CHANGELOG.md │ ├── enums.ts │ ├── package.json │ ├── src │ │ ├── app-router.ts │ │ ├── blob-parse │ │ │ ├── optimism.ts │ │ │ └── parse-decoded-fields.ts │ │ ├── context.ts │ │ ├── graceful-shutdown.ts │ │ ├── index.ts │ │ ├── instrumentation.ts │ │ ├── middlewares │ │ │ ├── withAuthed.ts │ │ │ ├── withDate.ts │ │ │ ├── withExpands.ts │ │ │ ├── withFilters.ts │ │ │ ├── withPagination.ts │ │ │ ├── withStatFilters.ts │ │ │ ├── withTelemetry.ts │ │ │ └── withTimeFrame.ts │ │ ├── procedures │ │ │ ├── authed.ts │ │ │ ├── index.ts │ │ │ └── public.ts │ │ ├── routers │ │ │ ├── blob-storages-state │ │ │ │ ├── getState.ts │ │ │ │ └── index.ts │ │ │ ├── blob │ │ │ │ ├── createWeaveVMReferences.ts │ │ │ │ ├── getAll.ts │ │ │ │ ├── getBlobDataByBlobId.ts │ │ │ │ ├── getByBlobId.ts │ │ │ │ ├── getCount.ts │ │ │ │ ├── helpers.ts │ │ │ │ └── index.ts │ │ │ ├── block │ │ │ │ ├── checkBlobExists.ts │ │ │ │ ├── getAll.ts │ │ │ │ ├── getByBlockId.ts │ │ │ │ ├── getBySlot.ts │ │ │ │ ├── getCount.ts │ │ │ │ ├── getGasPrice.ts │ │ │ │ ├── helpers.ts │ │ │ │ └── index.ts │ │ │ ├── blockchain-sync-state │ │ │ │ ├── common.ts │ │ │ │ ├── getState.ts │ │ │ │ ├── index.ts │ │ │ │ └── updateState.ts │ │ │ ├── indexer │ │ │ │ ├── handleReorg.ts │ │ │ │ ├── helpers.ts │ │ │ │ ├── index.ts │ │ │ │ ├── indexData.ts │ │ │ │ └── indexData.utils.ts │ │ │ ├── search │ │ │ │ ├── byTerm.ts │ │ │ │ ├── byTerm.utils.ts │ │ │ │ └── index.ts │ │ │ ├── stats │ │ │ │ ├── getBlobDailyStats.ts │ │ │ │ ├── getBlobOverallStats.ts │ │ │ │ ├── getBlockDailyStats.ts │ │ │ │ ├── getBlockOverallStats.ts │ │ │ │ ├── getDailyStats.ts │ │ │ │ ├── getOverallStats.ts │ │ │ │ ├── getTransactionDailyStats.ts │ │ │ │ ├── getTransactionOverallStats.ts │ │ │ │ ├── helpers.ts │ │ │ │ └── index.ts │ │ │ └── tx │ │ │ │ ├── getAll.ts │ │ │ │ ├── getByHash.ts │ │ │ │ ├── getCount.ts │ │ │ │ ├── getNextTxFromSender.ts │ │ │ │ ├── helpers.ts │ │ │ │ └── index.ts │ │ ├── trpc-client.ts │ │ ├── types.ts │ │ ├── utils │ │ │ ├── auth.ts │ │ │ ├── blob.ts │ │ │ ├── count.ts │ │ │ ├── identifiers.ts │ │ │ ├── index.ts │ │ │ ├── normalizer.ts │ │ │ └── transformers.ts │ │ └── zod-schemas.ts │ ├── test │ │ ├── __snapshots__ │ │ │ ├── blob.test.ts.snap │ │ │ ├── block.test.ts.snap │ │ │ ├── blockchain-sync-state.test.ts.snap │ │ │ ├── indexer.test.ts.snap │ │ │ ├── stats.test.ts.snap │ │ │ ├── sync-state.test.ts.snap │ │ │ └── tx.test.ts.snap │ │ ├── blob.test.ts │ │ ├── block.test.ts │ │ ├── blockchain-sync-state.test.ts │ │ ├── helpers.ts │ │ ├── indexer.test.fixtures.ts │ │ ├── indexer.test.ts │ │ ├── search.test.ts │ │ ├── stats.test.ts │ │ ├── test-suites │ │ │ ├── filters.ts │ │ │ └── schemas.ts │ │ └── tx.test.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── auth │ ├── CHANGELOG.md │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── auth-options.ts │ │ └── get-session.ts │ └── tsconfig.json ├── blob-decoder │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── blob-decoder.ts │ │ ├── index.ts │ │ ├── starknet.ts │ │ ├── types.ts │ │ └── utils.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── blob-propagator │ ├── CHANGELOG.md │ ├── package.json │ ├── setup.ts │ ├── src │ │ ├── BlobPropagator.ts │ │ ├── blob-propagator.ts │ │ ├── constants.ts │ │ ├── errors.ts │ │ ├── index.ts │ │ ├── logger.ts │ │ ├── types.ts │ │ ├── utils.ts │ │ └── worker-processors │ │ │ ├── file-system.ts │ │ │ ├── finalizer.ts │ │ │ ├── gcs.ts │ │ │ ├── index.ts │ │ │ ├── postgres.ts │ │ │ └── swarm.ts │ ├── test │ │ ├── BlobPropagator.test.ts │ │ ├── __snapshots__ │ │ │ ├── BlobPropagator.test.ts.snap │ │ │ └── storage-workers.test.ts.snap │ │ ├── finalizer-worker.test.ts │ │ └── storage-workers.test.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── blob-storage-manager │ ├── CHANGELOG.md │ ├── package.json │ ├── setup.ts │ ├── src │ │ ├── BlobStorage.ts │ │ ├── BlobStorageManager.ts │ │ ├── blob-storage-manager.ts │ │ ├── errors.ts │ │ ├── index.ts │ │ ├── instrumentation.ts │ │ ├── storages │ │ │ ├── FileSystemStorage.ts │ │ │ ├── GoogleStorage.ts │ │ │ ├── PostgresStorage.ts │ │ │ ├── SwarmStorage.ts │ │ │ ├── WeaveVMStorage.ts │ │ │ └── index.ts │ │ ├── types.ts │ │ └── utils │ │ │ ├── blob.ts │ │ │ ├── file.ts │ │ │ ├── index.ts │ │ │ └── storage.ts │ ├── test │ │ ├── BlobStorageManager.test.ts │ │ ├── __snapshots__ │ │ │ └── BlobStorageManager.test.ts.snap │ │ ├── fixtures.ts │ │ └── storages │ │ │ ├── FileSystemStorage.test.ts │ │ │ ├── GoogleStorage.test.ts │ │ │ ├── PostgresStorage.test.ts │ │ │ ├── SwarmStorage.test.ts │ │ │ ├── WeaveVMStorage.test.ts │ │ │ └── __snapshots__ │ │ │ ├── FileSystemStorage.test.ts.snap │ │ │ ├── GoogleStorage.test.ts.snap │ │ │ ├── PostgresStorage.test.ts.snap │ │ │ ├── SwarmStorage.test.ts.snap │ │ │ └── WeaveVMStorage.test.ts.snap │ ├── tsconfig.json │ └── vitest.config.ts ├── dates │ ├── index.ts │ ├── package.json │ ├── test │ │ └── dates.test.ts │ └── tsconfig.json ├── dayjs │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── date.ts │ │ ├── dayjs.ts │ │ └── index.ts │ └── tsconfig.json ├── db │ ├── CHANGELOG.md │ ├── index.ts │ ├── package.json │ ├── prisma │ │ ├── __mocks__ │ │ │ └── client.ts │ │ ├── client.ts │ │ ├── enum-generator.ts │ │ ├── errors.ts │ │ ├── extensions │ │ │ ├── base.ts │ │ │ ├── index.ts │ │ │ └── stats.ts │ │ ├── index.ts │ │ ├── instrumentation.ts │ │ ├── migrations │ │ │ ├── 000000000000_squashed_migrations │ │ │ │ └── migration.sql │ │ │ ├── 20230825155918_rename_to_snake_case │ │ │ │ └── migration.sql │ │ │ ├── 20230826145917_add_optional_block_blob_gas_price │ │ │ │ └── migration.sql │ │ │ ├── 20230826150027_populate_block_blob_gas_price │ │ │ │ └── migration.sql │ │ │ ├── 20230826151340_make_block_blob_gas_price_mandatory │ │ │ │ └── migration.sql │ │ │ ├── 20230826151503_remove_redundant_blob_gas_price_field │ │ │ │ └── migration.sql │ │ │ ├── 20230829223419_add_blob_gas_stats │ │ │ │ └── migration.sql │ │ │ ├── 20230901124803_reduce_blob_gas_fields_size_range │ │ │ │ └── migration.sql │ │ │ ├── 20230921144012_increase_block_overall_stats_column_sizes │ │ │ │ └── migration.sql │ │ │ ├── 20231026015458_increase_blob_gas_and_fee_fields_sizes │ │ │ │ └── migration.sql │ │ │ ├── 20240124192815_add_tx_block_hash_field │ │ │ │ └── migration.sql │ │ │ ├── 20240124192831_populate_tx_block_hash_field │ │ │ │ └── migration.sql │ │ │ ├── 20240124195700_use_tx_block_hash_field_as_fk │ │ │ │ └── migration.sql │ │ │ ├── 20240124195745_make_block_number_not_unique │ │ │ │ └── migration.sql │ │ │ ├── 20240125063335_create_transaction_fork_model │ │ │ │ └── migration.sql │ │ │ ├── 20240205111948_add_lower_upper_synced_slot_fields │ │ │ │ └── migration.sql │ │ │ ├── 20240220162510_make_last_finalized_block_optional │ │ │ │ └── migration.sql │ │ │ ├── 20240227163708_add_last_aggregated_block │ │ │ │ └── migration.sql │ │ │ ├── 20240305163042_add_blob_kzg_proof_field │ │ │ │ └── migration.sql │ │ │ ├── 20240308202114_make_blob_kzg_proof_non_unique_field │ │ │ │ └── migration.sql │ │ │ ├── 20240312232109_add_rollup_field_to_transaction │ │ │ │ └── migration.sql │ │ │ ├── 20240313011715_retroactively_update_transaction_rows_rollup_field │ │ │ │ └── migration.sql │ │ │ ├── 20240314010855_add_mode_and_zora_rollups │ │ │ │ └── migration.sql │ │ │ ├── 20240327194701_add_linea_rollup │ │ │ │ └── migration.sql │ │ │ ├── 20240328215615_add_paradex_rollup │ │ │ │ └── migration.sql │ │ │ ├── 20240328215617_retroactively_update_transaction_rows_rollup_field │ │ │ │ └── migration.sql │ │ │ ├── 20240330000407_add_file_system_blob_storage │ │ │ │ └── migration.sql │ │ │ ├── 20240402162128_add_blob_storages_state_model │ │ │ │ └── migration.sql │ │ │ ├── 20240429231108_add_boba_camp_kroma_metal_and_pgn_rollups │ │ │ │ └── migration.sql │ │ │ ├── 20240429231111_retroactively_update_transaction_rows_rollup_field │ │ │ │ └── migration.sql │ │ │ ├── 20240507231111_retroactively_update_transaction_rows_rollup_field │ │ │ │ └── migration.sql │ │ │ ├── 20240528231623_add_taiko_optopia_and_blast │ │ │ │ └── migration.sql │ │ │ ├── 20240528232122_retroactively_update_transaction_rows_rollup_field │ │ │ │ └── migration.sql │ │ │ ├── 20240613112056_add_updated_at_field │ │ │ │ └── migration.sql │ │ │ ├── 20240614123512_drop_avg_blob_size_field_from_stats_models │ │ │ │ └── migration.sql │ │ │ ├── 20240620101534_add_block_number_index │ │ │ │ └── migration.sql │ │ │ ├── 20240701101507_add_block_columns_for_filtering_and_sorting │ │ │ │ └── migration.sql │ │ │ ├── 20240701101523_populate_block_columns │ │ │ │ └── migration.sql │ │ │ ├── 20240701143445_make_tx_table_block_columns_mandatory │ │ │ │ └── migration.sql │ │ │ ├── 20240703140556_add_block_columns_to_blobs_on_transactions │ │ │ │ └── migration.sql │ │ │ ├── 20240703140614_populate_blobs_on_transactions_block_columns │ │ │ │ └── migration.sql │ │ │ ├── 20240703141043_make_blobs_on_transactions_block_columns_mandatory │ │ │ │ └── migration.sql │ │ │ ├── 20240706111927_add_tx_index │ │ │ │ └── migration.sql │ │ │ ├── 20240716151437_make_blob_proof_field_mandatory │ │ │ │ └── migration.sql │ │ │ ├── 20240716152934_create_blob_proof_index │ │ │ │ └── migration.sql │ │ │ ├── 20240905002219_add_category_enum │ │ │ │ └── migration.sql │ │ │ ├── 20240905002640_backfill_transaction_category_field │ │ │ │ └── migration.sql │ │ │ ├── 20240905115040_rollback_blobs_on_transactions_category_field │ │ │ │ └── migration.sql │ │ │ ├── 20240905133000_add_category_index │ │ │ │ └── migration.sql │ │ │ ├── 20240905145158_add_category_and_rollup_fields_to_stats_models │ │ │ │ └── migration.sql │ │ │ ├── 20240905151204_set_default_value_to_stats_columns │ │ │ │ └── migration.sql │ │ │ ├── 20240909234614_remove_redundant_block_number_index │ │ │ │ └── migration.sql │ │ │ ├── 20240909234808_add_rollup_index │ │ │ │ └── migration.sql │ │ │ ├── 20240910000321_add_tx_sender_receiver_indexes │ │ │ │ └── migration.sql │ │ │ ├── 20240910013656_add_tx_blob_gas_used │ │ │ │ └── migration.sql │ │ │ ├── 20240910013741_backfill_tx_blob_gas_used │ │ │ │ └── migration.sql │ │ │ ├── 20240910015119_make_tx_blob_gas_used_field_mandatory │ │ │ │ └── migration.sql │ │ │ ├── 20240911230119_add_blob_max_fee_columns │ │ │ │ └── migration.sql │ │ │ ├── 20240914120014_add_total_blob_gas_price_columns │ │ │ │ └── migration.sql │ │ │ ├── 20240916233354_create_address_history_model │ │ │ │ └── migration.sql │ │ │ ├── 20240916233526_backfill_address_history_table │ │ │ │ └── migration.sql │ │ │ ├── 20240916234354_drop_first_block_number_columns │ │ │ │ └── migration.sql │ │ │ ├── 20240925230913_add_tx_index_to_blobs_on_transactions_model │ │ │ │ └── migration.sql │ │ │ ├── 20240925232017_backfill_tx_index_column │ │ │ │ └── migration.sql │ │ │ ├── 20240925232521_make_blobs_on_transactions_tx_index_mandatory │ │ │ │ └── migration.sql │ │ │ ├── 20240926003524_include_tx_index_on_blobs_on_transactions_model_indexes │ │ │ │ └── migration.sql │ │ │ ├── 20240928161343_swap_transaction_fork_composite_index_columns │ │ │ │ └── migration.sql │ │ │ ├── 20240929151029_update_tx_indexes │ │ │ │ └── migration.sql │ │ │ ├── 20241001234634_rename_address_history_model │ │ │ │ └── migration.sql │ │ │ ├── 20241002001044_make_category_column_optional │ │ │ │ └── migration.sql │ │ │ ├── 20241003152321_decoded_fields │ │ │ │ └── migration.sql │ │ │ ├── 20241112080416_create_overall_stats_model │ │ │ │ └── migration.sql │ │ │ ├── 20241113013509_create_daily_stats_model │ │ │ │ └── migration.sql │ │ │ ├── 20241119092259_add_address_category_info_fks │ │ │ │ └── migration.sql │ │ │ ├── 20241120051254_add_block_number_reference_indexes │ │ │ │ └── migration.sql │ │ │ ├── 20241202121757_drop_block_tx_blob_stats_models │ │ │ │ └── migration.sql │ │ │ ├── 20250109000907_add_weavevm_enum │ │ │ │ └── migration.sql │ │ │ ├── 20250213150233_add_last_synced_block_fields │ │ │ │ └── migration.sql │ │ │ ├── 20250224000845_add_new_rollup_enums │ │ │ │ └── migration.sql │ │ │ ├── 20250302114844_add_rollup_to_address_model │ │ │ │ └── migration.sql │ │ │ ├── 20250303171226_backfill_address_rollup_field │ │ │ │ └── migration.sql │ │ │ ├── 20250304001028_remove_rollup_from_tx_model │ │ │ │ └── migration.sql │ │ │ ├── 20250304012045_drop_tx_model_category_field │ │ │ │ └── migration.sql │ │ │ ├── 20250305180541_add_first_block_number_fields_to_address_model │ │ │ │ └── migration.sql │ │ │ ├── 20250305180606_backfill_first_block_number_fields │ │ │ │ └── migration.sql │ │ │ ├── 20250305223834_drop_address_category_info_model │ │ │ │ └── migration.sql │ │ │ ├── 20250309165444_add_eth_usd_price │ │ │ │ └── migration.sql │ │ │ ├── 20250324110813_make_timestamp_unique │ │ │ │ └── migration.sql │ │ │ ├── 20250328122843_add_eth_usd_price_feed_state_model │ │ │ │ └── migration.sql │ │ │ ├── 20250530154626_drop_eth_usd_price_feed_state_model │ │ │ │ └── migration.sql │ │ │ └── migration_lock.toml │ │ ├── schema.prisma │ │ ├── seed │ │ │ ├── DataGenerator.ts │ │ │ ├── main.ts │ │ │ ├── params.ts │ │ │ ├── utils.ts │ │ │ └── web3.ts │ │ ├── sql │ │ │ ├── aggregateBlobDailyStats.sql │ │ │ ├── aggregateBlobOverallStats.sql │ │ │ ├── aggregateTxDailyStats.sql │ │ │ └── aggregateTxOverallStats.sql │ │ ├── types.ts │ │ └── zod-utils.ts │ ├── test │ │ ├── __snapshots__ │ │ │ ├── base-extension.test.ts.snap │ │ │ └── tx-stats.test.ts.snap │ │ ├── base-extension.test.ts │ │ ├── stats-extension.fixtures.ts │ │ ├── stats-extension.test.ts │ │ └── stats-extension.utils.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── env │ ├── CHANGELOG.md │ ├── index.ts │ ├── package.json │ ├── tsconfig.json │ └── vitest.config.ts ├── eth-format │ ├── CHANGELOG.md │ ├── index.ts │ ├── package.json │ ├── test │ │ └── eth-units.test.ts │ └── tsconfig.json ├── logger │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ └── index.ts │ └── tsconfig.json ├── network-blob-config │ ├── index.ts │ ├── package.json │ └── tsconfig.json ├── open-telemetry │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── index.ts │ │ └── sdk.ts │ └── tsconfig.json ├── optimism-decoder │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── db.ts │ │ ├── decoder.ts │ │ ├── download.ts │ │ ├── generate-import-csv.ts │ │ ├── helpers.ts │ │ ├── index.ts │ │ ├── load-decoded-data-to-db.ts │ │ ├── reader.ts │ │ └── utils.ts │ └── tsconfig.json ├── price-feed │ ├── package.json │ ├── src │ │ ├── PriceFeed.ts │ │ ├── abi │ │ │ ├── AggregatorV3.ts │ │ │ └── EACAggregatorProxy.ts │ │ ├── index.ts │ │ └── utils.ts │ ├── test │ │ ├── PriceFeed.test.ts │ │ └── __snapshots__ │ │ │ ├── PriceFeed.test.ts.snap │ │ │ └── PriceFeedFinder.test.ts.snap │ ├── tsconfig.json │ └── vitest.config.ts ├── rollups │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── index.ts │ │ └── styles.ts │ ├── test │ │ └── rollups.test.ts │ └── tsconfig.json ├── syncers │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── BaseSyncer.ts │ │ ├── errors.ts │ │ ├── index.ts │ │ ├── syncers │ │ │ ├── DailyStatsSyncer.ts │ │ │ ├── ETHPriceSyncer.ts │ │ │ ├── OverallStatsSyncer.ts │ │ │ ├── SwarmStampSyncer.ts │ │ │ └── index.ts │ │ └── utils.ts │ ├── test │ │ ├── BaseSyncer.test.ts │ │ ├── DailyStatsSyncer.test.fixtures.ts │ │ ├── DailyStatsSyncer.test.ts │ │ ├── DailyStatsSyncer.test.utils.ts │ │ ├── EthPriceSyncer.test.ts │ │ ├── OverallStatsSyncer.test.ts │ │ ├── SwarmStampSyncer.test.ts │ │ ├── __snapshots__ │ │ │ ├── BaseSyncer.test.ts.snap │ │ │ ├── DailyStatsSyncer.test.ts.snap │ │ │ ├── PeriodicUpdater.test.ts.snap │ │ │ ├── StatsSyncer.test.ts.snap │ │ │ ├── SwarmStampSyncer.test.ts.snap │ │ │ └── SyncerManager.test.ts.snap │ │ └── helpers.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── test │ ├── package.json │ ├── src │ │ ├── fixtures │ │ │ ├── gcs │ │ │ │ └── blobscan-test-bucket │ │ │ │ │ └── 1 │ │ │ │ │ └── ob │ │ │ │ │ └── Ha │ │ │ │ │ └── sh │ │ │ │ │ ├── obHash001.txt │ │ │ │ │ ├── obHash002.txt │ │ │ │ │ ├── obHash003.txt │ │ │ │ │ └── obHash004.txt │ │ │ ├── index.ts │ │ │ └── postgres │ │ │ │ └── data.json │ │ ├── helpers.ts │ │ ├── index.ts │ │ ├── polyfill.ts │ │ ├── services │ │ │ ├── anvil.ts │ │ │ ├── prisma.ts │ │ │ └── viem.ts │ │ ├── setup.ts │ │ └── unit-tests.ts │ └── tsconfig.json └── zod │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ ├── create-env.ts │ ├── index.ts │ └── schemas.ts │ └── tsconfig.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── renovate.json ├── scripts ├── ci │ └── deploy_vercel_env.sh ├── github │ └── download_bundle_analyzer_artifact.sh ├── run-integration.sh ├── setenv.sh └── wait-for-it.sh ├── tooling ├── eslint │ ├── base.js │ ├── nextjs.js │ ├── package.json │ └── react.js ├── github │ ├── package.json │ ├── setup-db │ │ └── action.yml │ └── setup │ │ └── action.yml ├── svgo │ ├── base.js │ └── package.json ├── tailwind │ ├── colors.ts │ ├── index.ts │ ├── package.json │ └── postcss.js └── typescript │ ├── base.json │ ├── base.production.json │ └── package.json ├── turbo.json ├── vitest.config.ts ├── vitest.shared.ts ├── vitest.workspace.ts └── wasms └── majin-blob-wasm ├── majin_blob_wasm.d.ts ├── majin_blob_wasm.js ├── majin_blob_wasm_bg.js ├── majin_blob_wasm_bg.wasm ├── majin_blob_wasm_bg.wasm.d.ts └── package.json /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", 3 | "changelog": [ 4 | "@changesets/changelog-github", 5 | { "repo": "Blobscan/blobscan" } 6 | ], 7 | "commit": false, 8 | "fixed": [], 9 | "linked": [], 10 | "access": "restricted", 11 | "baseBranch": "main", 12 | "updateInternalDependencies": "patch", 13 | "privatePackages": { "version": true, "tag": false }, 14 | "ignore": [ 15 | "@blobscan/eslint-config", 16 | "@blobscan/github", 17 | "@blobscan/svgo-config", 18 | "@blobscan/tailwind-config", 19 | "@blobscan/test", 20 | "@blobscan/tsconfig" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /.changeset/five-garlics-yell.md: -------------------------------------------------------------------------------- 1 | --- 2 | "@blobscan/syncers": minor 3 | --- 4 | 5 | Updated eth usd price syncer to only index latest ETH price and removed any backfilling logic 6 | -------------------------------------------------------------------------------- /.changeset/friendly-beans-begin.md: -------------------------------------------------------------------------------- 1 | --- 2 | "@blobscan/web": minor 3 | --- 4 | 5 | Added rollup filter dropdown to allow filtering stats and metrics by specific rollups 6 | -------------------------------------------------------------------------------- /.changeset/loud-sloths-fold.md: -------------------------------------------------------------------------------- 1 | --- 2 | "@blobscan/price-feed": minor 3 | --- 4 | 5 | Added support for retrieving eth price by round ID 6 | -------------------------------------------------------------------------------- /.changeset/lucky-lamps-remember.md: -------------------------------------------------------------------------------- 1 | --- 2 | "@blobscan/api": minor 3 | --- 4 | 5 | Introduced `category` and `rollup` query parameters to daily and overall stats procedures for filtering stats and metrics 6 | -------------------------------------------------------------------------------- /.changeset/rich-tools-search.md: -------------------------------------------------------------------------------- 1 | --- 2 | "@blobscan/network-blob-config": minor 3 | --- 4 | 5 | Added Pectra's blob base fee update fraction constant 6 | -------------------------------------------------------------------------------- /.changeset/shy-goats-travel.md: -------------------------------------------------------------------------------- 1 | --- 2 | "@blobscan/web": minor 3 | --- 4 | 5 | Enhanced stats page to display rollup-specific stats and metrics 6 | -------------------------------------------------------------------------------- /.changeset/spicy-lobsters-add.md: -------------------------------------------------------------------------------- 1 | --- 2 | "@blobscan/api": minor 3 | --- 4 | 5 | Updates overall stats procedures to to return a set of overall stats elements instead of a single item. 6 | -------------------------------------------------------------------------------- /.changeset/wild-deers-battle.md: -------------------------------------------------------------------------------- 1 | --- 2 | "@blobscan/web": minor 3 | --- 4 | 5 | Added legend to chart to enable toggling visibility of individual series 6 | -------------------------------------------------------------------------------- /.changeset/young-spies-eat.md: -------------------------------------------------------------------------------- 1 | --- 2 | "@blobscan/db": minor 3 | --- 4 | 5 | Dropped `EthUsdPriceFeedState` model 6 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | Dockerfile 2 | docker-compose*.yml 3 | README.md 4 | LICENSE 5 | node_modules 6 | .changeset 7 | .env* 8 | .env.example 9 | .git* 10 | .next 11 | .vscode 12 | out 13 | backups 14 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ### Checklist 2 | 3 | - [ ] My change requires a documentation update, and I have done it. 4 | - [ ] I have added tests to cover my changes. 5 | - [ ] I have filled out the description and linked the related issues. 6 | 7 | ### Description 8 | 9 | 10 | #### Motivation and Context (Optional) 11 | 12 | 13 | ### Related Issue (Optional) 14 | 15 | 16 | ### Screenshots (if appropriate): 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules 5 | .pnp 6 | .pnp.js 7 | 8 | # testing 9 | coverage 10 | 11 | # database 12 | **/prisma/db.sqlite 13 | **/prisma/db.sqlite-journal 14 | 15 | # Prisma generated files 16 | packages/db/prisma/enums 17 | packages/db/prisma/zod 18 | 19 | # next.js 20 | .next/ 21 | out/ 22 | next-env.d.ts 23 | 24 | # expo 25 | .expo/ 26 | dist/ 27 | 28 | # production 29 | build 30 | 31 | # misc 32 | .DS_Store 33 | *.pem 34 | cloud-sql-proxy 35 | 36 | # debug 37 | npm-debug.log* 38 | yarn-debug.log* 39 | yarn-error.log* 40 | .pnpm-debug.log* 41 | 42 | # local env files 43 | .env 44 | .env*.local 45 | 46 | # vercel 47 | .vercel 48 | 49 | # typescript 50 | *.tsbuildinfo 51 | 52 | # turbo 53 | .turbo 54 | 55 | # Sentry config file 56 | .sentryclirc 57 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | # Expo doesn't play nice with pnpm by default. 2 | # The symbolic links of pnpm break the rules of Expo monorepos. 3 | # @link https://docs.expo.dev/guides/monorepos/#common-issues 4 | node-linker=hoisted 5 | 6 | # In order to cache Prisma correctly 7 | public-hoist-pattern[]=*prisma* 8 | 9 | # FIXME: @prisma/client is required by the @blobscan/auth, 10 | # but we don't want it installed there since it's already 11 | # installed in the @blobscan/db package 12 | strict-peer-dependencies=false 13 | 14 | # Prevent pnpm from adding the "workspace:"" prefix to local 15 | # packages as it casues issues with manypkg 16 | # @link https://pnpm.io/npmrc#prefer-workspace-packages 17 | save-workspace-protocol=false 18 | prefer-workspace-packages=true -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 22 2 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "@ianvs/prettier-plugin-sort-imports", 4 | "prettier-plugin-tailwindcss" 5 | ], 6 | "tailwindConfig": "./tooling/tailwind", 7 | "importOrder": [ 8 | "^(react/(.*)$)|^(react$)|^(react-native(.*)$)", 9 | "^(next/(.*)$)|^(next$)", 10 | "^(expo(.*)$)|^(expo$)", 11 | "", 12 | "", 13 | "^@blobscan/(.*)$", 14 | "", 15 | "^~/utils/(.*)$", 16 | "^~/components/(.*)$", 17 | "^~/styles/(.*)$", 18 | "^~/(.*)$", 19 | "^[./]" 20 | ], 21 | "importOrderParserPlugins": ["typescript", "jsx", "decorators-legacy"], 22 | "importOrderTypeScriptVersion": "4.4.0" 23 | } 24 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "bradlc.vscode-tailwindcss", 4 | "dbaeumer.vscode-eslint", 5 | "esbenp.prettier-vscode", 6 | "Prisma.prisma", 7 | "yoavbls.pretty-ts-errors" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[prisma]": { "editor.defaultFormatter": "Prisma.prisma" }, 3 | "editor.codeActionsOnSave": { 4 | "source.fixAll.eslint": "explicit" 5 | }, 6 | "editor.defaultFormatter": "esbenp.prettier-vscode", 7 | "editor.formatOnSave": true, 8 | "eslint.rules.customizations": [{ "rule": "*", "severity": "warn" }], 9 | "eslint.workingDirectories": [ 10 | { "pattern": "apps/*/" }, 11 | { "pattern": "packages/*/" }, 12 | { "pattern": "cli/*/" }, 13 | { "pattern": "tooling/*/" } 14 | ], 15 | "tailwindCSS.experimental.configFile": "./tooling/tailwind/index.ts", 16 | "tailwindCSS.experimental.classRegex": [ 17 | ["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"] 18 | ], 19 | "typescript.enablePromptUseWorkspaceTsdk": true, 20 | "typescript.tsdk": "node_modules/typescript/lib" 21 | } 22 | -------------------------------------------------------------------------------- /apps/docs/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /apps/docs/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | 30 | # vercel 31 | .vercel 32 | 33 | # typescript 34 | *.tsbuildinfo 35 | next-env.d.ts 36 | -------------------------------------------------------------------------------- /apps/docs/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./src/*"] 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/docs/next.config.mjs: -------------------------------------------------------------------------------- 1 | import withSearch from './src/markdoc/search.mjs' 2 | import withMarkdoc from '@markdoc/next.js' 3 | 4 | /** @type {import('next').NextConfig} */ 5 | const nextConfig = { 6 | reactStrictMode: true, 7 | pageExtensions: ['js', 'jsx', 'md'], 8 | /** We already do linting and typechecking as separate tasks in CI */ 9 | eslint: { ignoreDuringBuilds: !!process.env.CI }, 10 | typescript: { ignoreBuildErrors: !!process.env.CI }, 11 | } 12 | 13 | export default withSearch( 14 | withMarkdoc({ schemaPath: './src/markdoc' })(nextConfig) 15 | ) 16 | -------------------------------------------------------------------------------- /apps/docs/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = require('@blobscan/tailwind-config/postcss') 2 | -------------------------------------------------------------------------------- /apps/docs/prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | singleQuote: true, 3 | semi: false, 4 | plugins: [require('prettier-plugin-tailwindcss')], 5 | } 6 | -------------------------------------------------------------------------------- /apps/docs/public/blobscan-kurtosis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blobscan/blobscan/120d170e6efeba77c28254ec70730f96814babd7/apps/docs/public/blobscan-kurtosis.png -------------------------------------------------------------------------------- /apps/docs/public/logomark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/docs/public/swagger-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blobscan/blobscan/120d170e6efeba77c28254ec70730f96814babd7/apps/docs/public/swagger-ui.png -------------------------------------------------------------------------------- /apps/docs/src/app/docs/api/page.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: API 3 | nextjs: 4 | metadata: 5 | title: API 6 | description: Blobscan API 7 | --- 8 | 9 | Blobscan provides `api.blobscan.com`, a REST API that you can use to retrieve blobs, blocks and transactions metrics and use them in your own dashboards. 10 | 11 | This API provides also some endpoints that are used internally by the [Indexer](indexer). For security, these endpoints 12 | are protected with a shared secret that is used for digitally signing JSON Web Tokens (JWT). 13 | This is what the `SECRET_KEY` environment variable is for. 14 | 15 | {% callout title="Swagger UI" %} 16 | [Explore the API documentation.](https://api.blobscan.com/) 17 | {% /callout %} 18 | -------------------------------------------------------------------------------- /apps/docs/src/app/docs/background-jobs/page.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Background jobs 3 | nextjs: 4 | metadata: 5 | title: Background jobs 6 | description: Blobscan background jobs 7 | --- 8 | 9 | Blobscan requires [BullMQ](https://bullmq.io/) to run the following tasks in the background: 10 | 11 | - `DailyStatsSyncer` - calculates metrics for the blobs, block and transactions charts. 12 | - `OverallStatsSyncer` - calculates other metrics such as Total Tx Fees Saved, Total Blocks and Total Blobs. 13 | - `SwarmStampSyncer` - updates TTL for Ethereum Swarm batches. 14 | 15 | For more information, check out the [@blobscan/syncers](https://github.com/Blobscan/blobscan/tree/main/packages/syncers/src/syncers) package. 16 | 17 | The BullMQ queue is also used to upload blobs in parallel to different Storages. 18 | -------------------------------------------------------------------------------- /apps/docs/src/app/docs/storages/page.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Available storages 3 | nextjs: 4 | metadata: 5 | title: Available storages 6 | description: Supported storages for blobs 7 | --- 8 | 9 | ## Blob storages 10 | 11 | Blobscan can be configured to use any of the following blob storages: 12 | 13 | - [Ethereum Swarm](https://www.ethswarm.org/) 14 | - File system 15 | - [Load Network (prev. WeaveVM)](https://www.load.network) (currently supports blob reading only) 16 | - Google Cloud Storage 17 | - PostgreSQL 18 | 19 | By default all storages are disabled and you must enable at least one in order to run Blobscan. This is done using [environment variables](/docs/environment). 20 | 21 | Note that the database size can grow quickly. For this reason, it is not recommended to choose PostgreSQL in production. 22 | -------------------------------------------------------------------------------- /apps/docs/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blobscan/blobscan/120d170e6efeba77c28254ec70730f96814babd7/apps/docs/src/app/favicon.ico -------------------------------------------------------------------------------- /apps/docs/src/app/providers.jsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { ThemeProvider } from 'next-themes' 4 | 5 | export function Providers({ children }) { 6 | return ( 7 | 8 | {children} 9 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /apps/docs/src/components/Button.jsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import clsx from 'clsx' 3 | 4 | const styles = { 5 | primary: 6 | 'rounded-full bg-primary-300 py-2 px-4 text-sm font-semibold text-slate-900 hover:bg-primary-200 focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-300/50 active:bg-primary-500', 7 | secondary: 8 | 'rounded-full bg-slate-800 py-2 px-4 text-sm font-medium text-white hover:bg-slate-700 focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white/50 active:text-slate-400', 9 | } 10 | 11 | export function Button({ variant = 'primary', className, href, ...props }) { 12 | className = clsx(styles[variant], className) 13 | 14 | return href ? ( 15 | 16 | ) : ( 17 |