├── .circleci
└── config.yml
├── .credo.exs
├── .dialyzer-ignore
├── .dockerignore
├── .formatter.exs
├── .github
├── dependabot.yml
└── workflows
│ ├── codeql-analysis.yml
│ ├── config.yml
│ ├── publish-deploy-testing.yml
│ ├── publish-docker-image-every-push.yml
│ ├── publish-docker-image-for-core.yml
│ ├── publish-docker-image-for-eth-goerli.yml
│ ├── publish-docker-image-for-eth.yml
│ ├── publish-docker-image-for-l2-staging.yml
│ ├── publish-docker-image-for-lukso.yml
│ ├── publish-docker-image-for-optimism.yml
│ ├── publish-docker-image-for-rsk.yml
│ ├── publish-docker-image-for-xdai.yml
│ └── publish-docker-image-release.yml
├── .gitignore
├── .pairs
├── .tool-versions
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── ISSUE_TEMPLATE.md
├── LICENSE
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── apps
├── block_scout_web
│ ├── .sobelow-conf
│ ├── API blueprint.md
│ ├── API.md
│ ├── README.md
│ ├── assets
│ │ ├── .babelrc
│ │ ├── .eslintrc
│ │ ├── README.md
│ │ ├── __mocks__
│ │ │ └── css
│ │ │ │ └── app.scss.js
│ │ ├── __tests__
│ │ │ ├── lib
│ │ │ │ ├── async_listing_load.js
│ │ │ │ ├── autocomplete.js
│ │ │ │ ├── currency.js
│ │ │ │ ├── smart_contract
│ │ │ │ │ └── common_helpers.js
│ │ │ │ └── utils.js
│ │ │ └── pages
│ │ │ │ ├── address.js
│ │ │ │ ├── address
│ │ │ │ ├── internal_transactions.js
│ │ │ │ ├── transactions.js
│ │ │ │ └── validations.js
│ │ │ │ ├── blocks.js
│ │ │ │ ├── chain.js
│ │ │ │ ├── pending_transactions.js
│ │ │ │ ├── transaction.js
│ │ │ │ └── transactions.js
│ │ ├── close.svg
│ │ ├── css
│ │ │ ├── _code.scss
│ │ │ ├── _elements.scss
│ │ │ ├── _helpers.scss
│ │ │ ├── _layout.scss
│ │ │ ├── _mixins.scss
│ │ │ ├── _typography.scss
│ │ │ ├── app.scss
│ │ │ ├── components
│ │ │ │ ├── _account.scss
│ │ │ │ ├── _ad.scss
│ │ │ │ ├── _address-overview.scss
│ │ │ │ ├── _address_link.scss
│ │ │ │ ├── _alerts.scss
│ │ │ │ ├── _animations.scss
│ │ │ │ ├── _api.scss
│ │ │ │ ├── _badge.scss
│ │ │ │ ├── _btn_add_to_mm.scss
│ │ │ │ ├── _btn_address_card.scss
│ │ │ │ ├── _btn_contract.scss
│ │ │ │ ├── _btn_copy.scss
│ │ │ │ ├── _btn_dropdown_line.scss
│ │ │ │ ├── _btn_full.scss
│ │ │ │ ├── _btn_line.scss
│ │ │ │ ├── _btn_no_border.scss
│ │ │ │ ├── _btn_qr.scss
│ │ │ │ ├── _btn_swap.scss
│ │ │ │ ├── _btn_wallet.scss
│ │ │ │ ├── _button.scss
│ │ │ │ ├── _card.scss
│ │ │ │ ├── _check.scss
│ │ │ │ ├── _check_tooltip.scss
│ │ │ │ ├── _coin-balance-tile.scss
│ │ │ │ ├── _custom_tooltips.scss
│ │ │ │ ├── _dashboard-banner.scss
│ │ │ │ ├── _description-list.scss
│ │ │ │ ├── _dot.scss
│ │ │ │ ├── _dropdown.scss
│ │ │ │ ├── _dropzone.scss
│ │ │ │ ├── _erc721_token_image_container.scss
│ │ │ │ ├── _errors.scss
│ │ │ │ ├── _external_link.scss
│ │ │ │ ├── _filter.scss
│ │ │ │ ├── _fontawesome_icon.scss
│ │ │ │ ├── _footer.scss
│ │ │ │ ├── _form.scss
│ │ │ │ ├── _highlight.scss
│ │ │ │ ├── _i_tooltip.scss
│ │ │ │ ├── _i_tooltip_2.scss
│ │ │ │ ├── _icon-link.scss
│ │ │ │ ├── _inventory_token_instance_image_container.scss
│ │ │ │ ├── _label.scss
│ │ │ │ ├── _loading-spinner.scss
│ │ │ │ ├── _log-search.scss
│ │ │ │ ├── _me_tooltip.scss
│ │ │ │ ├── _modal.scss
│ │ │ │ ├── _modal_stake.scss
│ │ │ │ ├── _modal_status.scss
│ │ │ │ ├── _modal_variables.scss
│ │ │ │ ├── _nav_tabs.scss
│ │ │ │ ├── _navbar.scss
│ │ │ │ ├── _new_smart_contract.scss
│ │ │ │ ├── _nounderline-link.scss
│ │ │ │ ├── _pagination_container.scss
│ │ │ │ ├── _panels.scss
│ │ │ │ ├── _qr-code.scss
│ │ │ │ ├── _radio.scss
│ │ │ │ ├── _radio_big.scss
│ │ │ │ ├── _search.scss
│ │ │ │ ├── _stakes_table.scss
│ │ │ │ ├── _stakes_variables.scss
│ │ │ │ ├── _table.scss
│ │ │ │ ├── _tile.scss
│ │ │ │ ├── _token-balance-dropdown.scss
│ │ │ │ ├── _token.scss
│ │ │ │ ├── _token_tile_view_more.scss
│ │ │ │ ├── _tooltip.scss
│ │ │ │ ├── _transaction-input.scss
│ │ │ │ ├── _transaction.scss
│ │ │ │ ├── _verify_other_explorers.scss
│ │ │ │ └── datepicker.scss
│ │ │ ├── custom-scrollbar.scss
│ │ │ ├── export-csv.scss
│ │ │ ├── export-vars-to-js.module.scss
│ │ │ ├── main-page.scss
│ │ │ ├── non-critical.scss
│ │ │ └── theme
│ │ │ │ ├── _base_variables.scss
│ │ │ │ ├── _callisto_variables.scss
│ │ │ │ ├── _dai_variables-non-critical.scss
│ │ │ │ ├── _dai_variables.scss
│ │ │ │ ├── _dark-theme.scss
│ │ │ │ ├── _ellaism_variables.scss
│ │ │ │ ├── _ether1_variables-non-critical.scss
│ │ │ │ ├── _ether1_variables.scss
│ │ │ │ ├── _ethercore_variables-non-critical.scss
│ │ │ │ ├── _ethercore_variables.scss
│ │ │ │ ├── _ethereum_classic_variables-non-critical.scss
│ │ │ │ ├── _ethereum_classic_variables.scss
│ │ │ │ ├── _ethereum_variables-non-critical.scss
│ │ │ │ ├── _ethereum_variables.scss
│ │ │ │ ├── _expanse_variables.scss
│ │ │ │ ├── _fonts.scss
│ │ │ │ ├── _gochain_variables.scss
│ │ │ │ ├── _goerli_variables-non-critical.scss
│ │ │ │ ├── _goerli_variables.scss
│ │ │ │ ├── _kovan_variables-non-critical.scss
│ │ │ │ ├── _kovan_variables.scss
│ │ │ │ ├── _lukso_variables-non-critical.scss
│ │ │ │ ├── _lukso_variables.scss
│ │ │ │ ├── _musicoin_variables.scss
│ │ │ │ ├── _neutral_variables-non-critical.scss
│ │ │ │ ├── _neutral_variables.scss
│ │ │ │ ├── _pirl_variables.scss
│ │ │ │ ├── _poa_variables-non-critical.scss
│ │ │ │ ├── _poa_variables.scss
│ │ │ │ ├── _rinkeby_variables-non-critical.scss
│ │ │ │ ├── _rinkeby_variables.scss
│ │ │ │ ├── _ropsten_variables-non-critical.scss
│ │ │ │ ├── _ropsten_variables.scss
│ │ │ │ ├── _rsk_variables-non-critical.scss
│ │ │ │ ├── _rsk_variables.scss
│ │ │ │ ├── _social_variables.scss
│ │ │ │ ├── _sokol_variables-non-critical.scss
│ │ │ │ ├── _sokol_variables.scss
│ │ │ │ ├── _tobalaba_variables.scss
│ │ │ │ ├── _tomochain_variables.scss
│ │ │ │ ├── _variables-non-critical.scss
│ │ │ │ ├── _variables.scss
│ │ │ │ ├── _wanchain_variables.scss
│ │ │ │ ├── _xusdt_variables-non-critical.scss
│ │ │ │ ├── _xusdt_variables.scss
│ │ │ │ └── custom_contracts
│ │ │ │ ├── _circles-theme.scss
│ │ │ │ └── _dark-forest-theme.scss
│ │ ├── js
│ │ │ ├── app.js
│ │ │ ├── app_extra.js
│ │ │ ├── balance-chart-loader.js
│ │ │ ├── chart-loader.js
│ │ │ ├── lib
│ │ │ │ ├── ace
│ │ │ │ │ └── src-min
│ │ │ │ │ │ ├── ace.js
│ │ │ │ │ │ ├── mode-csharp.js
│ │ │ │ │ │ └── theme-chrome.js
│ │ │ │ ├── ad.js
│ │ │ │ ├── add_chain_to_mm.js
│ │ │ │ ├── analytics.js
│ │ │ │ ├── async_listing_load.js
│ │ │ │ ├── autocomplete.js
│ │ │ │ ├── banner.js
│ │ │ │ ├── card_tabs.js
│ │ │ │ ├── clipboard_buttons.js
│ │ │ │ ├── coin_balance_history_chart.js
│ │ │ │ ├── csv_download.js
│ │ │ │ ├── currency.js
│ │ │ │ ├── custom_ad.json
│ │ │ │ ├── custom_scrollbar.js
│ │ │ │ ├── dark_mode.js
│ │ │ │ ├── dropzone.js
│ │ │ │ ├── from_now.js
│ │ │ │ ├── history_chart.js
│ │ │ │ ├── indexing.js
│ │ │ │ ├── infinite_scroll_helpers.js
│ │ │ │ ├── list_morph.js
│ │ │ │ ├── loading_element.js
│ │ │ │ ├── modals.js
│ │ │ │ ├── path_helper.js
│ │ │ │ ├── pending_transactions_toggle.js
│ │ │ │ ├── pretty_json.js
│ │ │ │ ├── public_tags_request_form.js
│ │ │ │ ├── queue.js
│ │ │ │ ├── random_access_pagination.js
│ │ │ │ ├── redux_helpers.js
│ │ │ │ ├── reload_button.js
│ │ │ │ ├── smart_contract
│ │ │ │ │ ├── common_helpers.js
│ │ │ │ │ ├── connect.js
│ │ │ │ │ ├── functions.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── interact.js
│ │ │ │ │ └── wei_ether_converter.js
│ │ │ │ ├── stop_propagation.js
│ │ │ │ ├── text_ad.js
│ │ │ │ ├── token_balance_dropdown.js
│ │ │ │ ├── token_balance_dropdown_search.js
│ │ │ │ ├── token_icon.js
│ │ │ │ ├── token_transfers_toggle.js
│ │ │ │ ├── tooltip.js
│ │ │ │ ├── transaction_input_dropdown.js
│ │ │ │ ├── try_api.js
│ │ │ │ ├── try_eth_api.js
│ │ │ │ ├── utils.js
│ │ │ │ └── validation.js
│ │ │ ├── locale.js
│ │ │ ├── pages
│ │ │ │ ├── account
│ │ │ │ │ └── delete_item_handler.js
│ │ │ │ ├── address.js
│ │ │ │ ├── address
│ │ │ │ │ ├── coin_balances.js
│ │ │ │ │ ├── internal_transactions.js
│ │ │ │ │ ├── logs.js
│ │ │ │ │ ├── token_transfers.js
│ │ │ │ │ ├── transactions.js
│ │ │ │ │ ├── utils.js
│ │ │ │ │ └── validations.js
│ │ │ │ ├── admin
│ │ │ │ │ └── tasks.js
│ │ │ │ ├── blocks.js
│ │ │ │ ├── chain.js
│ │ │ │ ├── dark-mode-switcher.js
│ │ │ │ ├── layout.js
│ │ │ │ ├── pending_transactions.js
│ │ │ │ ├── search-results
│ │ │ │ │ └── search.js
│ │ │ │ ├── sol2uml.js
│ │ │ │ ├── token
│ │ │ │ │ ├── overview.js
│ │ │ │ │ ├── search.js
│ │ │ │ │ └── token_transfers.js
│ │ │ │ ├── token_contract.js
│ │ │ │ ├── token_counters.js
│ │ │ │ ├── transaction.js
│ │ │ │ ├── transactions.js
│ │ │ │ ├── verification_form.js
│ │ │ │ └── verified_contracts.js
│ │ │ ├── socket.js
│ │ │ └── view_specific
│ │ │ │ ├── address_contract
│ │ │ │ └── code_highlighting.js
│ │ │ │ └── raw_trace
│ │ │ │ └── code_highlighting.js
│ │ ├── package-lock.json
│ │ ├── package.json
│ │ ├── postcss.config.js
│ │ ├── static
│ │ │ ├── 503.html
│ │ │ ├── android-chrome-192x192.png
│ │ │ ├── android-chrome-512x512.png
│ │ │ ├── apple-touch-icon.png
│ │ │ ├── browserconfig.xml
│ │ │ ├── images
│ │ │ │ ├── average_time.svg
│ │ │ │ ├── block.svg
│ │ │ │ ├── blocks.svg
│ │ │ │ ├── blockscout_logo.svg
│ │ │ │ ├── callisto_logo.svg
│ │ │ │ ├── classic_ethereum_logo.svg
│ │ │ │ ├── classic_logo.svg
│ │ │ │ ├── controller.svg
│ │ │ │ ├── cube.svg
│ │ │ │ ├── custom-themes
│ │ │ │ │ ├── circles
│ │ │ │ │ │ ├── balance.svg
│ │ │ │ │ │ ├── copy-circles.svg
│ │ │ │ │ │ ├── footer_logo.svg
│ │ │ │ │ │ ├── logo.svg
│ │ │ │ │ │ └── qr-circles.svg
│ │ │ │ │ └── dark-forest
│ │ │ │ │ │ ├── copy-df.svg
│ │ │ │ │ │ ├── dark_forest_logo.svg
│ │ │ │ │ │ ├── pic_balance.svg
│ │ │ │ │ │ ├── planet.svg
│ │ │ │ │ │ ├── qr-df.svg
│ │ │ │ │ │ └── union.svg
│ │ │ │ ├── dai_logo.svg
│ │ │ │ ├── ellaism_logo.svg
│ │ │ │ ├── errors-img
│ │ │ │ │ ├── etc-block-not-found.png
│ │ │ │ │ ├── etc-block-not-found@2x.png
│ │ │ │ │ ├── etc-page-not-found.png
│ │ │ │ │ ├── etc-page-not-found@2x.png
│ │ │ │ │ ├── etc-tx-not-found.png
│ │ │ │ │ ├── etc-tx-not-found@2x.png
│ │ │ │ │ ├── eth-block-not-found.png
│ │ │ │ │ ├── eth-block-not-found@2x.png
│ │ │ │ │ ├── eth-page-not-found.png
│ │ │ │ │ ├── eth-page-not-found@2x.png
│ │ │ │ │ ├── eth-tx-not-found.png
│ │ │ │ │ ├── eth-tx-not-found@2x.png
│ │ │ │ │ ├── goerli-block-not-found.png
│ │ │ │ │ ├── goerli-block-not-found@2x.png
│ │ │ │ │ ├── goerli-page-not-found.png
│ │ │ │ │ ├── goerli-page-not-found@2x.png
│ │ │ │ │ ├── goerli-tx-not-found.png
│ │ │ │ │ ├── goerli-tx-not-found@2x.png
│ │ │ │ │ ├── internal-server-error.svg
│ │ │ │ │ ├── koan-block-not-found@2x.png
│ │ │ │ │ ├── kovan-block-not-found.png
│ │ │ │ │ ├── kovan-block-not-found@2x.png
│ │ │ │ │ ├── kovan-page-not-found.png
│ │ │ │ │ ├── kovan-page-not-found@2x.png
│ │ │ │ │ ├── kovan-tx-not-found.png
│ │ │ │ │ ├── kovan-tx-not-found@2x.png
│ │ │ │ │ ├── lukso-block-not-found.png
│ │ │ │ │ ├── lukso-block-not-found@2x.png
│ │ │ │ │ ├── lukso-page-not-found.png
│ │ │ │ │ ├── lukso-page-not-found@2x.png
│ │ │ │ │ ├── lukso-tx-not-found.png
│ │ │ │ │ ├── lukso-tx-not-found@2x.png
│ │ │ │ │ ├── page-not-found.svg
│ │ │ │ │ ├── pic-404.svg
│ │ │ │ │ ├── poa-block-not-found.png
│ │ │ │ │ ├── poa-block-not-found@2x.png
│ │ │ │ │ ├── poa-page-not-found.png
│ │ │ │ │ ├── poa-page-not-found@2x.png
│ │ │ │ │ ├── poa-tx-not-found.png
│ │ │ │ │ ├── poa-tx-not-found@2x.png
│ │ │ │ │ ├── rinkeby-block-not-found.png
│ │ │ │ │ ├── rinkeby-block-not-found@2x.png
│ │ │ │ │ ├── rinkeby-page-not-found.png
│ │ │ │ │ ├── rinkeby-page-not-found@2x.png
│ │ │ │ │ ├── rinkeby-tx-not-found.png
│ │ │ │ │ ├── rinkeby-tx-not-found@2x.png
│ │ │ │ │ ├── rinnkeby-block-not-found.png
│ │ │ │ │ ├── rinnkeby-block-not-found@2x.png
│ │ │ │ │ ├── ropsten-block-not-found.png
│ │ │ │ │ ├── ropsten-block-not-found@2x.png
│ │ │ │ │ ├── ropsten-page-not-found.png
│ │ │ │ │ ├── ropsten-page-not-found@2x.png
│ │ │ │ │ ├── ropsten-tx-not-found.png
│ │ │ │ │ ├── ropsten-tx-not-found@2x.png
│ │ │ │ │ ├── rsk-block-not-found.png
│ │ │ │ │ ├── rsk-block-not-found@2x.png
│ │ │ │ │ ├── rsk-page-not-found.png
│ │ │ │ │ ├── rsk-page-not-found@2x.png
│ │ │ │ │ ├── rsk-tx-not-found.png
│ │ │ │ │ ├── rsk-tx-not-found@2x.png
│ │ │ │ │ ├── sokol-block-not-found.png
│ │ │ │ │ ├── sokol-block-not-found@2x.png
│ │ │ │ │ ├── sokol-page-not-found.png
│ │ │ │ │ ├── sokol-page-not-found@2x.png
│ │ │ │ │ ├── sokol-tx-not-found.png
│ │ │ │ │ ├── sokol-tx-not-found@2x.png
│ │ │ │ │ ├── tx-not-found.svg
│ │ │ │ │ ├── unprocessable-entity.svg
│ │ │ │ │ ├── xdai-block-not-found.png
│ │ │ │ │ ├── xdai-block-not-found@2x.png
│ │ │ │ │ ├── xdai-page-not-found.png
│ │ │ │ │ ├── xdai-page-not-found@2x.png
│ │ │ │ │ ├── xdai-tx-not-found.png
│ │ │ │ │ └── xdai-tx-not-found@2x.png
│ │ │ │ ├── eth.png
│ │ │ │ ├── ether1_logo.svg
│ │ │ │ ├── ethercore_logo.svg
│ │ │ │ ├── ethercore_testnet_logo.svg
│ │ │ │ ├── ethereum.png
│ │ │ │ ├── ethereum_logo.svg
│ │ │ │ ├── expanse_logo.png
│ │ │ │ ├── favicon-16x16.png
│ │ │ │ ├── favicon-32x32.png
│ │ │ │ ├── favicon.ico
│ │ │ │ ├── gc_logo_2.svg
│ │ │ │ ├── gc_logo_old.svg
│ │ │ │ ├── gc_logo_rebrand.svg
│ │ │ │ ├── gochain_logo.png
│ │ │ │ ├── goerli_logo.svg
│ │ │ │ ├── icons
│ │ │ │ │ ├── blockchair.png
│ │ │ │ │ ├── blockchair@2x.png
│ │ │ │ │ ├── check-1.svg
│ │ │ │ │ ├── copy.svg
│ │ │ │ │ ├── dots.svg
│ │ │ │ │ ├── etherchain.png
│ │ │ │ │ ├── etherchain@2x.png
│ │ │ │ │ ├── etherscan.png
│ │ │ │ │ ├── etherscan@2x.png
│ │ │ │ │ ├── fontawesome
│ │ │ │ │ │ ├── bar-chart.svg
│ │ │ │ │ │ ├── github.svg
│ │ │ │ │ │ ├── info-circle.svg
│ │ │ │ │ │ ├── tag.svg
│ │ │ │ │ │ ├── telegram.svg
│ │ │ │ │ │ └── twitter.svg
│ │ │ │ │ ├── link.svg
│ │ │ │ │ ├── metamask-fox.svg
│ │ │ │ │ ├── pic-empty.svg
│ │ │ │ │ ├── plus.svg
│ │ │ │ │ ├── remove.svg
│ │ │ │ │ ├── swap
│ │ │ │ │ │ ├── 1inch.svg
│ │ │ │ │ │ ├── component.png
│ │ │ │ │ │ ├── cowswap.png
│ │ │ │ │ │ ├── curve.svg
│ │ │ │ │ │ ├── honeyswap.png
│ │ │ │ │ │ ├── sushi.svg
│ │ │ │ │ │ └── swapr.svg
│ │ │ │ │ ├── token_icon_default.svg
│ │ │ │ │ └── withdraw.svg
│ │ │ │ ├── kovan_logo.svg
│ │ │ │ ├── last_block.svg
│ │ │ │ ├── logo.png
│ │ │ │ ├── logo.svg
│ │ │ │ ├── logo_black.png
│ │ │ │ ├── lukso_dashboard_image.png
│ │ │ │ ├── lukso_logo.png
│ │ │ │ ├── lukso_logo_footer.png
│ │ │ │ ├── musicoin_logo.svg
│ │ │ │ ├── network-selector-icons
│ │ │ │ │ ├── callisto-mainnet.svg
│ │ │ │ │ ├── circle-xusdt.svg
│ │ │ │ │ ├── ethereum-classic.svg
│ │ │ │ │ ├── ethereum-mainnet.svg
│ │ │ │ │ ├── goerli-testnet.svg
│ │ │ │ │ ├── kovan-testnet.svg
│ │ │ │ │ ├── lukso-l14-testnet.svg
│ │ │ │ │ ├── poa-core.svg
│ │ │ │ │ ├── poa-sokol.svg
│ │ │ │ │ ├── rinkeby-testnet.svg
│ │ │ │ │ ├── ropsten-testnet.svg
│ │ │ │ │ ├── rsk-mainnet.svg
│ │ │ │ │ └── xdai-chain.svg
│ │ │ │ ├── pirl_logo.svg
│ │ │ │ ├── poa_logo.svg
│ │ │ │ ├── purple-block.svg
│ │ │ │ ├── rinkeby_logo.svg
│ │ │ │ ├── ropsten_logo.svg
│ │ │ │ ├── rsk_logo.svg
│ │ │ │ ├── smart_contract.svg
│ │ │ │ ├── social_logo.svg
│ │ │ │ ├── sokol_logo.svg
│ │ │ │ ├── spinner.svg
│ │ │ │ ├── tobalaba_logo.svg
│ │ │ │ ├── token.svg
│ │ │ │ ├── tomochain_logo.svg
│ │ │ │ ├── transaction.svg
│ │ │ │ ├── transactions.svg
│ │ │ │ ├── wanchain_logo.png
│ │ │ │ ├── xdai_alternative.svg
│ │ │ │ ├── xdai_logo.svg
│ │ │ │ ├── xusdt-logo-footer.svg
│ │ │ │ └── xusdt-logo-top.svg
│ │ │ ├── manifest.webmanifest
│ │ │ ├── mstile-150x150.png
│ │ │ ├── robots.txt
│ │ │ └── safari-pinned-tab.svg
│ │ └── webpack.config.js
│ ├── config
│ │ ├── config.exs
│ │ ├── dev.exs
│ │ ├── prod.exs
│ │ ├── runtime
│ │ │ └── test.exs
│ │ └── test.exs
│ ├── lib
│ │ ├── block_scout_web.ex
│ │ ├── block_scout_web
│ │ │ ├── admin_router.ex
│ │ │ ├── api_key_v2_router.ex
│ │ │ ├── api_router.ex
│ │ │ ├── api_v2.ex
│ │ │ ├── application.ex
│ │ │ ├── captcha_helper.ex
│ │ │ ├── chain.ex
│ │ │ ├── channels
│ │ │ │ ├── address_channel.ex
│ │ │ │ ├── block_channel.ex
│ │ │ │ ├── exchange_rate_channel.ex
│ │ │ │ ├── reward_channel.ex
│ │ │ │ ├── token_channel.ex
│ │ │ │ ├── transaction_channel.ex
│ │ │ │ ├── user_socket.ex
│ │ │ │ └── user_socket_v2.ex
│ │ │ ├── checksum_address.ex
│ │ │ ├── cldr.ex
│ │ │ ├── controller.ex
│ │ │ ├── controllers
│ │ │ │ ├── account
│ │ │ │ │ ├── api
│ │ │ │ │ │ └── v1
│ │ │ │ │ │ │ ├── authenticate_controller.ex
│ │ │ │ │ │ │ ├── email_controller.ex
│ │ │ │ │ │ │ ├── fallback_controller.ex
│ │ │ │ │ │ │ ├── tags_controller.ex
│ │ │ │ │ │ │ └── user_controller.ex
│ │ │ │ │ ├── api_key_controller.ex
│ │ │ │ │ ├── auth_controller.ex
│ │ │ │ │ ├── custom_abi_controller.ex
│ │ │ │ │ ├── public_tags_request_controller.ex
│ │ │ │ │ ├── tag_address_controller.ex
│ │ │ │ │ ├── tag_transaction_controller.ex
│ │ │ │ │ ├── watchlist_address_controller.ex
│ │ │ │ │ └── watchlist_controller.ex
│ │ │ │ ├── address_coin_balance_by_day_controller.ex
│ │ │ │ ├── address_coin_balance_controller.ex
│ │ │ │ ├── address_contract_controller.ex
│ │ │ │ ├── address_contract_verification_controller.ex
│ │ │ │ ├── address_contract_verification_via_flattened_code_controller.ex
│ │ │ │ ├── address_contract_verification_via_json_controller.ex
│ │ │ │ ├── address_contract_verification_via_multi_part_files_controller.ex
│ │ │ │ ├── address_contract_verification_via_standard_json_input_controller.ex
│ │ │ │ ├── address_contract_verification_vyper_controller.ex
│ │ │ │ ├── address_controller.ex
│ │ │ │ ├── address_decompiled_contract_controller.ex
│ │ │ │ ├── address_internal_transaction_controller.ex
│ │ │ │ ├── address_logs_controller.ex
│ │ │ │ ├── address_read_contract_controller.ex
│ │ │ │ ├── address_read_proxy_controller.ex
│ │ │ │ ├── address_token_balance_controller.ex
│ │ │ │ ├── address_token_controller.ex
│ │ │ │ ├── address_token_transfer_controller.ex
│ │ │ │ ├── address_transaction_controller.ex
│ │ │ │ ├── address_validation_controller.ex
│ │ │ │ ├── address_withdrawal_controller.ex
│ │ │ │ ├── address_write_contract_controller.ex
│ │ │ │ ├── address_write_proxy_controller.ex
│ │ │ │ ├── admin
│ │ │ │ │ ├── dashboard_controller.ex
│ │ │ │ │ ├── session_controller.ex
│ │ │ │ │ ├── setup_controller.ex
│ │ │ │ │ └── tasks_controller.ex
│ │ │ │ ├── api
│ │ │ │ │ ├── api_logger.ex
│ │ │ │ │ ├── eth_rpc
│ │ │ │ │ │ └── eth_controller.ex
│ │ │ │ │ ├── rpc
│ │ │ │ │ │ ├── address_controller.ex
│ │ │ │ │ │ ├── block_controller.ex
│ │ │ │ │ │ ├── contract_controller.ex
│ │ │ │ │ │ ├── helper.ex
│ │ │ │ │ │ ├── logs_controller.ex
│ │ │ │ │ │ ├── rpc_translator.ex
│ │ │ │ │ │ ├── stats_controller.ex
│ │ │ │ │ │ ├── token_controller.ex
│ │ │ │ │ │ └── transaction_controller.ex
│ │ │ │ │ ├── v1
│ │ │ │ │ │ ├── decompiled_smart_contract_controller.ex
│ │ │ │ │ │ ├── gas_price_oracle_controller.ex
│ │ │ │ │ │ ├── health_controller.ex
│ │ │ │ │ │ ├── supply_controller.ex
│ │ │ │ │ │ └── verified_smart_contract_controller.ex
│ │ │ │ │ └── v2
│ │ │ │ │ │ ├── address_controller.ex
│ │ │ │ │ │ ├── api_key_controller.ex
│ │ │ │ │ │ ├── block_controller.ex
│ │ │ │ │ │ ├── config_controller.ex
│ │ │ │ │ │ ├── fallback_controller.ex
│ │ │ │ │ │ ├── import_controller.ex
│ │ │ │ │ │ ├── main_page_controller.ex
│ │ │ │ │ │ ├── search_controller.ex
│ │ │ │ │ │ ├── smart_contract_controller.ex
│ │ │ │ │ │ ├── stats_controller.ex
│ │ │ │ │ │ ├── token_controller.ex
│ │ │ │ │ │ ├── transaction_controller.ex
│ │ │ │ │ │ ├── verification_controller.ex
│ │ │ │ │ │ └── withdrawal_controller.ex
│ │ │ │ ├── api_docs_controller.ex
│ │ │ │ ├── block_controller.ex
│ │ │ │ ├── block_transaction_controller.ex
│ │ │ │ ├── block_withdrawal_controller.ex
│ │ │ │ ├── chain
│ │ │ │ │ ├── market_history_chart_controller.ex
│ │ │ │ │ └── transaction_history_chart_controller.ex
│ │ │ │ ├── chain_controller.ex
│ │ │ │ ├── common_components_controller.ex
│ │ │ │ ├── csv_export_controller.ex
│ │ │ │ ├── page_not_found_controller.ex
│ │ │ │ ├── pending_transaction_controller.ex
│ │ │ │ ├── recent_transactions_controller.ex
│ │ │ │ ├── search_controller.ex
│ │ │ │ ├── smart_contract_controller.ex
│ │ │ │ ├── tokens
│ │ │ │ │ ├── contract_controller.ex
│ │ │ │ │ ├── holder_controller.ex
│ │ │ │ │ ├── instance
│ │ │ │ │ │ ├── helper.ex
│ │ │ │ │ │ ├── holder_controller.ex
│ │ │ │ │ │ ├── metadata_controller.ex
│ │ │ │ │ │ └── transfer_controller.ex
│ │ │ │ │ ├── instance_controller.ex
│ │ │ │ │ ├── inventory_controller.ex
│ │ │ │ │ ├── token_controller.ex
│ │ │ │ │ ├── tokens_controller.ex
│ │ │ │ │ └── transfer_controller.ex
│ │ │ │ ├── transaction_controller.ex
│ │ │ │ ├── transaction_internal_transaction_controller.ex
│ │ │ │ ├── transaction_log_controller.ex
│ │ │ │ ├── transaction_raw_trace_controller.ex
│ │ │ │ ├── transaction_state_controller.ex
│ │ │ │ ├── transaction_token_transfer_controller.ex
│ │ │ │ ├── verified_contracts_controller.ex
│ │ │ │ ├── visualize_sol2uml_controller.ex
│ │ │ │ └── withdrawal_controller.ex
│ │ │ ├── counters
│ │ │ │ ├── blocks_indexed_counter.ex
│ │ │ │ └── internal_transactions_indexed_counter.ex
│ │ │ ├── csp_header.ex
│ │ │ ├── endpoint.ex
│ │ │ ├── etherscan.ex
│ │ │ ├── gettext.ex
│ │ │ ├── models
│ │ │ │ ├── get_address_tags.ex
│ │ │ │ ├── get_transaction_tags.ex
│ │ │ │ ├── transaction_state_helper.ex
│ │ │ │ └── user_from_auth.ex
│ │ │ ├── notifier.ex
│ │ │ ├── paging_helper.ex
│ │ │ ├── plug
│ │ │ │ ├── admin
│ │ │ │ │ ├── check_owner_registered.ex
│ │ │ │ │ └── require_admin_role.ex
│ │ │ │ ├── allow_iframe.ex
│ │ │ │ ├── check_account_api.ex
│ │ │ │ ├── check_account_web.ex
│ │ │ │ ├── check_api_v2.ex
│ │ │ │ ├── fetch_user_from_session.ex
│ │ │ │ ├── graphql.ex
│ │ │ │ ├── logger.ex
│ │ │ │ ├── rate_limit.ex
│ │ │ │ └── redis_cookie.ex
│ │ │ ├── prometheus
│ │ │ │ ├── exporter.ex
│ │ │ │ └── instrumenter.ex
│ │ │ ├── realtime_event_handler.ex
│ │ │ ├── resolvers
│ │ │ │ ├── address.ex
│ │ │ │ ├── block.ex
│ │ │ │ ├── internal_transaction.ex
│ │ │ │ ├── token_transfer.ex
│ │ │ │ └── transaction.ex
│ │ │ ├── router.ex
│ │ │ ├── schema.ex
│ │ │ ├── schema
│ │ │ │ ├── scalars.ex
│ │ │ │ ├── scalars
│ │ │ │ │ └── JSON.ex
│ │ │ │ └── types.ex
│ │ │ ├── smart_contracts_api_v2_router.ex
│ │ │ ├── social_media.ex
│ │ │ ├── templates
│ │ │ │ ├── account
│ │ │ │ │ ├── api_key
│ │ │ │ │ │ ├── form.html.eex
│ │ │ │ │ │ ├── index.html.eex
│ │ │ │ │ │ └── row.html.eex
│ │ │ │ │ ├── auth
│ │ │ │ │ │ └── profile.html.eex
│ │ │ │ │ ├── common
│ │ │ │ │ │ └── _nav.html.eex
│ │ │ │ │ ├── custom_abi
│ │ │ │ │ │ ├── form.html.eex
│ │ │ │ │ │ ├── index.html.eex
│ │ │ │ │ │ └── row.html.eex
│ │ │ │ │ ├── public_tags_request
│ │ │ │ │ │ ├── address_field.html.eex
│ │ │ │ │ │ ├── form.html.eex
│ │ │ │ │ │ ├── index.html.eex
│ │ │ │ │ │ └── row.html.eex
│ │ │ │ │ ├── tag_address
│ │ │ │ │ │ ├── form.html.eex
│ │ │ │ │ │ ├── index.html.eex
│ │ │ │ │ │ └── row.html.eex
│ │ │ │ │ ├── tag_transaction
│ │ │ │ │ │ ├── form.html.eex
│ │ │ │ │ │ ├── index.html.eex
│ │ │ │ │ │ └── row.html.eex
│ │ │ │ │ ├── watchlist
│ │ │ │ │ │ └── show.html.eex
│ │ │ │ │ └── watchlist_address
│ │ │ │ │ │ ├── form.html.eex
│ │ │ │ │ │ └── row.html.eex
│ │ │ │ ├── address
│ │ │ │ │ ├── _balance_dropdown.html.eex
│ │ │ │ │ ├── _block_link.html.eex
│ │ │ │ │ ├── _current_coin_balance.html.eex
│ │ │ │ │ ├── _custom_view_df_title.html.eex
│ │ │ │ │ ├── _labels.html.eex
│ │ │ │ │ ├── _link.html.eex
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _responsive_hash.html.eex
│ │ │ │ │ ├── _show_address_transactions.html.eex
│ │ │ │ │ ├── _tabs.html.eex
│ │ │ │ │ ├── _tile.html.eex
│ │ │ │ │ ├── _validator_metadata_modal.html.eex
│ │ │ │ │ ├── _verify_other_explorer.html.eex
│ │ │ │ │ ├── _verify_other_explorer_modal.html.eex
│ │ │ │ │ ├── _verify_other_explorers.html.eex
│ │ │ │ │ ├── index.html.eex
│ │ │ │ │ └── overview.html.eex
│ │ │ │ ├── address_coin_balance
│ │ │ │ │ ├── _coin_balances.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_contract
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_contract_verification
│ │ │ │ │ └── new.html.eex
│ │ │ │ ├── address_contract_verification_common_fields
│ │ │ │ │ ├── _compiler_field.html.eex
│ │ │ │ │ ├── _constructor_args.html.eex
│ │ │ │ │ ├── _contract_address_field.html.eex
│ │ │ │ │ ├── _contract_name_field.html.eex
│ │ │ │ │ ├── _fetch_constructor_args.html.eex
│ │ │ │ │ ├── _include_nightly_builds_field.html.eex
│ │ │ │ │ ├── _libraries_other.html.eex
│ │ │ │ │ ├── _library_address.html.eex
│ │ │ │ │ ├── _library_first.html.eex
│ │ │ │ │ ├── _library_name.html.eex
│ │ │ │ │ └── _yul_contracts_switcher.html.eex
│ │ │ │ ├── address_contract_verification_via_flattened_code
│ │ │ │ │ └── new.html.eex
│ │ │ │ ├── address_contract_verification_via_json
│ │ │ │ │ └── new.html.eex
│ │ │ │ ├── address_contract_verification_via_multi_part_files
│ │ │ │ │ └── new.html.eex
│ │ │ │ ├── address_contract_verification_via_standard_json_input
│ │ │ │ │ └── new.html.eex
│ │ │ │ ├── address_contract_verification_vyper
│ │ │ │ │ └── new.html.eex
│ │ │ │ ├── address_decompiled_contract
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_internal_transaction
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_logs
│ │ │ │ │ ├── _logs.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_read_contract
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_read_proxy
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_token
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _tokens.html.eex
│ │ │ │ │ ├── index.html.eex
│ │ │ │ │ ├── overview.html.eex
│ │ │ │ │ └── overview_item.html.eex
│ │ │ │ ├── address_token_balance
│ │ │ │ │ ├── _token_balances.html.eex
│ │ │ │ │ └── _tokens.html.eex
│ │ │ │ ├── address_token_transfer
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_transaction
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_validation
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_withdrawal
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _withdrawal.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_write_contract
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── address_write_proxy
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── admin
│ │ │ │ │ ├── dashboard
│ │ │ │ │ │ └── index.html.eex
│ │ │ │ │ ├── session
│ │ │ │ │ │ └── login_form.html.eex
│ │ │ │ │ └── setup
│ │ │ │ │ │ ├── admin_registration.html.eex
│ │ │ │ │ │ └── verify.html.eex
│ │ │ │ ├── advertisement
│ │ │ │ │ ├── banners_ad
│ │ │ │ │ │ └── _banner_728.html.eex
│ │ │ │ │ └── text_ad
│ │ │ │ │ │ └── index.html.eex
│ │ │ │ ├── api_docs
│ │ │ │ │ ├── _action_tile.html.eex
│ │ │ │ │ ├── _eth_rpc_item.html.eex
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _model_table.html.eex
│ │ │ │ │ ├── _module_card.html.eex
│ │ │ │ │ ├── _module_item.html.eex
│ │ │ │ │ ├── eth_rpc.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── block
│ │ │ │ │ ├── _link.html.eex
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _number_link.html.eex
│ │ │ │ │ ├── _tabs.html.eex
│ │ │ │ │ ├── _tile.html.eex
│ │ │ │ │ ├── index.html.eex
│ │ │ │ │ └── overview.html.eex
│ │ │ │ ├── block_transaction
│ │ │ │ │ ├── 404.html.eex
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── block_withdrawal
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _withdrawal.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── chain
│ │ │ │ │ ├── _block.html.eex
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── gas_price_oracle_legend_item.html.eex
│ │ │ │ │ └── show.html.eex
│ │ │ │ ├── common_components
│ │ │ │ │ ├── _btn_add_full.html.eex
│ │ │ │ │ ├── _btn_add_line.html.eex
│ │ │ │ │ ├── _btn_copy.html.eex
│ │ │ │ │ ├── _btn_copy_for_table.html.eex
│ │ │ │ │ ├── _btn_external_link.html.eex
│ │ │ │ │ ├── _btn_line.html.eex
│ │ │ │ │ ├── _btn_qr_code.html.eex
│ │ │ │ │ ├── _changed_bytecode_warning.html.eex
│ │ │ │ │ ├── _channel_disconnected_message.html.eex
│ │ │ │ │ ├── _check_tooltip.html.eex
│ │ │ │ │ ├── _csv_export_button.html.eex
│ │ │ │ │ ├── _i_tooltip.html.eex
│ │ │ │ │ ├── _i_tooltip_2.html.eex
│ │ │ │ │ ├── _icon_error_modal.html.eex
│ │ │ │ │ ├── _icon_question_modal.html.eex
│ │ │ │ │ ├── _icon_success_modal.html.eex
│ │ │ │ │ ├── _icon_warning_modal.html.eex
│ │ │ │ │ ├── _info.html.eex
│ │ │ │ │ ├── _input_group.html.eex
│ │ │ │ │ ├── _loading_spinner.html.eex
│ │ │ │ │ ├── _minimal_proxy_pattern.html.eex
│ │ │ │ │ ├── _modal_bottom_disclaimer.html.eex
│ │ │ │ │ ├── _modal_close_button.html.eex
│ │ │ │ │ ├── _modal_qr_code.html.eex
│ │ │ │ │ ├── _modal_status.html.eex
│ │ │ │ │ ├── _pagination_container.html.eex
│ │ │ │ │ ├── _progress_from_to.html.eex
│ │ │ │ │ ├── _rap_pagination_container.html.eex
│ │ │ │ │ ├── _status_icon.html.eex
│ │ │ │ │ ├── _svg_minus.html.eex
│ │ │ │ │ ├── _svg_pen.html.eex
│ │ │ │ │ ├── _svg_plus.html.eex
│ │ │ │ │ ├── _svg_trash.html.eex
│ │ │ │ │ ├── _table-loader.html.eex
│ │ │ │ │ ├── _tenderly_link.html.eex
│ │ │ │ │ ├── _tile-loader.html.eex
│ │ │ │ │ └── _token_transfer_type_display_name.html.eex
│ │ │ │ ├── csv_export
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── error422
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── form
│ │ │ │ │ ├── _tag.html.eex
│ │ │ │ │ └── text_field.html.eex
│ │ │ │ ├── icons
│ │ │ │ │ ├── _accounts_icon.html.eex
│ │ │ │ │ ├── _active_icon.html.eex
│ │ │ │ │ ├── _api_icon.html.eex
│ │ │ │ │ ├── _apps_icon.html.eex
│ │ │ │ │ ├── _block_icon.html.eex
│ │ │ │ │ ├── _blockchain_icon.html.eex
│ │ │ │ │ ├── _check_dark_forest_icon.html.eex
│ │ │ │ │ ├── _external_link.html.eex
│ │ │ │ │ ├── _gas_price_icon.html.eex
│ │ │ │ │ ├── _guage_icon.html.eex
│ │ │ │ │ ├── _hourglass_icon.html.eex
│ │ │ │ │ ├── _inactive_icon.html.eex
│ │ │ │ │ ├── _network_icon.html.eex
│ │ │ │ │ ├── _search_icon.html.eex
│ │ │ │ │ ├── _smart_contract.html.eex
│ │ │ │ │ ├── _test_network_icon.html.eex
│ │ │ │ │ ├── _tokens_icon.html.eex
│ │ │ │ │ └── _transaction_icon.html.eex
│ │ │ │ ├── internal_server_error
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── internal_transaction
│ │ │ │ │ └── _tile.html.eex
│ │ │ │ ├── layout
│ │ │ │ │ ├── _account_menu_item.html.eex
│ │ │ │ │ ├── _add_chain_to_mm.html.eex
│ │ │ │ │ ├── _default_title.html.eex
│ │ │ │ │ ├── _footer.html.eex
│ │ │ │ │ ├── _search.html.eex
│ │ │ │ │ ├── _topnav.html.eex
│ │ │ │ │ └── app.html.eex
│ │ │ │ ├── log
│ │ │ │ │ └── _data_decoded_view.html.eex
│ │ │ │ ├── page_not_found
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── pending_transaction
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── search
│ │ │ │ │ ├── _empty_td.html.eex
│ │ │ │ │ ├── _name_td.html.eex
│ │ │ │ │ ├── _tile.html.eex
│ │ │ │ │ └── results.html.eex
│ │ │ │ ├── smart_contract
│ │ │ │ │ ├── _connect_container.html.eex
│ │ │ │ │ ├── _function_response.html.eex
│ │ │ │ │ ├── _functions.html.eex
│ │ │ │ │ └── _pending_contract_write.html.eex
│ │ │ │ ├── tokens
│ │ │ │ │ ├── _tile.html.eex
│ │ │ │ │ ├── _token_icon.html.eex
│ │ │ │ │ ├── _token_icon_default.html.eex
│ │ │ │ │ ├── contract
│ │ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ │ └── index.html.eex
│ │ │ │ │ ├── holder
│ │ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ │ ├── _token_balances.html.eex
│ │ │ │ │ │ └── index.html.eex
│ │ │ │ │ ├── index.html.eex
│ │ │ │ │ ├── instance
│ │ │ │ │ │ ├── holder
│ │ │ │ │ │ │ └── index.html.eex
│ │ │ │ │ │ ├── metadata
│ │ │ │ │ │ │ └── index.html.eex
│ │ │ │ │ │ ├── overview
│ │ │ │ │ │ │ ├── _details.html.eex
│ │ │ │ │ │ │ └── _tabs.html.eex
│ │ │ │ │ │ └── transfer
│ │ │ │ │ │ │ └── index.html.eex
│ │ │ │ │ ├── inventory
│ │ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ │ ├── _token.html.eex
│ │ │ │ │ │ └── index.html.eex
│ │ │ │ │ ├── overview
│ │ │ │ │ │ ├── _details.html.eex
│ │ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ │ └── _tabs.html.eex
│ │ │ │ │ └── transfer
│ │ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ │ ├── _token_transfer.html.eex
│ │ │ │ │ │ └── index.html.eex
│ │ │ │ ├── transaction
│ │ │ │ │ ├── _actions.html.eex
│ │ │ │ │ ├── _actions_aave.html.eex
│ │ │ │ │ ├── _actions_address.html.eex
│ │ │ │ │ ├── _actions_to.html.eex
│ │ │ │ │ ├── _actions_uniswap.html.eex
│ │ │ │ │ ├── _decoded_input.html.eex
│ │ │ │ │ ├── _decoded_input_body.html.eex
│ │ │ │ │ ├── _emission_reward_tile.html.eex
│ │ │ │ │ ├── _link.html.eex
│ │ │ │ │ ├── _link_to_token_instance.html.eex
│ │ │ │ │ ├── _link_to_token_symbol.html.eex
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _pending_tile.html.eex
│ │ │ │ │ ├── _tabs.html.eex
│ │ │ │ │ ├── _tile.html.eex
│ │ │ │ │ ├── _token_transfer.html.eex
│ │ │ │ │ ├── _total_transfers.html.eex
│ │ │ │ │ ├── _total_transfers_from_to.html.eex
│ │ │ │ │ ├── _transfer_token_with_id.html.eex
│ │ │ │ │ ├── index.html.eex
│ │ │ │ │ ├── not_found.html.eex
│ │ │ │ │ ├── overview.html.eex
│ │ │ │ │ ├── show_internal_transactions.html.eex
│ │ │ │ │ └── show_token_transfers.html.eex
│ │ │ │ ├── transaction_internal_transaction
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── transaction_log
│ │ │ │ │ ├── _logs.html.eex
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── transaction_raw_trace
│ │ │ │ │ ├── _card_body.html.eex
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── transaction_state
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _state_change.html.eex
│ │ │ │ │ ├── _token_balance.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── transaction_token_transfer
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _token_transfer.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── verified_contracts
│ │ │ │ │ ├── _contract.html.eex
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _stats.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ │ ├── visualize_sol2uml
│ │ │ │ │ └── index.html.eex
│ │ │ │ └── withdrawal
│ │ │ │ │ ├── _metatags.html.eex
│ │ │ │ │ ├── _withdrawal.html.eex
│ │ │ │ │ └── index.html.eex
│ │ │ ├── tracer.ex
│ │ │ ├── views
│ │ │ │ ├── abi_encoded_value_view.ex
│ │ │ │ ├── access_helper.ex
│ │ │ │ ├── account
│ │ │ │ │ ├── api
│ │ │ │ │ │ └── v1
│ │ │ │ │ │ │ ├── account_view.ex
│ │ │ │ │ │ │ ├── tags_view.ex
│ │ │ │ │ │ │ └── user_view.ex
│ │ │ │ │ ├── api_key_view.ex
│ │ │ │ │ ├── auth_view.ex
│ │ │ │ │ ├── common_view.ex
│ │ │ │ │ ├── custom_abi_view.ex
│ │ │ │ │ ├── public_tags_request_view.ex
│ │ │ │ │ ├── tag_address_view.ex
│ │ │ │ │ ├── tag_transaction_view.ex
│ │ │ │ │ ├── watchlist_address_view.ex
│ │ │ │ │ └── watchlist_view.ex
│ │ │ │ ├── address_coin_balance_view.ex
│ │ │ │ ├── address_contract_verification_common_fields_view.ex
│ │ │ │ ├── address_contract_verification_via_flattened_code_view.ex
│ │ │ │ ├── address_contract_verification_via_json_view.ex
│ │ │ │ ├── address_contract_verification_via_multi_part_files_view.ex
│ │ │ │ ├── address_contract_verification_via_standard_json_input_view.ex
│ │ │ │ ├── address_contract_verification_view.ex
│ │ │ │ ├── address_contract_verification_vyper_view.ex
│ │ │ │ ├── address_contract_view.ex
│ │ │ │ ├── address_decompiled_contract_view.ex
│ │ │ │ ├── address_internal_transaction_view.ex
│ │ │ │ ├── address_logs_view.ex
│ │ │ │ ├── address_read_contract_view.ex
│ │ │ │ ├── address_read_proxy_view.ex
│ │ │ │ ├── address_token_balance_view.ex
│ │ │ │ ├── address_token_transfer_view.ex
│ │ │ │ ├── address_token_view.ex
│ │ │ │ ├── address_transaction_view.ex
│ │ │ │ ├── address_validation_view.ex
│ │ │ │ ├── address_view.ex
│ │ │ │ ├── address_withdrawal_view.ex
│ │ │ │ ├── address_write_contract_view.ex
│ │ │ │ ├── address_write_proxy_view.ex
│ │ │ │ ├── admin
│ │ │ │ │ ├── dashboard_view.ex
│ │ │ │ │ ├── session_view.ex
│ │ │ │ │ └── setup_view.ex
│ │ │ │ ├── advertisement
│ │ │ │ │ ├── banners_ad_view.ex
│ │ │ │ │ └── text_ad_view.ex
│ │ │ │ ├── api
│ │ │ │ │ ├── eth_rpc
│ │ │ │ │ │ └── view.ex
│ │ │ │ │ ├── rpc
│ │ │ │ │ │ ├── address_view.ex
│ │ │ │ │ │ ├── block_view.ex
│ │ │ │ │ │ ├── contract_view.ex
│ │ │ │ │ │ ├── logs_view.ex
│ │ │ │ │ │ ├── rpc_view.ex
│ │ │ │ │ │ ├── stats_view.ex
│ │ │ │ │ │ ├── token_view.ex
│ │ │ │ │ │ └── transaction_view.ex
│ │ │ │ │ ├── v1
│ │ │ │ │ │ └── supply_view.ex
│ │ │ │ │ └── v2
│ │ │ │ │ │ ├── address_view.ex
│ │ │ │ │ │ ├── api_view.ex
│ │ │ │ │ │ ├── block_view.ex
│ │ │ │ │ │ ├── config_view.ex
│ │ │ │ │ │ ├── helper.ex
│ │ │ │ │ │ ├── search_view.ex
│ │ │ │ │ │ ├── smart_contract_view.ex
│ │ │ │ │ │ ├── token_view.ex
│ │ │ │ │ │ ├── transaction_view.ex
│ │ │ │ │ │ └── withdrawal_view.ex
│ │ │ │ ├── api_docs_view.ex
│ │ │ │ ├── block_transaction_view.ex
│ │ │ │ ├── block_view.ex
│ │ │ │ ├── block_withdrawal_view.ex
│ │ │ │ ├── chain_view.ex
│ │ │ │ ├── cldr_helper
│ │ │ │ │ └── number.ex
│ │ │ │ ├── common_components_view.ex
│ │ │ │ ├── csv_export.ex
│ │ │ │ ├── currency_helper.ex
│ │ │ │ ├── error_422.ex
│ │ │ │ ├── error_helper.ex
│ │ │ │ ├── error_view.ex
│ │ │ │ ├── form_view.ex
│ │ │ │ ├── icons_view.ex
│ │ │ │ ├── internal_server_error_view.ex
│ │ │ │ ├── internal_transaction_view.ex
│ │ │ │ ├── layout_view.ex
│ │ │ │ ├── log_view.ex
│ │ │ │ ├── nft_helper.ex
│ │ │ │ ├── page_not_found.ex
│ │ │ │ ├── pending_transaction_view.ex
│ │ │ │ ├── render_helper.ex
│ │ │ │ ├── script_helper.ex
│ │ │ │ ├── search_view.ex
│ │ │ │ ├── smart_contract_view.ex
│ │ │ │ ├── tab_helper.ex
│ │ │ │ ├── tokens
│ │ │ │ │ ├── contract_view.ex
│ │ │ │ │ ├── helper.ex
│ │ │ │ │ ├── holder_view.ex
│ │ │ │ │ ├── instance
│ │ │ │ │ │ ├── holder_view.ex
│ │ │ │ │ │ ├── metadata_view.ex
│ │ │ │ │ │ ├── overview_view.ex
│ │ │ │ │ │ └── transfer_view.ex
│ │ │ │ │ ├── instance_view.ex
│ │ │ │ │ ├── inventory_view.ex
│ │ │ │ │ ├── overview_view.ex
│ │ │ │ │ └── transfer_view.ex
│ │ │ │ ├── tokens_view.ex
│ │ │ │ ├── transaction_internal_transaction_view.ex
│ │ │ │ ├── transaction_log_view.ex
│ │ │ │ ├── transaction_raw_trace_view.ex
│ │ │ │ ├── transaction_state_view.ex
│ │ │ │ ├── transaction_token_transfer_view.ex
│ │ │ │ ├── transaction_view.ex
│ │ │ │ ├── verified_contracts_view.ex
│ │ │ │ ├── visualize_sol2uml_view.ex
│ │ │ │ ├── wei_helper.ex
│ │ │ │ └── withdrawal_view.ex
│ │ │ └── web_router.ex
│ │ └── phoenix
│ │ │ ├── html
│ │ │ └── safe.ex
│ │ │ └── param.ex
│ ├── mix.exs
│ ├── priv
│ │ └── gettext
│ │ │ ├── default.pot
│ │ │ ├── en
│ │ │ └── LC_MESSAGES
│ │ │ │ ├── default.po
│ │ │ │ └── errors.po
│ │ │ └── errors.pot
│ └── test
│ │ ├── block_scout_web
│ │ ├── chain_test.exs
│ │ ├── channels
│ │ │ ├── address_channel_test.exs
│ │ │ ├── block_channel_test.exs
│ │ │ ├── exchange_rate_channel_test.exs
│ │ │ ├── reward_channel_test.exs
│ │ │ ├── transaction_channel_test.exs
│ │ │ └── websocket_v2_test.exs
│ │ ├── controllers
│ │ │ ├── account
│ │ │ │ ├── api
│ │ │ │ │ └── v1
│ │ │ │ │ │ └── user_controller_test.exs
│ │ │ │ └── custom_abi_controller_test.exs
│ │ │ ├── address_coin_balance_by_day_controller_test.exs
│ │ │ ├── address_contract_controller_test.exs
│ │ │ ├── address_controller_test.exs
│ │ │ ├── address_internal_transaction_controller_test.exs
│ │ │ ├── address_read_contract_controller_test.exs
│ │ │ ├── address_read_proxy_controller_test.exs
│ │ │ ├── address_token_balance_controller_test.exs
│ │ │ ├── address_token_controller_test.exs
│ │ │ ├── address_token_transfer_controller_test.exs
│ │ │ ├── address_transaction_controller_test.exs
│ │ │ ├── address_withdrawal_controller_test.exs
│ │ │ ├── address_write_contract_controller_test.exs
│ │ │ ├── address_write_proxy_controller_test.exs
│ │ │ ├── admin
│ │ │ │ ├── dashboard_controller_test.exs
│ │ │ │ ├── session_controller_test.exs
│ │ │ │ └── setup_controller_test.exs
│ │ │ ├── api
│ │ │ │ ├── rpc
│ │ │ │ │ ├── address_controller_test.exs
│ │ │ │ │ ├── block_controller_test.exs
│ │ │ │ │ ├── contract_controller_test.exs
│ │ │ │ │ ├── eth_controller_test.exs
│ │ │ │ │ ├── logs_controller_test.exs
│ │ │ │ │ ├── rpc_translator_test.exs
│ │ │ │ │ ├── stats_controller_test.exs
│ │ │ │ │ ├── token_controller_test.exs
│ │ │ │ │ └── transaction_controller_test.exs
│ │ │ │ ├── v1
│ │ │ │ │ ├── decompiled_smart_contract_controller_test.exs
│ │ │ │ │ ├── health_controller_test.exs
│ │ │ │ │ ├── supply_controller_test.exs
│ │ │ │ │ └── verified_smart_contract_controller_test.exs
│ │ │ │ └── v2
│ │ │ │ │ ├── address_controller_test.exs
│ │ │ │ │ ├── block_controller_test.exs
│ │ │ │ │ ├── config_controller_test.exs
│ │ │ │ │ ├── import_controller_test.exs
│ │ │ │ │ ├── main_page_controller_test.exs
│ │ │ │ │ ├── search_controller_test.exs
│ │ │ │ │ ├── smart_contract_controller_test.exs
│ │ │ │ │ ├── stats_controller_test.exs
│ │ │ │ │ ├── token_controller_test.exs
│ │ │ │ │ ├── transaction_controller_test.exs
│ │ │ │ │ ├── verification_controller_test.exs
│ │ │ │ │ └── withdrawal_controller_test.exs
│ │ │ ├── api_docs_controller_test.exs
│ │ │ ├── block_controller_test.exs
│ │ │ ├── block_transaction_controller_test.exs
│ │ │ ├── block_withdrawal_controller_test.exs
│ │ │ ├── chain
│ │ │ │ ├── market_history_chart_controller_test.exs
│ │ │ │ └── transaction_history_chart_controller_test.exs
│ │ │ ├── chain_controller_test.exs
│ │ │ ├── page_not_found_controller_test.exs
│ │ │ ├── pending_transaction_controller_test.exs
│ │ │ ├── recent_transactions_controller_test.exs
│ │ │ ├── smart_contract_controller_test.exs
│ │ │ ├── tokens
│ │ │ │ ├── holder_controller_test.exs
│ │ │ │ ├── instance
│ │ │ │ │ └── transfer_controller_test.exs
│ │ │ │ ├── instance_controller_test.exs
│ │ │ │ ├── inventory_controller_test.exs
│ │ │ │ ├── read_contract_controller_test.exs
│ │ │ │ └── token_controller_test.exs
│ │ │ ├── transaction_controller_test.exs
│ │ │ ├── transaction_internal_transaction_controller_test.exs
│ │ │ ├── transaction_log_controller_test.exs
│ │ │ ├── transaction_state_controller_test.exs
│ │ │ ├── transaction_token_transfer_controller_test.exs
│ │ │ ├── verified_contracts_controller_test.exs
│ │ │ └── withdrawal_controller_test.exs
│ │ ├── features
│ │ │ ├── address_contract_verification_test.exs
│ │ │ ├── pages
│ │ │ │ ├── address_contract_page.ex
│ │ │ │ ├── address_page.ex
│ │ │ │ ├── app_page.ex
│ │ │ │ ├── block_list_page.ex
│ │ │ │ ├── block_page.ex
│ │ │ │ ├── chain_page.ex
│ │ │ │ ├── contract_verify_page.ex
│ │ │ │ ├── token_page.ex
│ │ │ │ ├── transaction_list_page.ex
│ │ │ │ ├── transaction_logs_page.ex
│ │ │ │ └── transaction_page.ex
│ │ │ ├── viewing_addresses_test.exs
│ │ │ ├── viewing_app_test.exs
│ │ │ ├── viewing_blocks_test.exs
│ │ │ ├── viewing_chain_test.exs
│ │ │ ├── viewing_tokens_test.exs
│ │ │ └── viewing_transactions_test.exs
│ │ ├── models
│ │ │ └── user_from_auth_test.exs
│ │ ├── plug
│ │ │ ├── admin
│ │ │ │ ├── check_owner_registered_test.exs
│ │ │ │ └── require_admin_role_test.exs
│ │ │ └── fetch_user_from_session_test.exs
│ │ ├── schema
│ │ │ ├── query
│ │ │ │ ├── address_test.exs
│ │ │ │ ├── addresses_test.exs
│ │ │ │ ├── block_test.exs
│ │ │ │ ├── node_test.exs
│ │ │ │ ├── token_transfers_test.exs
│ │ │ │ └── transaction_test.exs
│ │ │ └── subscription
│ │ │ │ └── token_transfers_test.exs
│ │ ├── social_media_test.exs
│ │ └── views
│ │ │ ├── abi_encoded_value_view_test.exs
│ │ │ ├── address_coin_balance_view_test.exs
│ │ │ ├── address_contract_view_test.exs
│ │ │ ├── address_decompiled_contract_view_test.exs
│ │ │ ├── address_token_balance_view_test.exs
│ │ │ ├── address_transaction_view_test.exs
│ │ │ ├── address_view_test.exs
│ │ │ ├── api_docs_view_test.exs
│ │ │ ├── block_view_test.exs
│ │ │ ├── currency_helper_test.exs
│ │ │ ├── error_helper_test.exs
│ │ │ ├── error_view_test.exs
│ │ │ ├── internal_transaction_view_test.exs
│ │ │ ├── layout_view_test.exs
│ │ │ ├── nft_helper_test.exs
│ │ │ ├── render_helper_test.exs
│ │ │ ├── search_view_test.exs
│ │ │ ├── smart_contract_view_test.exs
│ │ │ ├── tab_helper_test.exs
│ │ │ ├── tokens
│ │ │ ├── helper_test.exs
│ │ │ ├── holder_view_test.exs
│ │ │ ├── instance
│ │ │ │ └── overview_view_test.exs
│ │ │ ├── overview_view_test.exs
│ │ │ ├── read_contract_view_test.exs
│ │ │ ├── smart_contract_view_test.exs
│ │ │ └── transfer_view_test.exs
│ │ │ ├── transaction_view_test.exs
│ │ │ └── wei_helper_test.exs
│ │ ├── phoenix
│ │ └── param
│ │ │ └── explorer
│ │ │ └── chain
│ │ │ └── block_test.exs
│ │ ├── support
│ │ ├── channel_case.ex
│ │ ├── conn_case.ex
│ │ ├── feature_case.ex
│ │ ├── fixture
│ │ │ └── smart_contract
│ │ │ │ ├── compiler_tests.json
│ │ │ │ ├── contract_with_lib.json
│ │ │ │ ├── eth_bytecode_db_search_response.json
│ │ │ │ └── solc_bin.json
│ │ └── subscription_case.ex
│ │ └── test_helper.exs
├── ethereum_jsonrpc
│ ├── .gitignore
│ ├── README.md
│ ├── config
│ │ ├── config.exs
│ │ ├── dev.exs
│ │ ├── prod.exs
│ │ ├── runtime
│ │ │ └── test.exs
│ │ └── test.exs
│ ├── lib
│ │ ├── ethereum_jsonrpc.ex
│ │ ├── ethereum_jsonrpc
│ │ │ ├── application.ex
│ │ │ ├── arbitrum.ex
│ │ │ ├── besu.ex
│ │ │ ├── besu
│ │ │ │ ├── trace.ex
│ │ │ │ └── traces.ex
│ │ │ ├── block.ex
│ │ │ ├── block
│ │ │ │ ├── by_hash.ex
│ │ │ │ ├── by_nephew.ex
│ │ │ │ ├── by_number.ex
│ │ │ │ └── by_tag.ex
│ │ │ ├── blocks.ex
│ │ │ ├── contract.ex
│ │ │ ├── decode_error.ex
│ │ │ ├── encoder.ex
│ │ │ ├── erigon.ex
│ │ │ ├── fetched_balance.ex
│ │ │ ├── fetched_balances.ex
│ │ │ ├── fetched_beneficiaries.ex
│ │ │ ├── fetched_beneficiary.ex
│ │ │ ├── fetched_code.ex
│ │ │ ├── fetched_codes.ex
│ │ │ ├── ganache.ex
│ │ │ ├── geth.ex
│ │ │ ├── geth
│ │ │ │ ├── call.ex
│ │ │ │ ├── calls.ex
│ │ │ │ ├── polygon_tracer.ex
│ │ │ │ └── tracer.ex
│ │ │ ├── http.ex
│ │ │ ├── http
│ │ │ │ └── httpoison.ex
│ │ │ ├── ipc.ex
│ │ │ ├── log.ex
│ │ │ ├── logs.ex
│ │ │ ├── nethermind.ex
│ │ │ ├── nethermind
│ │ │ │ ├── trace.ex
│ │ │ │ ├── trace
│ │ │ │ │ ├── action.ex
│ │ │ │ │ └── result.ex
│ │ │ │ └── traces.ex
│ │ │ ├── pending_transaction.ex
│ │ │ ├── receipt.ex
│ │ │ ├── receipts.ex
│ │ │ ├── request_coordinator.ex
│ │ │ ├── rolling_window.ex
│ │ │ ├── subscription.ex
│ │ │ ├── trace_replay_block_transactions.ex
│ │ │ ├── tracer.ex
│ │ │ ├── transaction.ex
│ │ │ ├── transactions.ex
│ │ │ ├── transport.ex
│ │ │ ├── uncle.ex
│ │ │ ├── uncles.ex
│ │ │ ├── utility
│ │ │ │ ├── common_helper.ex
│ │ │ │ ├── endpoint_availability_checker.ex
│ │ │ │ └── endpoint_availability_observer.ex
│ │ │ ├── variant.ex
│ │ │ ├── web_socket.ex
│ │ │ ├── web_socket
│ │ │ │ ├── registration.ex
│ │ │ │ ├── web_socket_client.ex
│ │ │ │ └── web_socket_client
│ │ │ │ │ └── options.ex
│ │ │ ├── withdrawal.ex
│ │ │ └── withdrawals.ex
│ │ └── rsk.ex
│ ├── mix.exs
│ ├── priv
│ │ └── js
│ │ │ └── ethereum_jsonrpc
│ │ │ └── geth
│ │ │ └── debug_traceTransaction
│ │ │ └── tracer.js
│ └── test
│ │ ├── ethereum_jsonrpc
│ │ ├── block_test.exs
│ │ ├── blocks_test.exs
│ │ ├── contract_test.exs
│ │ ├── encoder_test.exs
│ │ ├── fetched_beneficiaries_test.exs
│ │ ├── geth
│ │ │ ├── call_test.exs
│ │ │ ├── calls_tests.exs
│ │ │ └── tracer_test.exs
│ │ ├── geth_test.exs
│ │ ├── http
│ │ │ └── mox_test.exs
│ │ ├── log_test.exs
│ │ ├── mox_test.exs
│ │ ├── nethermind
│ │ │ ├── trace
│ │ │ │ ├── action_test.exs
│ │ │ │ └── result_test.exs
│ │ │ └── trace_test.exs
│ │ ├── nethermind_test.exs
│ │ ├── receipt_test.exs
│ │ ├── receipts_test.exs
│ │ ├── request_coordinator_test.exs
│ │ ├── rolling_window_test.exs
│ │ ├── transaction_test.exs
│ │ ├── transactions_test.exs
│ │ ├── uncle_test.exs
│ │ ├── uncles_test.exs
│ │ ├── web_socket
│ │ │ └── web_socket_client_test.exs
│ │ ├── web_socket_test.exs
│ │ ├── withdrawal_test.exs
│ │ └── withdrawals_test.exs
│ │ ├── ethereum_jsonrpc_test.exs
│ │ ├── support
│ │ ├── ethereum_jsonrpc
│ │ │ ├── case.ex
│ │ │ ├── case
│ │ │ │ ├── geth
│ │ │ │ │ ├── http_websocket.ex
│ │ │ │ │ └── mox.ex
│ │ │ │ └── nethermind
│ │ │ │ │ ├── http_websocket.ex
│ │ │ │ │ └── mox.ex
│ │ │ ├── http
│ │ │ │ └── case.ex
│ │ │ └── web_socket
│ │ │ │ ├── case.ex
│ │ │ │ ├── case
│ │ │ │ ├── geth.ex
│ │ │ │ ├── mox.ex
│ │ │ │ └── nethermind.ex
│ │ │ │ └── cowboy
│ │ │ │ └── websocket_handler.ex
│ │ └── fixture
│ │ │ └── geth
│ │ │ └── trace
│ │ │ ├── calltracer.json
│ │ │ └── struct_logger.json
│ │ └── test_helper.exs
├── explorer
│ ├── .gitignore
│ ├── .sobelow-conf
│ ├── README.md
│ ├── benchmarks
│ │ └── explorer
│ │ │ └── chain
│ │ │ ├── recent_collated_transactions.benchee
│ │ │ └── recent_collated_transactions.exs
│ ├── config
│ │ ├── config.exs
│ │ ├── dev.exs
│ │ ├── dev
│ │ │ ├── arbitrum.exs
│ │ │ ├── besu.exs
│ │ │ ├── erigon.exs
│ │ │ ├── ganache.exs
│ │ │ ├── geth.exs
│ │ │ ├── nethermind.exs
│ │ │ └── rsk.exs
│ │ ├── prod.exs
│ │ ├── prod
│ │ │ ├── arbitrum.exs
│ │ │ ├── besu.exs
│ │ │ ├── erigon.exs
│ │ │ ├── ganache.exs
│ │ │ ├── geth.exs
│ │ │ ├── nethermind.exs
│ │ │ └── rsk.exs
│ │ ├── runtime
│ │ │ └── test.exs
│ │ ├── test.exs
│ │ └── test
│ │ │ ├── arbitrum.exs
│ │ │ ├── besu.exs
│ │ │ ├── erigon.exs
│ │ │ ├── ganache.exs
│ │ │ ├── geth.exs
│ │ │ ├── nethermind.exs
│ │ │ └── rsk.exs
│ ├── coveralls.json
│ ├── lib
│ │ ├── encrypt.ex
│ │ ├── explorer.ex
│ │ ├── explorer
│ │ │ ├── access_helper.ex
│ │ │ ├── account.ex
│ │ │ ├── account
│ │ │ │ ├── api
│ │ │ │ │ ├── key.ex
│ │ │ │ │ └── plan.ex
│ │ │ │ ├── custom_abi.ex
│ │ │ │ ├── identity.ex
│ │ │ │ ├── notifier
│ │ │ │ │ ├── email.ex
│ │ │ │ │ ├── forbidden_address.ex
│ │ │ │ │ ├── notify.ex
│ │ │ │ │ └── summary.ex
│ │ │ │ ├── notify.ex
│ │ │ │ ├── public_tags_request.ex
│ │ │ │ ├── tag_address.ex
│ │ │ │ ├── tag_transaction.ex
│ │ │ │ ├── watchlist.ex
│ │ │ │ ├── watchlist_address.ex
│ │ │ │ └── watchlist_notification.ex
│ │ │ ├── accounts
│ │ │ │ ├── accounts.ex
│ │ │ │ ├── user.ex
│ │ │ │ ├── user
│ │ │ │ │ ├── authenticate.ex
│ │ │ │ │ └── registration.ex
│ │ │ │ └── user_contact.ex
│ │ │ ├── admin.ex
│ │ │ ├── admin
│ │ │ │ ├── administrator.ex
│ │ │ │ ├── recovery.ex
│ │ │ │ └── role.ex
│ │ │ ├── application.ex
│ │ │ ├── application
│ │ │ │ └── constants.ex
│ │ │ ├── chain.ex
│ │ │ ├── chain
│ │ │ │ ├── address.ex
│ │ │ │ ├── address
│ │ │ │ │ ├── coin_balance.ex
│ │ │ │ │ ├── coin_balance_daily.ex
│ │ │ │ │ ├── current_token_balance.ex
│ │ │ │ │ ├── name.ex
│ │ │ │ │ ├── token.ex
│ │ │ │ │ └── token_balance.ex
│ │ │ │ ├── block.ex
│ │ │ │ ├── block
│ │ │ │ │ ├── emission_reward.ex
│ │ │ │ │ ├── range.ex
│ │ │ │ │ ├── reward.ex
│ │ │ │ │ ├── reward
│ │ │ │ │ │ └── address_type.ex
│ │ │ │ │ └── second_degree_relation.ex
│ │ │ │ ├── cache
│ │ │ │ │ ├── accounts.ex
│ │ │ │ │ ├── address_sum.ex
│ │ │ │ │ ├── address_sum_minus_burnt.ex
│ │ │ │ │ ├── block.ex
│ │ │ │ │ ├── block_number.ex
│ │ │ │ │ ├── blocks.ex
│ │ │ │ │ ├── contracts_counter.ex
│ │ │ │ │ ├── gas_price_oracle.ex
│ │ │ │ │ ├── gas_usage.ex
│ │ │ │ │ ├── helper.ex
│ │ │ │ │ ├── min_missing_block.ex
│ │ │ │ │ ├── net_version.ex
│ │ │ │ │ ├── new_contracts_counter.ex
│ │ │ │ │ ├── new_verified_contracts_counter.ex
│ │ │ │ │ ├── pending_block_operation.ex
│ │ │ │ │ ├── state_changes.ex
│ │ │ │ │ ├── transaction.ex
│ │ │ │ │ ├── transaction_action_tokens_data.ex
│ │ │ │ │ ├── transaction_action_uniswap_pools.ex
│ │ │ │ │ ├── transactions.ex
│ │ │ │ │ ├── transactions_api_v2.ex
│ │ │ │ │ ├── uncles.ex
│ │ │ │ │ ├── verified_contracts_counter.ex
│ │ │ │ │ └── withdrawals_sum.ex
│ │ │ │ ├── contract_method.ex
│ │ │ │ ├── csv_export
│ │ │ │ │ ├── address_internal_transaction_csv_exporter.ex
│ │ │ │ │ ├── address_log_csv_exporter.ex
│ │ │ │ │ ├── address_token_transfer_csv_exporter.ex
│ │ │ │ │ ├── address_transaction_csv_exporter.ex
│ │ │ │ │ └── helper.ex
│ │ │ │ ├── currency_helper.ex
│ │ │ │ ├── data.ex
│ │ │ │ ├── decompiled_smart_contract.ex
│ │ │ │ ├── events
│ │ │ │ │ ├── db_sender.ex
│ │ │ │ │ ├── listener.ex
│ │ │ │ │ ├── publisher.ex
│ │ │ │ │ ├── simple_sender.ex
│ │ │ │ │ └── subscriber.ex
│ │ │ │ ├── fetcher
│ │ │ │ │ ├── check_bytecode_matching_on_demand.ex
│ │ │ │ │ ├── fetch_validator_info_on_demand.ex
│ │ │ │ │ └── look_up_smart_contract_sources_on_demand.ex
│ │ │ │ ├── gas.ex
│ │ │ │ ├── hash.ex
│ │ │ │ ├── hash
│ │ │ │ │ ├── address.ex
│ │ │ │ │ ├── full.ex
│ │ │ │ │ └── nonce.ex
│ │ │ │ ├── import.ex
│ │ │ │ ├── import
│ │ │ │ │ ├── runner.ex
│ │ │ │ │ ├── runner
│ │ │ │ │ │ ├── address
│ │ │ │ │ │ │ ├── coin_balances.ex
│ │ │ │ │ │ │ ├── coin_balances_daily.ex
│ │ │ │ │ │ │ ├── current_token_balances.ex
│ │ │ │ │ │ │ └── token_balances.ex
│ │ │ │ │ │ ├── addresses.ex
│ │ │ │ │ │ ├── block
│ │ │ │ │ │ │ ├── rewards.ex
│ │ │ │ │ │ │ └── second_degree_relations.ex
│ │ │ │ │ │ ├── blocks.ex
│ │ │ │ │ │ ├── internal_transactions.ex
│ │ │ │ │ │ ├── logs.ex
│ │ │ │ │ │ ├── token_transfers.ex
│ │ │ │ │ │ ├── tokens.ex
│ │ │ │ │ │ ├── transaction
│ │ │ │ │ │ │ └── forks.ex
│ │ │ │ │ │ ├── transaction_actions.ex
│ │ │ │ │ │ ├── transactions.ex
│ │ │ │ │ │ └── withdrawals.ex
│ │ │ │ │ ├── stage.ex
│ │ │ │ │ └── stage
│ │ │ │ │ │ ├── address_referencing.ex
│ │ │ │ │ │ ├── addresses.ex
│ │ │ │ │ │ ├── block_following.ex
│ │ │ │ │ │ ├── block_pending.ex
│ │ │ │ │ │ └── block_referencing.ex
│ │ │ │ ├── internal_transaction.ex
│ │ │ │ ├── internal_transaction
│ │ │ │ │ ├── action.ex
│ │ │ │ │ ├── call_type.ex
│ │ │ │ │ ├── result.ex
│ │ │ │ │ └── type.ex
│ │ │ │ ├── log.ex
│ │ │ │ ├── map_cache.ex
│ │ │ │ ├── method_identifier.ex
│ │ │ │ ├── ordered_cache.ex
│ │ │ │ ├── pending_block_operation.ex
│ │ │ │ ├── smart_contract.ex
│ │ │ │ ├── smart_contract
│ │ │ │ │ ├── external_library.ex
│ │ │ │ │ └── verification_status.ex
│ │ │ │ ├── smart_contract_additional_sources.ex
│ │ │ │ ├── supply.ex
│ │ │ │ ├── supply
│ │ │ │ │ ├── exchange_rate.ex
│ │ │ │ │ ├── proof_of_authority.ex
│ │ │ │ │ └── rsk.ex
│ │ │ │ ├── token.ex
│ │ │ │ ├── token
│ │ │ │ │ └── instance.ex
│ │ │ │ ├── token_transfer.ex
│ │ │ │ ├── transaction.ex
│ │ │ │ ├── transaction
│ │ │ │ │ ├── fork.ex
│ │ │ │ │ ├── history
│ │ │ │ │ │ ├── historian.ex
│ │ │ │ │ │ └── transaction_stats.ex
│ │ │ │ │ ├── state_change.ex
│ │ │ │ │ └── status.ex
│ │ │ │ ├── transaction_action.ex
│ │ │ │ ├── validator.ex
│ │ │ │ ├── wei.ex
│ │ │ │ └── withdrawal.ex
│ │ │ ├── chain_spec
│ │ │ │ ├── genesis_data.ex
│ │ │ │ ├── geth
│ │ │ │ │ └── importer.ex
│ │ │ │ ├── parity
│ │ │ │ │ └── importer.ex
│ │ │ │ └── poa
│ │ │ │ │ └── importer.ex
│ │ │ ├── counters
│ │ │ │ ├── address_gas_usage_counter.ex
│ │ │ │ ├── address_token_transfers_counter.ex
│ │ │ │ ├── address_tokens_usd_sum.ex
│ │ │ │ ├── address_transactions_counter.ex
│ │ │ │ ├── addresses_counter.ex
│ │ │ │ ├── addresses_with_balance_counter.ex
│ │ │ │ ├── average_block_time.ex
│ │ │ │ ├── average_block_time_duration_format.ex
│ │ │ │ ├── block_burned_fee_counter.ex
│ │ │ │ ├── block_priority_fee_counter.ex
│ │ │ │ ├── helper.ex
│ │ │ │ ├── last_fetched_counter.ex
│ │ │ │ ├── token_holders_counter.ex
│ │ │ │ └── token_transfers_counter.ex
│ │ │ ├── custom_contracts_helper.ex
│ │ │ ├── encrypted
│ │ │ │ ├── address_hash.ex
│ │ │ │ ├── binary.ex
│ │ │ │ ├── transaction_hash.ex
│ │ │ │ └── types
│ │ │ │ │ ├── address_hash.ex
│ │ │ │ │ └── transaction_hash.ex
│ │ │ ├── env_var_translator.ex
│ │ │ ├── eth_rpc.ex
│ │ │ ├── etherscan.ex
│ │ │ ├── etherscan
│ │ │ │ ├── addresses.ex
│ │ │ │ ├── blocks.ex
│ │ │ │ ├── contracts.ex
│ │ │ │ ├── logs.ex
│ │ │ │ └── rpc.ex
│ │ │ ├── exchange_rates
│ │ │ │ ├── exchange_rates.ex
│ │ │ │ ├── source.ex
│ │ │ │ ├── source
│ │ │ │ │ ├── coin_gecko.ex
│ │ │ │ │ └── coin_market_cap.ex
│ │ │ │ ├── token.ex
│ │ │ │ └── token_exchange_rates.ex
│ │ │ ├── graphql.ex
│ │ │ ├── helper.ex
│ │ │ ├── history
│ │ │ │ ├── historian.ex
│ │ │ │ └── process.ex
│ │ │ ├── logger.ex
│ │ │ ├── mailer.ex
│ │ │ ├── market
│ │ │ │ ├── history
│ │ │ │ │ ├── cataloger.ex
│ │ │ │ │ └── source
│ │ │ │ │ │ ├── market_cap.ex
│ │ │ │ │ │ ├── market_cap
│ │ │ │ │ │ └── coin_gecko.ex
│ │ │ │ │ │ ├── price.ex
│ │ │ │ │ │ └── price
│ │ │ │ │ │ └── crypto_compare.ex
│ │ │ │ ├── market.ex
│ │ │ │ ├── market_history.ex
│ │ │ │ └── market_history_cache.ex
│ │ │ ├── paging_options.ex
│ │ │ ├── prometheus
│ │ │ │ └── instrumenter.ex
│ │ │ ├── repo.ex
│ │ │ ├── repo
│ │ │ │ ├── config_helper.ex
│ │ │ │ └── prometheus_logger.ex
│ │ │ ├── schema.ex
│ │ │ ├── smart_contract
│ │ │ │ ├── compiler_version.ex
│ │ │ │ ├── eth_bytecode_db_interface.ex
│ │ │ │ ├── helper.ex
│ │ │ │ ├── reader.ex
│ │ │ │ ├── rust_verifier_interface.ex
│ │ │ │ ├── rust_verifier_interface_behaviour.ex
│ │ │ │ ├── sig_provider_interface.ex
│ │ │ │ ├── solc_downloader.ex
│ │ │ │ ├── solidity
│ │ │ │ │ ├── code_compiler.ex
│ │ │ │ │ ├── publish_helper.ex
│ │ │ │ │ ├── publisher.ex
│ │ │ │ │ ├── publisher_worker.ex
│ │ │ │ │ └── verifier.ex
│ │ │ │ ├── vyper
│ │ │ │ │ ├── code_compiler.ex
│ │ │ │ │ ├── publisher.ex
│ │ │ │ │ ├── publisher_worker.ex
│ │ │ │ │ └── verifier.ex
│ │ │ │ ├── vyper_downloader.ex
│ │ │ │ └── writer.ex
│ │ │ ├── tags
│ │ │ │ ├── address_tag.ex
│ │ │ │ ├── address_tag_cataloger.ex
│ │ │ │ └── address_to_tag.ex
│ │ │ ├── third_party_integrations
│ │ │ │ ├── airtable.ex
│ │ │ │ ├── auth0.ex
│ │ │ │ └── sourcify.ex
│ │ │ ├── token
│ │ │ │ ├── balance_reader.ex
│ │ │ │ ├── instance_metadata_retriever.ex
│ │ │ │ ├── instance_owner_reader.ex
│ │ │ │ └── metadata_retriever.ex
│ │ │ ├── token_transfer_token_id_migration
│ │ │ │ ├── lowest_block_number_updater.ex
│ │ │ │ ├── supervisor.ex
│ │ │ │ └── worker.ex
│ │ │ ├── tracer.ex
│ │ │ ├── tuple_encoder.ex
│ │ │ ├── utility
│ │ │ │ ├── event_notification.ex
│ │ │ │ ├── missing_block_range.ex
│ │ │ │ ├── missing_ranges_manipulator.ex
│ │ │ │ ├── rust_service.ex
│ │ │ │ └── token_transfer_token_id_migrator_progress.ex
│ │ │ ├── validator
│ │ │ │ ├── metadata_importer.ex
│ │ │ │ ├── metadata_processor.ex
│ │ │ │ └── metadata_retriever.ex
│ │ │ ├── vault.ex
│ │ │ └── visualize
│ │ │ │ └── sol2uml.ex
│ │ └── release_tasks.ex
│ ├── mix.exs
│ ├── package-lock.json
│ ├── package.json
│ ├── priv
│ │ ├── account
│ │ │ └── migrations
│ │ │ │ ├── 20211031164954_create_account_identities.exs
│ │ │ │ ├── 20211105114502_create_account_watchlists.exs
│ │ │ │ ├── 20211105130907_create_account_watchlist_addresses.exs
│ │ │ │ ├── 20211127212336_create_account_watchlist_notifications.exs
│ │ │ │ ├── 20211205220414_add_email_and_name_to_account_identity.exs
│ │ │ │ ├── 20220212222222_create_account_tag_addresses.exs
│ │ │ │ ├── 20220313133333_create_account_tag_transactions.exs
│ │ │ │ ├── 20220324213333_add_subject_to_watchlist_notifications.exs
│ │ │ │ ├── 20220407134152_add_api_keys_and_plans_tables.exs
│ │ │ │ ├── 20220510094118_add_custom_abis_table.exs
│ │ │ │ ├── 20220606194836_add_account_public_tags_requests.exs
│ │ │ │ ├── 20220620182600_add_account_identity_fields.exs
│ │ │ │ ├── 20220624142547_add_unique_constraints.exs
│ │ │ │ ├── 20220705195240_migrate_public_tags_addresses_to_array.exs
│ │ │ │ ├── 20220706114430_encrypt_account_data.exs
│ │ │ │ ├── 20220706153506_remove_unencrypted_fields.exs
│ │ │ │ ├── 20220706211444_set_new_indexes.exs
│ │ │ │ ├── 20220905195203_remove_guardian_tokens.exs
│ │ │ │ ├── 20221104104635_create_token_transfer_token_id_migrator_progress.exs
│ │ │ │ └── 20230502083519_add_verification_email_sent_at.exs
│ │ ├── compile_solc.js
│ │ ├── compile_solc_standard_json_input.js
│ │ ├── contracts_abi
│ │ │ ├── poa
│ │ │ │ ├── metadata.json
│ │ │ │ └── validators.json
│ │ │ └── posdao
│ │ │ │ ├── BlockRewardAuRa.json
│ │ │ │ ├── README.md
│ │ │ │ ├── StakingAuRa.json
│ │ │ │ ├── Token.json
│ │ │ │ └── ValidatorSetAuRa.json
│ │ ├── repo
│ │ │ ├── migrations
│ │ │ │ ├── .gitkeep
│ │ │ │ ├── 20180117221921_create_address.exs
│ │ │ │ ├── 20180117221922_create_blocks.exs
│ │ │ │ ├── 20180117221923_create_transactions.exs
│ │ │ │ ├── 20180212222309_create_logs.exs
│ │ │ │ ├── 20180221001948_create_internal_transactions.exs
│ │ │ │ ├── 20180424203101_create_market_history.exs
│ │ │ │ ├── 20180508183700_create_users.exs
│ │ │ │ ├── 20180508191045_create_user_contacts.exs
│ │ │ │ ├── 20180518221256_create_smart_contract_verified.exs
│ │ │ │ ├── 20180522154252_create_btree_gist_extension.exs
│ │ │ │ ├── 20180522154253_create_block_rewards.exs
│ │ │ │ ├── 20180606135149_create_tokens.exs
│ │ │ │ ├── 20180606135150_create_token_transfers.exs
│ │ │ │ ├── 20180626143840_add_inserted_at_index_to_blocks.exs
│ │ │ │ ├── 20180717204948_create_address_coin_balances.exs
│ │ │ │ ├── 20180817021704_create_address_token_balances.exs
│ │ │ │ ├── 20180821142139_create_address_names.exs
│ │ │ │ ├── 20180917182319_create_block_second_degree_relations.exs
│ │ │ │ ├── 20180918200001_create_transaction_fork.exs
│ │ │ │ ├── 20180919175123_alter_token_decimals_to_bigint.exs
│ │ │ │ ├── 20181008195723_create_administrators.exs
│ │ │ │ ├── 20181011193212_add_fields_to_internal_transactions.exs
│ │ │ │ ├── 20181015173318_add_case_insensitive_extension.exs
│ │ │ │ ├── 20181015173319_modify_users_username.exs
│ │ │ │ ├── 20181016163236_modify_user_contacts_email.exs
│ │ │ │ ├── 20181017141409_add_index_to_internal_transaction_table.exs
│ │ │ │ ├── 20181024141113_internal_transactions_composite_primary_key.exs
│ │ │ │ ├── 20181024164623_logs_composite_primary_key.exs
│ │ │ │ ├── 20181024172010_token_transfers_composite_primary_key.exs
│ │ │ │ ├── 20181026180921_create_address_current_token_balances.exs
│ │ │ │ ├── 20181029174420_update_tokens_table_decimals_from_bigint_to_numeric.exs
│ │ │ │ ├── 20181106152300_add_nonce_to_addresses.exs
│ │ │ │ ├── 20181107164103_eip6.exs
│ │ │ │ ├── 20181108205650_additional_internal_transaction_constraints.exs
│ │ │ │ ├── 20181121170616_add_block_number_to_token_transfers.exs
│ │ │ │ ├── 20181126203826_add_index_to_addresses.exs
│ │ │ │ ├── 20181206200140_rename_block_rewards_to_emission_rewards.exs
│ │ │ │ ├── 20181206200312_create_new_block_rewards.exs
│ │ │ │ ├── 20181212115448_add_indexes_to_token_transfers.exs
│ │ │ │ ├── 20181213111656_add_metadata_field_to_address_names.exs
│ │ │ │ ├── 20181221143000_create_blocks_miner_hash_index.exs
│ │ │ │ ├── 20181221145054_add_contract_methods.exs
│ │ │ │ ├── 20190102141900_index_current_token_holders.exs
│ │ │ │ ├── 20190114204640_add_tokens_holder_count.exs
│ │ │ │ ├── 20190116082843_add_created_contract_indexed_at_to_transactions.exs
│ │ │ │ ├── 20190118040301_create_tokens_primary_key.exs
│ │ │ │ ├── 20190118152240_block_second_degree_relations_composite_primary_key.exs
│ │ │ │ ├── 20190122125815_change_transaction_error_constraint.exs
│ │ │ │ ├── 20190124082812_add_index_on_transaction_nonce_and_from_address_hash.exs
│ │ │ │ ├── 20190208113202_add_unique_index_to_rewards.exs
│ │ │ │ ├── 20190208143201_add_index_on_address_hash_block_number_and_token_contract_address_hash_for_current_token_balance.exs
│ │ │ │ ├── 20190213180502_add_earliest_processing_start_to_transactions.exs
│ │ │ │ ├── 20190214135850_add_index_on_block_number_to_address_token_balances.exs
│ │ │ │ ├── 20190215080049_add_index_on_fetched_coin_balance_to_addresses.exs
│ │ │ │ ├── 20190215093358_add_compound_index_address_token_balances.exs
│ │ │ │ ├── 20190215105501_add_constructor_arguments_to_smart_contracts.exs
│ │ │ │ ├── 20190219082636_add_indexes_for_block_reward_query.exs
│ │ │ │ ├── 20190228102650_add_index_created_contract_address_hash.exs
│ │ │ │ ├── 20190228152333_change_constructor_arguments_to_text.exs
│ │ │ │ ├── 20190228220746_add_internal_transactions_indexed_at_to_blocks.exs
│ │ │ │ ├── 20190301095620_remove_duplicated_indexes.exs
│ │ │ │ ├── 20190301120328_add_index_to_consensus.exs
│ │ │ │ ├── 20190305095926_add_index_to_value_fetched_at.exs
│ │ │ │ ├── 20190313085740_add_index_symobl_in_tokens.exs
│ │ │ │ ├── 20190313103912_change_transactions_v_column_type.exs
│ │ │ │ ├── 20190314084907_add_index_to_to_address_hash.exs
│ │ │ │ ├── 20190318151809_add_inserted_at_index_to_accounts.exs
│ │ │ │ ├── 20190319081821_create_decompiled_smart_contracts.exs
│ │ │ │ ├── 20190321185644_add_old_value_for_current_token_balances.exs
│ │ │ │ ├── 20190325081658_remove_unique_address_hash_decompiled_contracts.exs
│ │ │ │ ├── 20190403080447_add_full_text_search_tokens.exs
│ │ │ │ ├── 20190421143300_add_index_to_bsdr.exs
│ │ │ │ ├── 20190424170833_change_block_size_to_nullable.exs
│ │ │ │ ├── 20190508152922_add_old_block_hash_for_transactions.exs
│ │ │ │ ├── 20190513134025_add_refetch_needed_to_block.exs
│ │ │ │ ├── 20190516140202_add_address_hash_index_to_decompiled_smart_contracts.exs
│ │ │ │ ├── 20190516160535_add_decompiled_and_verified_flag_to_addresses.exs
│ │ │ │ ├── 20190521104412_create_staking_pools.exs
│ │ │ │ ├── 20190523112839_create_staking_pools_delegators.exs
│ │ │ │ ├── 20190613065856_add_tx_hash_inserted_at_index.exs
│ │ │ │ ├── 20190619154943_reduce_transaction_status_constraint.exs
│ │ │ │ ├── 20190625085852_add_additional_contract_fields.exs
│ │ │ │ ├── 20190709043832_create_transaction_stats.exs
│ │ │ │ ├── 20190709103104_add_external_libraries_to_smart_contracts.exs
│ │ │ │ ├── 20190807111216_remove_duplicate_indexes.exs
│ │ │ │ ├── 20190807113117_create_suggested_indexes.exs
│ │ │ │ ├── 20190827120224_add_index_on_token_transfer_token_id.exs
│ │ │ │ ├── 20190905083522_create_token_instances.exs
│ │ │ │ ├── 20190910170703_create_indexes_for_block_number_in_token_transfers_and_transactions.exs
│ │ │ │ ├── 20191007082500_add_indexes_for_token_instances_query.exs
│ │ │ │ ├── 20191009121635_add_token_transfer_sorting_indexes.exs
│ │ │ │ ├── 20191010075740_add_error_to_token_instances.exs
│ │ │ │ ├── 20191018120546_create_pending_block_operations.exs
│ │ │ │ ├── 20191018140054_add_pending_internal_txs_operation.exs
│ │ │ │ ├── 20191121064805_add_block_hash_and_block_index_to_logs.exs
│ │ │ │ ├── 20191122062035_add_block_hash_to_token_transfers.exs
│ │ │ │ ├── 20191128124415_remove_duplicate_indexes_token_entities.exs
│ │ │ │ ├── 20191203112646_internal_transactions_add_to_address_hash_index.exs
│ │ │ │ ├── 20191208135613_block_rewards_block_hash_partial_index.exs
│ │ │ │ ├── 20191218120138_logs_block_number_index_index.exs
│ │ │ │ ├── 20191220113006_pending_block_operations_block_hash_partial_index.exs
│ │ │ │ ├── 20200214152058_add_token_id_to_token_balances.exs
│ │ │ │ ├── 20200410115841_create_index_address_current_token_balances_token_contract_address_hash_value.exs
│ │ │ │ ├── 20200410141202_create_index_token_transfers_token_contract_address_hash_block_number.exs
│ │ │ │ ├── 20200421102450_pending_txs.exs
│ │ │ │ ├── 20200424070607_drop_block_rewards_address_hash_address_type_block_hash_index.exs
│ │ │ │ ├── 20200518075748_create_index_blocks_miner_hash_number_index.exs
│ │ │ │ ├── 20200521090250_recreate_staking_tables.exs
│ │ │ │ ├── 20200521170002_create_token_transfers_token_contract_address_hash_token_id_block_number_index.exs
│ │ │ │ ├── 20200525115811_address_coin_balances_daily.exs
│ │ │ │ ├── 20200527144742_add_counters_table.exs
│ │ │ │ ├── 20200608075122_alter_transactions_add_error_reason.exs
│ │ │ │ ├── 20200806125649_token_add_bridged_column.exs
│ │ │ │ ├── 20200807064700_bridged_tokens_table.exs
│ │ │ │ ├── 20200812143050_add_addresses_contract_code_index.exs
│ │ │ │ ├── 20200904075501_add_bridged_token_custom_metadata.exs
│ │ │ │ ├── 20200929075625_add_bridged_token_type.exs
│ │ │ │ ├── 20201026093652_transactions_stat_add_gas_usage_column.exs
│ │ │ │ ├── 20201214203532_support_sourcify.exs
│ │ │ │ ├── 20210219080523_add_tags.exs
│ │ │ │ ├── 20210226154732_add_exchange_rate_column_to_bridged_tokens.exs
│ │ │ │ ├── 20210309104122_add_bridged_token_custom_cap.exs
│ │ │ │ ├── 20210331074008_add_pool_name_description.exs
│ │ │ │ ├── 20210422115740_add_token_id_to_current_token_balances.exs
│ │ │ │ ├── 20210423084253_address_current_token_balances_add_token_id_to_unique_index.exs
│ │ │ │ ├── 20210423091652_address_token_balances_add_token_id_to_unique_index.exs
│ │ │ │ ├── 20210423094801_address_token_balances_change_unfetched_token_balances_unique_index.exs
│ │ │ │ ├── 20210423115108_extend_token_transfers_for_erc1155.exs
│ │ │ │ ├── 20210524165427_min_missing_block_number.exs
│ │ │ │ ├── 20210527093756_transaction_stats_add_total_fee_column.exs
│ │ │ │ ├── 20210616120552_smart_contracts_add_is_vyper_flag.exs
│ │ │ │ ├── 20210701084814_support_partial_match.exs
│ │ │ │ ├── 20210811140837_add_1559_support.exs
│ │ │ │ ├── 20210823144531_tokens_add_metadata_fetch_flag.exs
│ │ │ │ ├── 20210916194004_add_file_path_for_sourcify_contracts.exs
│ │ │ │ ├── 20211006121008_add_block_is_empty_flag.exs
│ │ │ │ ├── 20211013190346_remove_duplicates_of_current_token_balances.exs
│ │ │ │ ├── 20211017135545_migrate_optimization_runs_to_int8.exs
│ │ │ │ ├── 20211018072347_add_is_empty_index.exs
│ │ │ │ ├── 20211018073652_add_token_balances_contract_address_hash_index.exs
│ │ │ │ ├── 20211018164843_transactions_block_number_index.exs
│ │ │ │ ├── 20211018170533_add_address_token_balances_address_hash_token_contract_address_hash_block_number_index.exs
│ │ │ │ ├── 20211018170638_add_logs_address_hash_transaction_hash_index.exs
│ │ │ │ ├── 20211029085117_drop_block_rewards_block_hash_partial_index.exs
│ │ │ │ ├── 20211115164817_add_check_for_bytecode_actuality.exs
│ │ │ │ ├── 20211203115010_add_contract_verification_status_table.exs
│ │ │ │ ├── 20211204184037_address_add_gas_used.exs
│ │ │ │ ├── 20211206071033_modify_address_gas_used_bigint.exs
│ │ │ │ ├── 20211210184136_add_display_name_to_address_tag.exs
│ │ │ │ ├── 20211217201759_add_has_error_in_iternal_txs_field_to_transaction.exs
│ │ │ │ ├── 20220111085751_address_add_counters.exs
│ │ │ │ ├── 20220303083252_smart_contracts_contract_code_md5.exs
│ │ │ │ ├── 20220306091504_add_implementation_name.exs
│ │ │ │ ├── 20220527131249_add_implementation_fields.exs
│ │ │ │ ├── 20220622114402_remove_staking_tables.exs
│ │ │ │ ├── 20220622140604_remove_bridged_tokens.exs
│ │ │ │ ├── 20220706101103_address_coin_balances_daily_add_primary_key.exs
│ │ │ │ ├── 20220706102257_address_coin_balances_add_primary_key.exs
│ │ │ │ ├── 20220706102504_transactions_forks_add_primary_key.exs
│ │ │ │ ├── 20220706102746_block_rewards_add_primary_key.exs
│ │ │ │ ├── 20220706105925_emission_rewards_add_primary_key.exs
│ │ │ │ ├── 20220706111510_address_names_add_primary_key.exs
│ │ │ │ ├── 20220804114005_create_event_notifications.exs
│ │ │ │ ├── 20220902083436_extend_token_name_type.exs
│ │ │ │ ├── 20220902103213_create_index_token_transfers_token_ids.exs
│ │ │ │ ├── 20220902103527_create_indexes_token_instances_token_contract_address_hash_token_id.exs
│ │ │ │ ├── 20220919105140_add_method_id_index.exs
│ │ │ │ ├── 20220926122620_extend_token_symbol_type.exs
│ │ │ │ ├── 20221104091552_add_transaction_actions_table.exs
│ │ │ │ ├── 20221104104635_create_token_transfer_token_id_migrator_progress.exs
│ │ │ │ ├── 20221114113853_remove_not_null_constraint_from_abi.exs
│ │ │ │ ├── 20221114121811_drop_internal_transactions_order_index.exs
│ │ │ │ ├── 20221117075456_modify_address_token_balances_indexes.exs
│ │ │ │ ├── 20221117080657_modify_address_current_token_balances_indexes.exs
│ │ │ │ ├── 20221120184715_add_json_compiler_settings.exs
│ │ │ │ ├── 20221125074820_drop_required_output_constraint.exs
│ │ │ │ ├── 20221126103223_add_txs_indexes.exs
│ │ │ │ ├── 20221209123459_drop_unfetched_token_balances_index.exs
│ │ │ │ ├── 20221212093406_change_index_for_pending_block_operations.exs
│ │ │ │ ├── 20221219151744_create_missing_block_ranges.exs
│ │ │ │ ├── 20221223151234_add_block_number_to_pending_block_operations.exs
│ │ │ │ ├── 20221223214711_create_withdrawals.exs
│ │ │ │ ├── 20230126205627_add_fiat_value_and_circulating_market_cap_for_tokens.exs
│ │ │ │ ├── 20230214104917_add_validators_and_constants_tables.exs
│ │ │ │ ├── 20230217095226_add_total_supply_updated_at_block.exs
│ │ │ │ ├── 20230328100414_add_transaction_action_types.exs
│ │ │ │ ├── 20230417093914_allow_nil_tx_gas_price.exs
│ │ │ │ ├── 20230425185941_add_token_icon_url.exs
│ │ │ │ ├── 20230522130735_withdrawals_gwei_amount_to_wei_amount.exs
│ │ │ │ ├── 20230530074105_market_history_add_market_cap.exs
│ │ │ │ ├── 20230605080138_add_verified_via_eth_bytecode_db.exs
│ │ │ │ ├── 20230606091935_fix_contract_creation_transactions.exs
│ │ │ │ ├── 20230613181244_address_coin_balances_block_number_index.exs
│ │ │ │ ├── 20230615130940_add_blocks_date_index.exs
│ │ │ │ └── scripts
│ │ │ │ │ ├── 20181107164103_eip6.sql
│ │ │ │ │ ├── 20181108205650_additional_internal_transaction_constraints.sql
│ │ │ │ │ ├── 20181108205650_large_additional_internal_transaction_constraints.sql
│ │ │ │ │ ├── 20181121170616_token_transfers_update_block_number_in_batches.sql
│ │ │ │ │ ├── 20181126182700_migrate_address_nonce.sql
│ │ │ │ │ ├── 20190326202921_lose_consensus_for_invalid_blocks.sql
│ │ │ │ │ ├── 20191018140054_send_block_hash_block_index_dups_to_carnitine.sql
│ │ │ │ │ ├── insert_address_current_token_balances_in_batches.sql
│ │ │ │ │ ├── internal_transaction_update_in_batches.sql
│ │ │ │ │ ├── transaction_update_in_batches.sql
│ │ │ │ │ ├── update_address_current_token_balances_in_batches.sql
│ │ │ │ │ ├── update_new_tokens_holder_count_in_batches.sql
│ │ │ │ │ └── update_replaced_transaction.sql
│ │ │ └── seeds.exs
│ │ └── repo_api
│ │ │ └── migrations
│ │ │ └── .gitkeep
│ └── test
│ │ ├── explorer
│ │ ├── account
│ │ │ └── notifier
│ │ │ │ ├── email_test.exs
│ │ │ │ ├── notify_test.exs
│ │ │ │ └── summary_test.exs
│ │ ├── accounts
│ │ │ ├── accounts_test.exs
│ │ │ ├── user_contact_test.exs
│ │ │ └── user_test.exs
│ │ ├── admin
│ │ │ ├── administrator
│ │ │ │ └── role_test.exs
│ │ │ └── recovery_test.exs
│ │ ├── admin_test.exs
│ │ ├── chain
│ │ │ ├── address
│ │ │ │ ├── coin_balance_test.exs
│ │ │ │ ├── current_token_balance_test.exs
│ │ │ │ ├── token_balance_test.exs
│ │ │ │ └── token_test.exs
│ │ │ ├── address_test.exs
│ │ │ ├── block
│ │ │ │ ├── range_test.exs
│ │ │ │ └── second_degree_relation_test.exs
│ │ │ ├── block_test.exs
│ │ │ ├── cache
│ │ │ │ ├── accounts_test.exs
│ │ │ │ ├── address_sum_minus_burnt.exs
│ │ │ │ ├── address_sum_test.exs
│ │ │ │ ├── block_number_test.exs
│ │ │ │ ├── block_test.exs
│ │ │ │ ├── blocks_test.exs
│ │ │ │ ├── contracts_counter_test.exs
│ │ │ │ ├── gas_price_oracle_test.exs
│ │ │ │ ├── new_contracts_counter_test.exs
│ │ │ │ ├── new_verified_contracts_counter_test.exs
│ │ │ │ ├── transaction_test.exs
│ │ │ │ ├── transactions_test.exs
│ │ │ │ ├── uncles_test.exs
│ │ │ │ └── verified_contracts_counter_test.exs
│ │ │ ├── csv_export
│ │ │ │ ├── address_internal_transaction_csv_exporter_test.exs
│ │ │ │ ├── address_log_csv_exporter_test.exs
│ │ │ │ ├── address_token_transfer_csv_exporter_test.exs
│ │ │ │ └── address_transaction_csv_exporter_test.exs
│ │ │ ├── data_test.exs
│ │ │ ├── decompiled_smart_contract_test.exs
│ │ │ ├── events
│ │ │ │ ├── publisher_test.exs
│ │ │ │ └── subscriber_test.exs
│ │ │ ├── hash
│ │ │ │ ├── address_test.exs
│ │ │ │ ├── full_test.exs
│ │ │ │ └── nonce_test.exs
│ │ │ ├── hash_test.exs
│ │ │ ├── import
│ │ │ │ └── runner
│ │ │ │ │ ├── address
│ │ │ │ │ ├── current_token_balances_test.exs
│ │ │ │ │ └── token_balances_test.exs
│ │ │ │ │ ├── addresses_test.exs
│ │ │ │ │ ├── blocks_test.exs
│ │ │ │ │ ├── internal_transactions_test.exs
│ │ │ │ │ ├── tokens_test.exs
│ │ │ │ │ └── transactions_test.exs
│ │ │ ├── import_test.exs
│ │ │ ├── internal_transaction
│ │ │ │ ├── call_type_test.exs
│ │ │ │ └── type_test.exs
│ │ │ ├── internal_transaction_test.exs
│ │ │ ├── log_test.exs
│ │ │ ├── smart_contract_test.exs
│ │ │ ├── supply
│ │ │ │ ├── proof_of_authority_test.exs
│ │ │ │ └── rsk_test.exs
│ │ │ ├── token_test.exs
│ │ │ ├── token_transfer_test.exs
│ │ │ ├── transaction
│ │ │ │ ├── fork_test.exs
│ │ │ │ ├── history
│ │ │ │ │ ├── historian_test.exs
│ │ │ │ │ └── transaction_stats_test.exs
│ │ │ │ └── status_test.exs
│ │ │ ├── transaction_test.exs
│ │ │ ├── wei_test.exs
│ │ │ └── withdrawal_test.exs
│ │ ├── chain_spec
│ │ │ ├── geth
│ │ │ │ └── importer_test.exs
│ │ │ └── parity
│ │ │ │ └── importer_test.exs
│ │ ├── chain_test.exs
│ │ ├── counters
│ │ │ ├── addresses_counter_test.exs
│ │ │ ├── addresses_tokens_usd_sum_counter_test.exs
│ │ │ ├── addresses_with_balance_counter_test.exs
│ │ │ └── average_block_time_test.exs
│ │ ├── etherscan
│ │ │ └── logs_test.exs
│ │ ├── etherscan_test.exs
│ │ ├── exchange_rates
│ │ │ ├── exchange_rates_test.exs
│ │ │ ├── source
│ │ │ │ ├── coin_gecko_test.exs
│ │ │ │ └── coin_market_cap_test.exs
│ │ │ └── token_exchange_rates_test.exs
│ │ ├── graphql_test.exs
│ │ ├── history
│ │ │ └── process_test.exs
│ │ ├── market
│ │ │ ├── history
│ │ │ │ ├── cataloger_test.exs
│ │ │ │ └── source
│ │ │ │ │ └── price
│ │ │ │ │ └── crypto_compare_test.exs
│ │ │ ├── market_history_cache_test.exs
│ │ │ └── market_test.exs
│ │ ├── repo
│ │ │ └── config_helper_test.exs
│ │ ├── repo_test.exs
│ │ ├── smart_contract
│ │ │ ├── compiler_version_test.exs
│ │ │ ├── helper_test.exs
│ │ │ ├── reader_test.exs
│ │ │ ├── solidity
│ │ │ │ ├── code_compiler_test.exs
│ │ │ │ ├── publisher_test.exs
│ │ │ │ └── verifier_test.exs
│ │ │ └── writer_test.exs
│ │ ├── token
│ │ │ ├── balance_reader_test.exs
│ │ │ ├── instance_metadata_retriever_test.exs
│ │ │ └── metadata_retriever_test.exs
│ │ ├── token_transfer_token_id_migration
│ │ │ ├── lowest_block_number_updater_test.exs
│ │ │ └── worker_test.exs
│ │ └── validator
│ │ │ ├── metadata_importer_test.exs
│ │ │ └── metadata_retriever_test.exs
│ │ ├── string
│ │ └── chars
│ │ │ └── explorer
│ │ │ └── chain
│ │ │ ├── address_test.exs
│ │ │ └── data_test.exs
│ │ ├── support
│ │ ├── chain
│ │ │ └── import
│ │ │ │ └── runner_case.ex
│ │ ├── data_case.ex
│ │ ├── factory.ex
│ │ ├── fakes
│ │ │ ├── no_op_source.ex
│ │ │ └── one_coin_source.ex
│ │ └── fixture
│ │ │ ├── chain_spec
│ │ │ ├── classic.json
│ │ │ ├── foundation.json
│ │ │ ├── optimism_genesis.json
│ │ │ ├── polygon_genesis.json
│ │ │ └── qdai_genesis.json
│ │ │ ├── exchange_rates
│ │ │ └── coin_gecko.json
│ │ │ ├── smart_contract
│ │ │ ├── ERC677.sol
│ │ │ ├── compiler_tests.json
│ │ │ ├── contract_from_factory.sol
│ │ │ ├── contract_with_lib.json
│ │ │ ├── contract_with_lib.sol
│ │ │ ├── home_bridge.sol
│ │ │ ├── issue_3082.sol
│ │ │ ├── issue_4758.sol
│ │ │ ├── issue_5114.sol
│ │ │ ├── issue_5127.sol
│ │ │ ├── issue_5431.sol
│ │ │ ├── issue_with_constructor_args.sol
│ │ │ ├── large_smart_contract.sol
│ │ │ ├── solc_bin.json
│ │ │ ├── solidity_0.5.9_smart_contract.sol
│ │ │ ├── solidity_5.11_new_whisper_metadata.json
│ │ │ ├── solidity_5.11_new_whisper_metadata.sol
│ │ │ ├── standard_input.json
│ │ │ └── vyper.vy
│ │ │ └── vcr_cassettes
│ │ │ ├── .gitkeep
│ │ │ ├── block_importer_download_block_1_downloads_the_block.json
│ │ │ ├── block_importer_import_1_duplicate_block.json
│ │ │ ├── block_importer_import_1_pending.json
│ │ │ ├── block_importer_import_1_saves_the_block.json
│ │ │ ├── ethereumex_extensions_trace_transaction_1.json
│ │ │ ├── import_block_perform_1_duplicate.json
│ │ │ ├── import_block_perform_1_earliest.json
│ │ │ ├── import_block_perform_1_integer.json
│ │ │ ├── import_block_perform_1_latest.json
│ │ │ ├── import_block_perform_1_string.json
│ │ │ ├── import_block_perform_later_1_latest.json
│ │ │ ├── import_internal_transaction_perform_1.json
│ │ │ ├── import_receipt_perform_1.json
│ │ │ ├── import_skipped_blocks_perform_1.json
│ │ │ ├── import_transaction_perform_1.json
│ │ │ ├── internal_transaction_importer_import_1.json
│ │ │ ├── internal_transaction_importer_import_1_from_core-trace.json
│ │ │ ├── internal_transaction_importer_import_1_with_contract_creation.json
│ │ │ ├── transaction_importer_binds_internal_transactions.json
│ │ │ ├── transaction_importer_creates_a_from_address.json
│ │ │ ├── transaction_importer_creates_a_to_address.json
│ │ │ ├── transaction_importer_creates_a_to_address_from_creates.json
│ │ │ ├── transaction_importer_download_transaction.json
│ │ │ ├── transaction_importer_download_transaction_with_a_bad_hash.json
│ │ │ ├── transaction_importer_import_1_failed.json
│ │ │ ├── transaction_importer_import_1_out_of_gas.json
│ │ │ ├── transaction_importer_import_1_pending.json
│ │ │ ├── transaction_importer_import_1_receipt.json
│ │ │ ├── transaction_importer_import_saves_the_transaction.json
│ │ │ ├── transaction_importer_saves_the_association.json
│ │ │ ├── transaction_importer_txn_without_block.json
│ │ │ └── transaction_importer_updates_the_association.json
│ │ └── test_helper.exs
└── indexer
│ ├── .gitignore
│ ├── README.md
│ ├── config
│ ├── config.exs
│ ├── dev.exs
│ ├── dev
│ │ ├── arbitrum.exs
│ │ ├── besu.exs
│ │ ├── erigon.exs
│ │ ├── ganache.exs
│ │ ├── geth.exs
│ │ ├── nethermind.exs
│ │ └── rsk.exs
│ ├── prod.exs
│ ├── prod
│ │ ├── arbitrum.exs
│ │ ├── besu.exs
│ │ ├── erigon.exs
│ │ ├── ganache.exs
│ │ ├── geth.exs
│ │ ├── nethermind.exs
│ │ └── rsk.exs
│ ├── runtime
│ │ └── test.exs
│ ├── test.exs
│ └── test
│ │ ├── arbitrum.exs
│ │ ├── besu.exs
│ │ ├── erigon.exs
│ │ ├── ganache.exs
│ │ ├── geth.exs
│ │ ├── nethermind.exs
│ │ └── rsk.exs
│ ├── lib
│ ├── indexer.ex
│ └── indexer
│ │ ├── application.ex
│ │ ├── block
│ │ ├── catchup
│ │ │ ├── bound_interval_supervisor.ex
│ │ │ ├── fetcher.ex
│ │ │ ├── helper.ex
│ │ │ ├── missing_ranges_collector.ex
│ │ │ ├── sequence.ex
│ │ │ └── supervisor.ex
│ │ ├── fetcher.ex
│ │ ├── fetcher
│ │ │ └── receipts.ex
│ │ └── realtime
│ │ │ ├── fetcher.ex
│ │ │ └── supervisor.ex
│ │ ├── bound_interval.ex
│ │ ├── bound_queue.ex
│ │ ├── buffered_task.ex
│ │ ├── fetcher.ex
│ │ ├── fetcher
│ │ ├── block_reward.ex
│ │ ├── coin_balance.ex
│ │ ├── coin_balance_on_demand.ex
│ │ ├── contract_code.ex
│ │ ├── empty_blocks_sanitizer.ex
│ │ ├── first_trace_on_demand.ex
│ │ ├── internal_transaction.ex
│ │ ├── pending_block_operations_sanitizer.ex
│ │ ├── pending_transaction.ex
│ │ ├── replaced_transaction.ex
│ │ ├── token.ex
│ │ ├── token_balance.ex
│ │ ├── token_balance_on_demand.ex
│ │ ├── token_instance
│ │ │ ├── helper.ex
│ │ │ ├── realtime.ex
│ │ │ ├── retry.ex
│ │ │ └── sanitize.ex
│ │ ├── token_total_supply_on_demand.ex
│ │ ├── token_total_supply_updater.ex
│ │ ├── token_updater.ex
│ │ ├── transaction_action.ex
│ │ ├── uncle_block.ex
│ │ └── withdrawal.ex
│ │ ├── logger.ex
│ │ ├── memory
│ │ ├── monitor.ex
│ │ └── shrinkable.ex
│ │ ├── pending_ops_cleaner.ex
│ │ ├── pending_transactions_sanitizer.ex
│ │ ├── prometheus
│ │ ├── instrumenter.ex
│ │ └── pending_block_operations_collector.ex
│ │ ├── supervisor.ex
│ │ ├── temporary
│ │ ├── blocks_transactions_mismatch.ex
│ │ ├── uncataloged_token_transfers.ex
│ │ └── uncles_without_index.ex
│ │ ├── token_balances.ex
│ │ ├── tracer.ex
│ │ └── transform
│ │ ├── address_coin_balances.ex
│ │ ├── address_coin_balances_daily.ex
│ │ ├── address_token_balances.ex
│ │ ├── addresses.ex
│ │ ├── blocks.ex
│ │ ├── blocks
│ │ ├── base.ex
│ │ └── clique.ex
│ │ ├── mint_transfers.ex
│ │ ├── token_transfers.ex
│ │ └── transaction_actions.ex
│ ├── mix.exs
│ └── test
│ ├── indexer
│ ├── block
│ │ ├── catchup
│ │ │ ├── bound_interval_supervisor_test.exs
│ │ │ ├── fetcher_test.exs
│ │ │ ├── missing_ranges_collector_test.exs
│ │ │ └── sequence_test.exs
│ │ ├── fetcher
│ │ │ └── receipts_test.exs
│ │ ├── fetcher_test.exs
│ │ └── realtime
│ │ │ └── fetcher_test.exs
│ ├── buffered_task_test.exs
│ ├── fetcher
│ │ ├── block_reward_test.exs
│ │ ├── coin_balance_on_demand_test.exs
│ │ ├── coin_balance_test.exs
│ │ ├── contract_code_test.exs
│ │ ├── internal_transaction_test.exs
│ │ ├── pending_block_operations_sanitizer_test.exs
│ │ ├── pending_transaction_test.exs
│ │ ├── replaced_transaction_test.exs
│ │ ├── token_balance_test.exs
│ │ ├── token_test.exs
│ │ ├── token_updater_test.exs
│ │ ├── uncle_block_test.exs
│ │ └── withdrawal_test.exs
│ ├── pending_ops_cleaner_test.exs
│ ├── temporary
│ │ └── uncataloged_token_transfers_test.exs
│ ├── token_balances_test.exs
│ └── transform
│ │ ├── address_coin_balances_test.exs
│ │ ├── address_token_balances_test.exs
│ │ ├── addresses.exs
│ │ ├── blocks
│ │ ├── base_test.exs
│ │ └── clique_test.exs
│ │ ├── blocks_test.exs
│ │ ├── mint_transfers_test.exs
│ │ └── token_transfers_test.exs
│ ├── indexer_test.exs
│ ├── support
│ └── indexer
│ │ ├── block
│ │ └── catchup_supervisor_case.ex
│ │ └── fetcher
│ │ ├── block_reward_supervisor_case.ex
│ │ ├── coin_balance_supervisor_case.ex
│ │ ├── contract_code_supervisor_case.ex
│ │ ├── internal_transaction_supervisor_case.ex
│ │ ├── pending_transaction_supervisor_case.ex
│ │ ├── replaced_transaction_supervisor_case.ex
│ │ ├── token_balance_supervisor_case.ex
│ │ ├── token_supervisor_case.ex
│ │ ├── token_updater_supervisor_case.ex
│ │ ├── uncle_block_supervisor_case.ex
│ │ └── withdrawal_supervisor_case.ex
│ └── test_helper.exs
├── appspec.yml
├── bin
├── deploy
├── deployment
│ ├── build
│ ├── health_check
│ ├── migrate
│ ├── start
│ └── stop
├── install_chrome_headless.sh
└── test
├── blockscout.png
├── config
├── config.exs
├── config_helper.exs
├── dev.exs
├── prod.exs
├── runtime.exs
├── runtime
│ ├── dev.exs
│ ├── prod.exs
│ └── test.exs
└── test.exs
├── coveralls.json
├── cspell.json
├── deploy
└── testing
│ └── eth-goerli
│ ├── .sops.yaml
│ ├── secrets.yaml
│ └── values.yaml
├── docker-compose
├── README.md
├── docker-compose-no-build-erigon.yml
├── docker-compose-no-build-frontend.yml
├── docker-compose-no-build-ganache.yml
├── docker-compose-no-build-geth-clique-consensus.yml
├── docker-compose-no-build-geth.yml
├── docker-compose-no-build-hardhat-network.yml
├── docker-compose-no-build-nethermind.yml
├── docker-compose-no-build-no-db-container.yml
├── docker-compose-no-rust-services.yml
├── docker-compose.yml
├── envs
│ ├── common-blockscout.env
│ ├── common-frontend.env
│ ├── common-smart-contract-verifier.env
│ ├── common-stats.env
│ └── common-visualizer.env
├── proxy
│ └── nginx.conf
└── services
│ ├── docker-compose-db.yml
│ ├── docker-compose-frontend.yml
│ ├── docker-compose-nginx.yml
│ ├── docker-compose-redis.yml
│ ├── docker-compose-sig-provider.yml
│ ├── docker-compose-smart-contract-verifier.yml
│ ├── docker-compose-stats.yml
│ └── docker-compose-visualizer.yml
├── docker
├── Dockerfile
├── Makefile
└── README.md
├── mix.exs
├── mix.lock
├── prometheus.yml
└── rel
├── commands
├── migrate.sh
└── seed.sh
├── config.exs
├── plugins
└── .gitignore
└── vm.args
/.dockerignore:
--------------------------------------------------------------------------------
1 | _build
2 | deps
3 | apps/block_scout_web/assets/node_modules
4 | apps/explorer/node_modules
5 | test
6 | .git
7 | .circleci
8 | logs
9 | apps/*/test
10 |
--------------------------------------------------------------------------------
/.formatter.exs:
--------------------------------------------------------------------------------
1 | [
2 | inputs: [
3 | ".credo.exs",
4 | ".formatter.exs",
5 | "apps/*/mix.exs",
6 | "apps/*/{benchmarks,config,lib,priv,test}/**/*.{ex,exs}",
7 | "mix.exs",
8 | "{config}/**/*.{ex,exs}"
9 | ],
10 | line_length: 120
11 | ]
12 |
--------------------------------------------------------------------------------
/.pairs:
--------------------------------------------------------------------------------
1 | pairs:
2 | cj: CJ Bryan; cj
3 | dr: Doc Ritezel; doc
4 | mo: Matt Olenick; matto
5 | db: Derek Barnes; dgb
6 | rdwb: Desmond Bowe; des
7 |
8 | email:
9 | prefix: pair
10 | domain: ministryofvelocity.com
11 | no_solo_prefix: true
12 |
13 | global: true
14 |
--------------------------------------------------------------------------------
/.tool-versions:
--------------------------------------------------------------------------------
1 | elixir 1.14.5-otp-25
2 | erlang 25.3.2.3
3 | nodejs 18.16.1
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/.sobelow-conf:
--------------------------------------------------------------------------------
1 | [
2 | verbose: false,
3 | private: true,
4 | skip: true,
5 | router: "lib/block_scout_web/router.ex",
6 | exit: "low",
7 | format: "compact",
8 | ignore: ["Config.Headers", "Config.CSWH", "XSS.SendResp", "XSS.Raw"],
9 | ignore_files: [
10 | "apps/block_scout_web/lib/block_scout_web/smart_contracts_api_v2_router.ex"
11 | ]
12 | ]
13 |
--------------------------------------------------------------------------------
/apps/block_scout_web/assets/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [["@babel/preset-env", { "useBuiltIns": "usage", "corejs": { "version": 3 } }]]
3 | }
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/assets/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "standard",
3 | "env": {
4 | "browser": true
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/apps/block_scout_web/assets/README.md:
--------------------------------------------------------------------------------
1 | # Javascript structure files
2 |
3 | ## lib
4 |
5 | * This folder is used to place `component` files, that may span in multiple pages.
6 |
7 | ## pages
8 |
9 | * This folder is used to place `page` specific files, that won't be reusable in other locations.
10 |
--------------------------------------------------------------------------------
/apps/block_scout_web/assets/__mocks__/css/app.scss.js:
--------------------------------------------------------------------------------
1 | export default {
2 | primary: "#4786ff",
3 | secondary: "#ced4da"
4 | }
5 |
--------------------------------------------------------------------------------
/apps/block_scout_web/assets/__tests__/lib/utils.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @jest-environment jsdom
3 | */
4 |
5 | import { escapeHtml } from '../../js/lib/utils'
6 |
7 | test('escapeHtml', () => {
8 | expect(escapeHtml('
3 |
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/advertisement/text_ad/index.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
:
-
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/api_docs/_metatags.html.eex:
--------------------------------------------------------------------------------
1 |
2 | <%= gettext "API for the %{subnetwork} - BlockScout", subnetwork: LayoutView.subnetwork_title() %>
3 |
4 | ">
5 |
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/api_docs/_module_item.html.eex:
--------------------------------------------------------------------------------
1 |
2 | <%= "#{String.capitalize(@module.name)}" %>
3 | ?module=<%= @module.name %>
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/block/_link.html.eex:
--------------------------------------------------------------------------------
1 | <%= link(
2 | gettext("Block #%{number}", number: to_string(@block.number)),
3 | to: block_path(BlockScoutWeb.Endpoint, :show, @block)
4 | ) %>
5 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/block/_number_link.html.eex:
--------------------------------------------------------------------------------
1 | <%= link(
2 | to_string(@block.number),
3 | to: block_path(BlockScoutWeb.Endpoint, :show, @block)
4 | ) %>
5 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/block_transaction/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= render BlockScoutWeb.BlockView, "_metatags.html", conn: @conn, block: @block %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/block_withdrawal/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= render BlockScoutWeb.BlockView, "_metatags.html", conn: @conn, block: @block %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_btn_external_link.html.eex:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_btn_line.html.eex:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_changed_bytecode_warning.html.eex:
--------------------------------------------------------------------------------
1 |
2 | <%= render BlockScoutWeb.CommonComponentsView, "_info.html" %>
3 | <%= gettext("Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.") %>
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_channel_disconnected_message.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%= @text %>
4 |
5 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_i_tooltip_2.html.eex:
--------------------------------------------------------------------------------
1 | "
3 | data-boundary="window"
4 | data-container="body"
5 | data-html="true"
6 | data-placement="top"
7 | data-toggle="tooltip"
8 | title="<%= @text %>"
9 | >
10 |
11 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_info.html.eex:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_loading_spinner.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | <%= if assigns[:loading_text], do: @loading_text %>
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_progress_from_to.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
<%= @from %>
4 |
<%= @to %>
5 |
6 |
9 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_svg_minus.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_table-loader.html.eex:
--------------------------------------------------------------------------------
1 | <%= for _r <- 1..5 do %>
2 |
3 | <%= for _c <- 1..@columns_num do %>
4 |
5 |
6 |
7 | <% end %>
8 |
9 | <% end %>
10 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/common_components/_tenderly_link.html.eex:
--------------------------------------------------------------------------------
1 | <% tenderly_link = "https://dashboard.tenderly.co/tx#{@tenderly_chain_path}/" <> "0x" <> Base.encode16(@transaction_hash.bytes, case: :lower) %>
2 |
3 | Open in Tenderly <%= render BlockScoutWeb.IconsView, "_external_link.html" %>
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/form/_tag.html.eex:
--------------------------------------------------------------------------------
1 | ">
2 | <%= @text %>
3 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/form/text_field.html.eex:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/icons/_accounts_icon.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/icons/_active_icon.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/icons/_apps_icon.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/icons/_block_icon.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/icons/_check_dark_forest_icon.html.eex:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/icons/_inactive_icon.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/icons/_search_icon.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/icons/_test_network_icon.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/layout/_default_title.html.eex:
--------------------------------------------------------------------------------
1 |
2 | <%= gettext("%{subnetwork} Explorer - BlockScout", subnetwork: subnetwork_title()) %>
3 |
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/search/_empty_td.html.eex:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/search/_name_td.html.eex:
--------------------------------------------------------------------------------
1 |
2 | <%= if @result.name do %>
3 |
4 | <%= highlight_search_result(@result.name, @query) %>
5 |
6 | <% end %>
7 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/tokens/_token_icon_default.html.eex:
--------------------------------------------------------------------------------
1 | " alt=""/>
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/tokens/contract/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= BlockScoutWeb.Tokens.OverviewView.render "_metatags.html", conn: @conn, token: @token %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/tokens/holder/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= BlockScoutWeb.Tokens.OverviewView.render "_metatags.html", conn: @conn, token: @token %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/tokens/inventory/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= BlockScoutWeb.Tokens.OverviewView.render "_metatags.html", conn: @conn, token: @token %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/tokens/transfer/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= BlockScoutWeb.Tokens.OverviewView.render "_metatags.html", conn: @conn, token: @token %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction/_actions_aave.html.eex:
--------------------------------------------------------------------------------
1 | <%= @action %> <%= @amount %> <%= @symbol %> <%= @tail %>
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction/_actions_to.html.eex:
--------------------------------------------------------------------------------
1 |
2 | <%= @address %>
3 | <%= BlockScoutWeb.AddressView.trimmed_hash(@address) %>
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction/_actions_uniswap.html.eex:
--------------------------------------------------------------------------------
1 | <%= @action %> <%= @amount0 %> <%= @symbol0 %> <%= @conjunction %> <%= @amount1 %> <%= @symbol1 %> <%= @tail %>
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction/_link.html.eex:
--------------------------------------------------------------------------------
1 | <%= link(@transaction_hash,
2 | to: transaction_path(BlockScoutWeb.Endpoint, :show, @transaction_hash),
3 | "data-test": "transaction_hash_link",
4 | class: "text-truncate") %>
5 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction/_link_to_token_instance.html.eex:
--------------------------------------------------------------------------------
1 | <%= "[" %><%= link(short_token_id(@token_id, 30), to: token_instance_path(BlockScoutWeb.Endpoint, :show, @transfer.token.contract_address_hash, to_string(@token_id)), "data-test": "token_link") %><%= "]" %>
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction/_link_to_token_symbol.html.eex:
--------------------------------------------------------------------------------
1 | <%= link(token_symbol(@transfer.token), to: token_path(BlockScoutWeb.Endpoint, :show, @transfer.token.contract_address_hash), "data-test": "token_link") %>
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction/_transfer_token_with_id.html.eex:
--------------------------------------------------------------------------------
1 | <%= "TokenID " %><%= render BlockScoutWeb.TransactionView, "_link_to_token_instance.html", transfer: @transfer, token_id: @token_id %>
2 | <%= " " %><%= render BlockScoutWeb.TransactionView, "_link_to_token_symbol.html", transfer: @transfer %>
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction/show_internal_transactions.html.eex:
--------------------------------------------------------------------------------
1 | <%= render BlockScoutWeb.TransactionInternalTransactionView, "index.html", assigns %>
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction/show_token_transfers.html.eex:
--------------------------------------------------------------------------------
1 | <%= render BlockScoutWeb.TransactionTokenTransferView, "index.html", assigns %>
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction_internal_transaction/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= render BlockScoutWeb.TransactionView, "_metatags.html", conn: @conn, transaction: @transaction %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction_log/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= render BlockScoutWeb.TransactionView, "_metatags.html", conn: @conn, transaction: @transaction %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction_raw_trace/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= render BlockScoutWeb.TransactionView, "_metatags.html", conn: @conn, transaction: @transaction %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction_raw_trace/index.html.eex:
--------------------------------------------------------------------------------
1 |
2 | <%= render BlockScoutWeb.TransactionView, "overview.html", assigns %>
3 |
4 |
5 | <%= render BlockScoutWeb.TransactionView, "_tabs.html", assigns %>
6 |
7 | <%= render "_card_body.html", assigns %>
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction_state/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= render BlockScoutWeb.TransactionView, "_metatags.html", conn: @conn, transaction: @transaction %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/templates/transaction_token_transfer/_metatags.html.eex:
--------------------------------------------------------------------------------
1 | <%= render BlockScoutWeb.TransactionView, "_metatags.html", conn: @conn, transaction: @transaction %>
2 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/tracer.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Tracer do
2 | @moduledoc false
3 |
4 | use Spandex.Tracer, otp_app: :block_scout_web
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/account/api/v1/account_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Account.Api.V1.AccountView do
2 | def render("message.json", %{message: message}) do
3 | %{
4 | "message" => message
5 | }
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/account/api_key_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Account.ApiKeyView do
2 | use BlockScoutWeb, :view
3 |
4 | alias Explorer.Account.Api.Key
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/account/auth_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Account.AuthView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/account/common_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Account.CommonView do
2 | use BlockScoutWeb, :view
3 |
4 | def nav_class(active_item, item) do
5 | if active_item == item do
6 | "dropdown-item active fs-14"
7 | else
8 | "dropdown-item fs-14"
9 | end
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/account/tag_address_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Account.TagAddressView do
2 | use BlockScoutWeb, :view
3 |
4 | import BlockScoutWeb.AddressView, only: [trimmed_hash: 1]
5 |
6 | alias Explorer.Account.TagAddress
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/account/tag_transaction_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Account.TagTransactionView do
2 | use BlockScoutWeb, :view
3 |
4 | alias Explorer.Account.TagTransaction
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/account/watchlist_address_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Account.WatchlistAddressView do
2 | use BlockScoutWeb, :view
3 | import BlockScoutWeb.AddressView, only: [trimmed_hash: 1]
4 | import BlockScoutWeb.WeiHelper, only: [format_wei_value: 2]
5 |
6 | def balance_ether(nil), do: ""
7 |
8 | def balance_ether(balance) do
9 | format_wei_value(balance, :ether)
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_contract_verification_common_fields_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressContractVerificationCommonFieldsView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_contract_verification_via_flattened_code_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressContractVerificationViaFlattenedCodeView do
2 | use BlockScoutWeb, :view
3 |
4 | alias Explorer.Chain
5 | alias Explorer.Chain.SmartContract
6 | alias Explorer.SmartContract.RustVerifierInterface
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_contract_verification_via_json_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressContractVerificationViaJsonView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_contract_verification_via_multi_part_files_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressContractVerificationViaMultiPartFilesView do
2 | use BlockScoutWeb, :view
3 |
4 | alias Explorer.Chain
5 | alias Explorer.Chain.SmartContract
6 | alias Explorer.SmartContract.RustVerifierInterface
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_contract_verification_via_standard_json_input_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressContractVerificationViaStandardJsonInputView do
2 | use BlockScoutWeb, :view
3 |
4 | alias Explorer.Chain
5 | alias Explorer.Chain.SmartContract
6 | end
7 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_contract_verification_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressContractVerificationView do
2 | use BlockScoutWeb, :view
3 |
4 | alias Explorer.SmartContract.RustVerifierInterface
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_contract_verification_vyper_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressContractVerificationVyperView do
2 | use BlockScoutWeb, :view
3 |
4 | alias Explorer.Chain
5 | alias Explorer.Chain.SmartContract
6 | end
7 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_internal_transaction_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressInternalTransactionView do
2 | use BlockScoutWeb, :view
3 |
4 | alias BlockScoutWeb.AccessHelper
5 | alias Explorer.Chain.Address
6 |
7 | def format_current_filter(filter) do
8 | case filter do
9 | "to" -> gettext("To")
10 | "from" -> gettext("From")
11 | _ -> gettext("All")
12 | end
13 | end
14 | end
15 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_logs_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressLogsView do
2 | use BlockScoutWeb, :view
3 |
4 | alias Explorer.Chain.Address
5 |
6 | import BlockScoutWeb.AddressView, only: [decode: 2]
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_read_contract_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressReadContractView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_read_proxy_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressReadProxyView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_token_transfer_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressTokenTransferView do
2 | use BlockScoutWeb, :view
3 |
4 | alias BlockScoutWeb.AccessHelper
5 | alias Explorer.Chain.Address
6 |
7 | def format_current_filter(filter) do
8 | case filter do
9 | "to" -> gettext("To")
10 | "from" -> gettext("From")
11 | _ -> gettext("All")
12 | end
13 | end
14 | end
15 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_token_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressTokenView do
2 | use BlockScoutWeb, :view
3 |
4 | alias BlockScoutWeb.{AddressView, ChainView}
5 | alias Explorer.Chain
6 | alias Explorer.Chain.{Address, Wei}
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_transaction_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressTransactionView do
2 | use BlockScoutWeb, :view
3 |
4 | alias BlockScoutWeb.AccessHelper
5 | alias Explorer.Chain.Address
6 |
7 | def format_current_filter(filter) do
8 | case filter do
9 | "to" -> gettext("To")
10 | "from" -> gettext("From")
11 | _ -> gettext("All")
12 | end
13 | end
14 | end
15 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_validation_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressValidationView do
2 | use BlockScoutWeb, :view
3 |
4 | # import BlockScoutWeb.AddressView, only: [contract?: 1, smart_contract_verified?: 1]
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_withdrawal_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressWithdrawalView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_write_contract_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressWriteContractView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/address_write_proxy_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressWriteProxyView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/admin/dashboard_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Admin.DashboardView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/admin/session_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Admin.SessionView do
2 | use BlockScoutWeb, :view
3 |
4 | import BlockScoutWeb.AdminRouter.Helpers
5 |
6 | alias BlockScoutWeb.FormView
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/admin/setup_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Admin.SetupView do
2 | use BlockScoutWeb, :view
3 |
4 | import BlockScoutWeb.AdminRouter.Helpers
5 |
6 | alias BlockScoutWeb.FormView
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/advertisement/banners_ad_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Advertisement.BannersAdView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/advertisement/text_ad_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Advertisement.TextAdView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/api/v1/supply_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.API.V1.SupplyView do
2 | use BlockScoutWeb, :view
3 |
4 | def render("supply.json", %{total: total_supply, circulating: circulating_supply}) do
5 | %{
6 | "total_supply" => total_supply,
7 | "circulating_supply" => circulating_supply
8 | }
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/api/v2/api_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.API.V2.ApiView do
2 | def render("message.json", %{message: message}) do
3 | %{
4 | "message" => message
5 | }
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/api/v2/config_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.API.V2.ConfigView do
2 | def render("json_rpc_url.json", %{url: url}) do
3 | %{
4 | "json_rpc_url" => url
5 | }
6 | end
7 |
8 | def render("backend_version.json", %{version: version}) do
9 | %{
10 | "backend_version" => version
11 | }
12 | end
13 | end
14 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/block_withdrawal_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.BlockWithdrawalView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/common_components_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.CommonComponentsView do
2 | use BlockScoutWeb, :view
3 |
4 | def balance_percentage_enabled?(total_supply) do
5 | Application.get_env(:block_scout_web, :show_percentage) && total_supply > 0
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/error_422.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Error422View do
2 | use BlockScoutWeb, :view
3 |
4 | @dialyzer :no_match
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/icons_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.IconsView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/internal_server_error_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.InternalServerErrorView do
2 | use BlockScoutWeb, :view
3 |
4 | @dialyzer :no_match
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/log_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.LogView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/page_not_found.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.PageNotFoundView do
2 | use BlockScoutWeb, :view
3 |
4 | @dialyzer :no_match
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/pending_transaction_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.PendingTransactionView do
2 | use BlockScoutWeb, :view
3 |
4 | @dialyzer :no_match
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/tokens/contract_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Tokens.ContractView do
2 | use BlockScoutWeb, :view
3 |
4 | alias BlockScoutWeb.Tokens.OverviewView
5 | alias Explorer.Chain.Address
6 | end
7 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/tokens/instance/holder_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Tokens.Instance.HolderView do
2 | use BlockScoutWeb, :view
3 |
4 | alias BlockScoutWeb.Tokens.Instance.OverviewView
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/tokens/instance/metadata_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Tokens.Instance.MetadataView do
2 | use BlockScoutWeb, :view
3 |
4 | alias BlockScoutWeb.Tokens.Instance.OverviewView
5 |
6 | def format_metadata(nil), do: ""
7 |
8 | def format_metadata(metadata), do: Poison.encode!(metadata, %{pretty: true})
9 | end
10 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/tokens/instance/transfer_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Tokens.Instance.TransferView do
2 | use BlockScoutWeb, :view
3 |
4 | alias BlockScoutWeb.Tokens.Instance.OverviewView
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/tokens/instance_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Tokens.InstanceView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/tokens/inventory_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Tokens.InventoryView do
2 | use BlockScoutWeb, :view
3 |
4 | import BlockScoutWeb.Tokens.Instance.OverviewView, only: [media_src: 1, media_type: 1]
5 |
6 | alias BlockScoutWeb.Tokens.OverviewView
7 | alias Explorer.Chain
8 | end
9 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/tokens/transfer_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Tokens.TransferView do
2 | use BlockScoutWeb, :view
3 |
4 | alias BlockScoutWeb.Tokens.OverviewView
5 | alias Explorer.Chain
6 | alias Explorer.Chain.Address
7 | end
8 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/transaction_internal_transaction_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.TransactionInternalTransactionView do
2 | use BlockScoutWeb, :view
3 | @dialyzer :no_match
4 | end
5 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/transaction_log_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.TransactionLogView do
2 | use BlockScoutWeb, :view
3 | @dialyzer :no_match
4 |
5 | import BlockScoutWeb.AddressView, only: [decode: 2, implementation_name: 1, primary_name: 1]
6 | end
7 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/transaction_token_transfer_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.TransactionTokenTransferView do
2 | use BlockScoutWeb, :view
3 |
4 | alias Explorer.Chain
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/visualize_sol2uml_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.VisualizeSol2umlView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/lib/block_scout_web/views/withdrawal_view.ex:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.WithdrawalView do
2 | use BlockScoutWeb, :view
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/test/block_scout_web/controllers/page_not_found_controller_test.exs:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.PageNotFoundControllerTest do
2 | use BlockScoutWeb.ConnCase
3 |
4 | describe "GET index/2" do
5 | test "returns 404 status", %{conn: conn} do
6 | conn = get(conn, "/wrong", %{})
7 |
8 | assert html_response(conn, 404)
9 | end
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/block_scout_web/test/block_scout_web/views/address_transaction_view_test.exs:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.AddressTransactionViewTest do
2 | use BlockScoutWeb.ConnCase, async: true
3 |
4 | doctest BlockScoutWeb.AddressTransactionView
5 | end
6 |
--------------------------------------------------------------------------------
/apps/block_scout_web/test/block_scout_web/views/tokens/read_contract_view_test.exs:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Tokens.ReadContractViewTest do
2 | use BlockScoutWeb.ConnCase, async: true
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/test/block_scout_web/views/tokens/transfer_view_test.exs:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.Tokens.TransferViewTest do
2 | use BlockScoutWeb.ConnCase, async: true
3 | end
4 |
--------------------------------------------------------------------------------
/apps/block_scout_web/test/block_scout_web/views/wei_helper_test.exs:
--------------------------------------------------------------------------------
1 | defmodule BlockScoutWeb.WeiHelperTest do
2 | use ExUnit.Case
3 |
4 | # Needed for doctest
5 | alias Explorer.Chain.Wei
6 |
7 | doctest BlockScoutWeb.WeiHelper, import: true
8 | end
9 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/config/dev.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :ethereum_jsonrpc, EthereumJSONRPC.Tracer, env: "dev", disabled?: true
4 |
5 | config :logger, :ethereum_jsonrpc,
6 | level: :debug,
7 | path: Path.absname("logs/dev/ethereum_jsonrpc.log")
8 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/config/prod.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :ethereum_jsonrpc, EthereumJSONRPC.Tracer, env: "production", disabled?: true
4 |
5 | config :logger, :ethereum_jsonrpc,
6 | level: :info,
7 | path: Path.absname("logs/prod/ethereum_jsonrpc.log"),
8 | rotate: %{max_bytes: 52_428_800, keep: 19}
9 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/config/runtime/test.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | alias EthereumJSONRPC.Variant
4 |
5 | variant = Variant.get()
6 |
7 | Code.require_file("#{variant}.exs", "#{__DIR__}/../../../explorer/config/test")
8 | Code.require_file("#{variant}.exs", "#{__DIR__}/../../../indexer/config/test")
9 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/block/by_hash.ex:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.Block.ByHash do
2 | @moduledoc """
3 | Block format as returned by [`eth_getBlockByHash`](https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getblockbyhash)
4 | """
5 |
6 | @include_transactions true
7 |
8 | def request(%{id: id, hash: hash}) do
9 | EthereumJSONRPC.request(%{id: id, method: "eth_getBlockByHash", params: [hash, @include_transactions]})
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/tracer.ex:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.Tracer do
2 | @moduledoc false
3 |
4 | use Spandex.Tracer, otp_app: :ethereum_jsonrpc
5 | end
6 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/blocks_test.exs:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.BlocksTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest EthereumJSONRPC.Blocks
5 | end
6 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/geth/calls_tests.exs:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.Geth.CallsTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest EthereumJSONRPC.Geth.Calls
5 | end
6 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/nethermind/trace/action_test.exs:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.Nethermind.Trace.ActionTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest EthereumJSONRPC.Nethermind.Trace.Action
5 | end
6 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/nethermind/trace/result_test.exs:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.Nethermind.Trace.ResultTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest EthereumJSONRPC.Nethermind.Trace.Result
5 | end
6 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/nethermind/trace_test.exs:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.Nethermind.TraceTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest EthereumJSONRPC.Nethermind.Trace
5 | end
6 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/transaction_test.exs:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.TransactionTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest EthereumJSONRPC.Transaction
5 |
6 | alias EthereumJSONRPC.Transaction
7 |
8 | describe "to_elixir/1" do
9 | test "skips unsupported keys" do
10 | map = %{"key" => "value", "key1" => "value1"}
11 |
12 | assert %{nil: nil} = Transaction.to_elixir(map)
13 | end
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/uncle_test.exs:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.UncleTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest EthereumJSONRPC.Uncle
5 | end
6 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/uncles_test.exs:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.UnclesTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest EthereumJSONRPC.Uncles
5 | end
6 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/withdrawal_test.exs:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.WithdrawalTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest EthereumJSONRPC.Withdrawal
5 | end
6 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/ethereum_jsonrpc/withdrawals_test.exs:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.WithdrawalsTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest EthereumJSONRPC.Withdrawals
5 | end
6 |
--------------------------------------------------------------------------------
/apps/ethereum_jsonrpc/test/support/ethereum_jsonrpc/web_socket/case.ex:
--------------------------------------------------------------------------------
1 | defmodule EthereumJSONRPC.WebSocket.Case do
2 | use ExUnit.CaseTemplate
3 |
4 | import EthereumJSONRPC.Case, only: [module: 2]
5 |
6 | setup do
7 | module("ETHEREUM_JSONRPC_WEB_SOCKET_CASE", "EthereumJSONRPC.WebSocket.Case.Mox").setup()
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/.gitignore:
--------------------------------------------------------------------------------
1 | priv/.recovery
2 | priv/solc_compilers/
3 | priv/vyper_compilers/
4 |
--------------------------------------------------------------------------------
/apps/explorer/.sobelow-conf:
--------------------------------------------------------------------------------
1 | [
2 | verbose: false,
3 | private: true,
4 | skip: true,
5 | exit: "low",
6 | format: "compact",
7 | ignore: ["Config.HTTPS"],
8 | ignore_files: [
9 | "lib/explorer/smart_contract/solidity/code_compiler.ex",
10 | "lib/explorer/smart_contract/vyper/code_compiler.ex"
11 | ]
12 | ]
13 |
--------------------------------------------------------------------------------
/apps/explorer/benchmarks/explorer/chain/recent_collated_transactions.benchee:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scroll-tech/blockscout/a4c731f95475adccf67f1d6ec5b1c0e1aa91bfec/apps/explorer/benchmarks/explorer/chain/recent_collated_transactions.benchee
--------------------------------------------------------------------------------
/apps/explorer/config/test/arbitrum.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :explorer,
4 | json_rpc_named_arguments: [
5 | transport: EthereumJSONRPC.Mox,
6 | transport_options: [],
7 | variant: EthereumJSONRPC.Arbitrum
8 | ],
9 | subscribe_named_arguments: [
10 | transport: EthereumJSONRPC.Mox,
11 | transport_options: [],
12 | variant: EthereumJSONRPC.Arbitrum
13 | ]
14 |
--------------------------------------------------------------------------------
/apps/explorer/config/test/besu.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :explorer,
4 | transport: EthereumJSONRPC.HTTP,
5 | json_rpc_named_arguments: [
6 | transport: EthereumJSONRPC.Mox,
7 | transport_options: [],
8 | variant: EthereumJSONRPC.Besu
9 | ],
10 | subscribe_named_arguments: [
11 | transport: EthereumJSONRPC.Mox,
12 | transport_options: [],
13 | variant: EthereumJSONRPC.Besu
14 | ]
15 |
--------------------------------------------------------------------------------
/apps/explorer/config/test/erigon.exs:
--------------------------------------------------------------------------------
1 | use Mix.Config
2 |
3 | config :explorer,
4 | transport: EthereumJSONRPC.HTTP,
5 | json_rpc_named_arguments: [
6 | transport: EthereumJSONRPC.Mox,
7 | transport_options: [],
8 | variant: EthereumJSONRPC.Erigon
9 | ],
10 | subscribe_named_arguments: [
11 | transport: EthereumJSONRPC.Mox,
12 | transport_options: [],
13 | variant: EthereumJSONRPC.Erigon
14 | ]
15 |
--------------------------------------------------------------------------------
/apps/explorer/config/test/ganache.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :explorer,
4 | json_rpc_named_arguments: [
5 | transport: EthereumJSONRPC.Mox,
6 | transport_options: [],
7 | variant: EthereumJSONRPC.Ganache
8 | ],
9 | subscribe_named_arguments: [
10 | transport: EthereumJSONRPC.Mox,
11 | transport_options: [],
12 | variant: EthereumJSONRPC.Ganache
13 | ]
14 |
--------------------------------------------------------------------------------
/apps/explorer/config/test/geth.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :explorer,
4 | json_rpc_named_arguments: [
5 | transport: EthereumJSONRPC.Mox,
6 | transport_options: [],
7 | variant: EthereumJSONRPC.Geth
8 | ],
9 | subscribe_named_arguments: [
10 | transport: EthereumJSONRPC.Mox,
11 | transport_options: [],
12 | variant: EthereumJSONRPC.Geth
13 | ]
14 |
--------------------------------------------------------------------------------
/apps/explorer/config/test/nethermind.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :explorer,
4 | transport: EthereumJSONRPC.HTTP,
5 | json_rpc_named_arguments: [
6 | transport: EthereumJSONRPC.Mox,
7 | transport_options: [],
8 | variant: EthereumJSONRPC.Nethermind
9 | ],
10 | subscribe_named_arguments: [
11 | transport: EthereumJSONRPC.Mox,
12 | transport_options: [],
13 | variant: EthereumJSONRPC.Nethermind
14 | ]
15 |
--------------------------------------------------------------------------------
/apps/explorer/config/test/rsk.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :explorer,
4 | transport: EthereumJSONRPC.HTTP,
5 | json_rpc_named_arguments: [
6 | transport: EthereumJSONRPC.Mox,
7 | transport_options: [],
8 | variant: EthereumJSONRPC.RSK
9 | ],
10 | subscribe_named_arguments: [
11 | transport: EthereumJSONRPC.Mox,
12 | transport_options: [],
13 | variant: EthereumJSONRPC.RSK
14 | ]
15 |
--------------------------------------------------------------------------------
/apps/explorer/coveralls.json:
--------------------------------------------------------------------------------
1 | {
2 | "skip_files": [
3 | "lib/explorer/application.ex"
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/account.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Account do
2 | @moduledoc """
3 | Context for Account module.
4 | """
5 |
6 | def enabled? do
7 | Application.get_env(:explorer, __MODULE__)[:enabled]
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/account/api/plan.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Account.Api.Plan do
2 | @moduledoc """
3 | Module is responsible for schema for API plans, each plan contains its name and maximum number of requests per second
4 | """
5 | use Explorer.Schema
6 |
7 | schema "account_api_plans" do
8 | field(:name, :string)
9 | field(:max_req_per_second, :integer)
10 |
11 | timestamps()
12 | end
13 | end
14 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/chain/smart_contract/external_library.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Chain.SmartContract.ExternalLibrary do
2 | @moduledoc """
3 | The representation of an external library that was used for a smart contract.
4 | """
5 |
6 | use Ecto.Schema
7 |
8 | embedded_schema do
9 | field(:name)
10 | field(:address_hash)
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/encrypted/address_hash.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Encrypted.AddressHash do
2 | @moduledoc false
3 |
4 | use Explorer.Encrypted.Types.AddressHash, vault: Explorer.Vault
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/encrypted/binary.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Encrypted.Binary do
2 | @moduledoc false
3 |
4 | use Cloak.Ecto.Binary, vault: Explorer.Vault
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/encrypted/transaction_hash.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Encrypted.TransactionHash do
2 | @moduledoc false
3 |
4 | use Explorer.Encrypted.Types.TransactionHash, vault: Explorer.Vault
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/helper.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Helper do
2 | @moduledoc """
3 | Common explorer helper
4 | """
5 |
6 | def parse_integer(nil), do: nil
7 |
8 | def parse_integer(string) do
9 | case Integer.parse(string) do
10 | {number, ""} -> number
11 | _ -> nil
12 | end
13 | end
14 | end
15 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/mailer.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Mailer do
2 | @moduledoc """
3 | Base module for mail sending
4 |
5 | add in your module:
6 | alias Explorer.Mailer
7 |
8 | and call
9 | Mailer.deliver_now!(email)
10 | """
11 | use Bamboo.Mailer, otp_app: :explorer
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/repo/prometheus_logger.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.PrometheusLogger do
2 | @moduledoc """
3 | Log `Ecto` query durations as `Prometheus` metrics.
4 | """
5 |
6 | @dialyzer {:no_match, [log: 1, setup: 0]}
7 |
8 | use Prometheus.EctoInstrumenter
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/schema.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Schema do
2 | @moduledoc "Common configuration for Explorer schemas."
3 |
4 | defmacro __using__(_opts) do
5 | quote do
6 | use Ecto.Schema
7 |
8 | import Ecto.{Changeset, Query}
9 |
10 | @timestamps_opts [type: :utc_datetime_usec]
11 | end
12 | end
13 | end
14 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/smart_contract/rust_verifier_interface.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.SmartContract.RustVerifierInterface do
2 | @moduledoc """
3 | Adapter for contracts verification with https://github.com/blockscout/blockscout-rs/blob/main/smart-contract-verifier
4 | """
5 | use Explorer.SmartContract.RustVerifierInterfaceBehaviour
6 | end
7 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/tracer.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Tracer do
2 | @moduledoc false
3 |
4 | use Spandex.Tracer, otp_app: :explorer
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/tuple_encoder.ex:
--------------------------------------------------------------------------------
1 | defmodule TupleEncoder do
2 | @moduledoc """
3 | Implementation of Jason.Encoder for Tuple
4 | """
5 | alias Jason.{Encode, Encoder}
6 |
7 | defimpl Encoder, for: Tuple do
8 | def encode(value, opts) when is_tuple(value) do
9 | value
10 | |> Tuple.to_list()
11 | |> Encode.list(opts)
12 | end
13 | end
14 | end
15 |
--------------------------------------------------------------------------------
/apps/explorer/lib/explorer/utility/rust_service.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Utility.RustService do
2 | @moduledoc """
3 | Module is responsible for common utils related to rust microservices.
4 | """
5 | def base_url(module) do
6 | url = Application.get_env(:explorer, module)[:service_url]
7 |
8 | if String.ends_with?(url, "/") do
9 | url
10 | |> String.slice(0..(String.length(url) - 2))
11 | else
12 | url
13 | end
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/apps/explorer/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "repository": {
3 | "type": "git",
4 | "url": "git+https://github.com/blockscout/blockscout.git"
5 | },
6 | "private": true,
7 | "name": "blockscout",
8 | "author": "Blockscout",
9 | "license": "GPL-3.0",
10 | "engines": {
11 | "node": "18.x",
12 | "npm": "8.x"
13 | },
14 | "scripts": {},
15 | "dependencies": {
16 | "solc": "0.8.20"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/apps/explorer/priv/account/migrations/20211031164954_create_account_identities.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Account.Migrations.CreateAccountIdentities do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create table(:account_identities) do
6 | add(:uid, :string)
7 |
8 | timestamps()
9 | end
10 |
11 | create(unique_index(:account_identities, [:uid]))
12 | end
13 | end
14 |
--------------------------------------------------------------------------------
/apps/explorer/priv/account/migrations/20211205220414_add_email_and_name_to_account_identity.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Account.Migrations.AddEmailToAccountIdentity do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:account_identities) do
6 | add(:email, :string)
7 | add(:name, :string)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/account/migrations/20220324213333_add_subject_to_watchlist_notifications.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Account.Migrations.AddSubjectToWatchlistNotifications do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:account_watchlist_notifications) do
6 | add(:subject, :string, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/account/migrations/20220620182600_add_account_identity_fields.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Account.Migrations.AddAccountIdentityFields do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table("account_identities") do
6 | add(:nickname, :string, null: true)
7 | add(:avatar, :text, null: true)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/account/migrations/20220624142547_add_unique_constraints.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Account.Migrations.AddUniqueConstraints do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(unique_index(:account_tag_addresses, [:identity_id, :address_hash]))
6 | create(unique_index(:account_tag_transactions, [:identity_id, :tx_hash]))
7 | create(unique_index(:account_watchlist_addresses, [:watchlist_id, :address_hash]))
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/account/migrations/20220905195203_remove_guardian_tokens.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Account.Migrations.RemoveGuardianTokens do
2 | use Ecto.Migration
3 |
4 | def change do
5 | drop_if_exists(table("guardian_tokens"))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/account/migrations/20221104104635_create_token_transfer_token_id_migrator_progress.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Account.Migrations.CreateTokenTransferTokenIdMigratorProgress do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create table(:token_transfer_token_id_migrator_progress) do
6 | add(:last_processed_block_number, :integer)
7 |
8 | timestamps()
9 | end
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/account/migrations/20230502083519_add_verification_email_sent_at.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Account.Migrations.AddVerificationEmailSentAt do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:account_identities) do
6 | add(:verification_email_sent_at, :"timestamp without time zone", null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/contracts_abi/posdao/README.md:
--------------------------------------------------------------------------------
1 | ABIs are taken from compiled contract JSONs in the `build/` directory of https://github.com/poanetwork/posdao-contracts.
2 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scroll-tech/blockscout/a4c731f95475adccf67f1d6ec5b1c0e1aa91bfec/apps/explorer/priv/repo/migrations/.gitkeep
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20180424203101_create_market_history.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateMarketHistory do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create table(:market_history) do
6 | add(:date, :date)
7 | add(:closing_price, :decimal)
8 | add(:opening_price, :decimal)
9 | end
10 |
11 | create(unique_index(:market_history, :date))
12 | end
13 | end
14 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20180508183700_create_users.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateUsers do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create table(:users) do
6 | add(:username, :string, null: false)
7 | add(:password_hash, :string, null: false)
8 |
9 | timestamps()
10 | end
11 |
12 | create(index(:users, ["lower(username)"], unique: true, name: :unique_username))
13 | end
14 | end
15 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20180522154252_create_btree_gist_extension.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateBtreeGistExtension do
2 | use Ecto.Migration
3 |
4 | def change do
5 | execute("CREATE EXTENSION IF NOT EXISTS btree_gist")
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20180522154253_create_block_rewards.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateBlockRewards do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create table(:block_rewards, primary_key: false) do
6 | add(:block_range, :int8range)
7 | add(:reward, :decimal)
8 | end
9 |
10 | create(constraint(:block_rewards, :no_overlapping_ranges, exclude: ~s|gist (block_range WITH &&)|))
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20180626143840_add_inserted_at_index_to_blocks.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddInsertedAtIndexToBlocks do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:blocks, :inserted_at))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20180919175123_alter_token_decimals_to_bigint.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AlterTokenDecimalsToBigint do
2 | use Ecto.Migration
3 |
4 | def up do
5 | alter table("tokens") do
6 | modify(:decimals, :bigint)
7 | end
8 | end
9 |
10 | def down do
11 | alter table("tokens") do
12 | modify(:decimals, :smallint)
13 | end
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20181015173318_add_case_insensitive_extension.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddCaseInsensitiveExtension do
2 | use Ecto.Migration
3 |
4 | def change do
5 | execute(
6 | "CREATE EXTENSION IF NOT EXISTS citext",
7 | "DROP EXTENSION IF EXISTS citext"
8 | )
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20181206200140_rename_block_rewards_to_emission_rewards.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.RenameBlockRewardsToEmissionRewards do
2 | use Ecto.Migration
3 |
4 | def change do
5 | rename(table(:block_rewards), to: table(:emission_rewards))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20181212115448_add_indexes_to_token_transfers.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexesToTokenTransfers do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index("token_transfers", [:from_address_hash]))
6 | create(index("token_transfers", [:to_address_hash]))
7 | end
8 | end
9 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20181213111656_add_metadata_field_to_address_names.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddMetadataFieldToAddressNames do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:address_names) do
6 | add(:metadata, :map)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20181221143000_create_blocks_miner_hash_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateBlocksMinerHashIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:blocks, [:miner_hash]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190102141900_index_current_token_holders.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.IndexCurrentTokenHolders do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(
6 | index(:address_current_token_balances, [:token_contract_address_hash],
7 | where: "address_hash != '\\x0000000000000000000000000000000000000000' AND value > 0"
8 | )
9 | )
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190114204640_add_tokens_holder_count.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddTokensHolderCount do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:tokens) do
6 | # `NULL` so it can be filled in in the background while upgrading
7 | add(:holder_count, :integer, null: true)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190118040301_create_tokens_primary_key.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateTokensPrimaryKey do
2 | use Ecto.Migration
3 |
4 | def up do
5 | # Don't use `modify` as it requires restating the whole column description
6 | execute("ALTER TABLE tokens ADD PRIMARY KEY (contract_address_hash)")
7 | end
8 |
9 | def down do
10 | execute("ALTER TABLE tokens DROP CONSTRAINT tokens_pkey")
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190124082812_add_index_on_transaction_nonce_and_from_address_hash.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexOnTransactionNonceAndFromAddressHash do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:transactions, [:nonce, :from_address_hash, :block_hash]))
6 | create(index(:transactions, [:block_hash, :error]))
7 | end
8 | end
9 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190208113202_add_unique_index_to_rewards.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddUniqueIndexToRewards do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(
6 | unique_index(
7 | :block_rewards,
8 | [:address_hash, :block_hash, :address_type]
9 | )
10 | )
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190208143201_add_index_on_address_hash_block_number_and_token_contract_address_hash_for_current_token_balance.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexOnAddressHashBlockNumberAndTokenContractAddressHashForCurrentTokenBalance do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:address_current_token_balances, [:address_hash, :block_number, :token_contract_address_hash]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190213180502_add_earliest_processing_start_to_transactions.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddEarliestProcessingStartToTransactions do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:transactions) do
6 | add(:earliest_processing_start, :utc_datetime_usec)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190214135850_add_index_on_block_number_to_address_token_balances.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexOnBlockNumberToAddressTokenBalances do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:address_token_balances, [:block_number]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190215080049_add_index_on_fetched_coin_balance_to_addresses.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexOnFetchedCoinBalanceToAddresses do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:addresses, [:fetched_coin_balance]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190215093358_add_compound_index_address_token_balances.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddCompoundIndexAddressTokenBalances do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:address_current_token_balances, [:block_number], name: :address_cur_token_balances_index))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190215105501_add_constructor_arguments_to_smart_contracts.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddConstructorArgumentsToSmartContracts do
2 | use Ecto.Migration
3 |
4 | def change do
5 | execute("ALTER TABLE smart_contracts DROP COLUMN IF EXISTS constructor_arguments")
6 |
7 | alter table(:smart_contracts) do
8 | add(:constructor_arguments, :string, null: true)
9 | end
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190219082636_add_indexes_for_block_reward_query.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexesForBlockRewardQuery do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:blocks, [:number]))
6 | create(index(:emission_rewards, [:block_range]))
7 | end
8 | end
9 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190228102650_add_index_created_contract_address_hash.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexCreatedContractAddressHas do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:transactions, [:created_contract_address_hash]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190228152333_change_constructor_arguments_to_text.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.ChangeConstructorArgumentsToText do
2 | use Ecto.Migration
3 |
4 | def up do
5 | alter table(:smart_contracts) do
6 | modify(:constructor_arguments, :text)
7 | end
8 | end
9 |
10 | def down do
11 | alter table(:smart_contracts) do
12 | modify(:constructor_arguments, :string)
13 | end
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190228220746_add_internal_transactions_indexed_at_to_blocks.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddInternalTransactionsIndexedAtToBlocks do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:blocks) do
6 | # `null` when `internal_transactions` has never been fetched
7 | add(:internal_transactions_indexed_at, :utc_datetime_usec, null: true)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190301120328_add_index_to_consensus.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexToConsensus do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:blocks, [:consensus]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190305095926_add_index_to_value_fetched_at.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexToValueFetchedAt do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:address_coin_balances, [:value_fetched_at]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190313085740_add_index_symobl_in_tokens.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexSymbolInTokens do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:tokens, [:symbol]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190313103912_change_transactions_v_column_type.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.ChangeTransactionsVColumnType do
2 | use Ecto.Migration
3 |
4 | def up do
5 | alter table(:transactions) do
6 | modify(:v, :numeric, precision: 100, null: false)
7 | end
8 | end
9 |
10 | def down do
11 | alter table(:transactions) do
12 | modify(:v, :integer, null: false)
13 | end
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190314084907_add_index_to_to_address_hash.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexToToAddressHash do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:transactions, [:to_address_hash]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190318151809_add_inserted_at_index_to_accounts.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddInsertedAtIndexToAccounts do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:addresses, :inserted_at))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190321185644_add_old_value_for_current_token_balances.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddOldValueForCurrentTokenBalances do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:address_current_token_balances) do
6 | # A transient field for deriving token holder count deltas during address_current_token_balances upserts
7 | add(:old_value, :decimal, null: true)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190325081658_remove_unique_address_hash_decompiled_contracts.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.RemoveUniqueAddressHashDecompiledContracts do
2 | use Ecto.Migration
3 |
4 | def change do
5 | drop(index(:decompiled_smart_contracts, [:address_hash]))
6 |
7 | create(
8 | unique_index(:decompiled_smart_contracts, [:address_hash, :decompiler_version], name: :address_decompiler_version)
9 | )
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190421143300_add_index_to_bsdr.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexToBsdr do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:block_second_degree_relations) do
6 | # Null for old relations without fetched index
7 | add(:index, :integer, null: true)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190424170833_change_block_size_to_nullable.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.ChangeBlockSizeToNullable do
2 | use Ecto.Migration
3 |
4 | def up do
5 | alter table(:blocks) do
6 | modify(:size, :integer, null: true)
7 | end
8 | end
9 |
10 | def down do
11 | alter table(:blocks) do
12 | modify(:size, :integer, null: false)
13 | end
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190513134025_add_refetch_needed_to_block.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddRefetchNeededToBlock do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:blocks) do
6 | add(:refetch_needed, :boolean, default: false)
7 | end
8 |
9 | execute("UPDATE blocks SET refetch_needed = TRUE WHERE consensus", "")
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190613065856_add_tx_hash_inserted_at_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddTxHashInsertedAtIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(index(:transactions, [:hash, :inserted_at]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190625085852_add_additional_contract_fields.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddAdditionalContractFields do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:smart_contracts) do
6 | add(:optimization_runs, :integer, null: true)
7 | add(:evm_version, :string, null: true)
8 | add(:external_libraries, :jsonb, null: true)
9 | end
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190709043832_create_transaction_stats.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateTransactionStats do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create table(:transaction_stats) do
6 | add(:date, :date)
7 | add(:number_of_transactions, :integer)
8 | end
9 |
10 | create(unique_index(:transaction_stats, :date))
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190709103104_add_external_libraries_to_smart_contracts.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddExternalLibrariesToSmartContracts do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:smart_contracts) do
6 | remove(:external_libraries)
7 | end
8 |
9 | alter table(:smart_contracts) do
10 | add(:external_libraries, {:array, :map}, default: [])
11 | end
12 | end
13 | end
14 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190807113117_create_suggested_indexes.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateSuggestedIndexes do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create_if_not_exists(index(:address_token_balances, [:block_number, :address_hash]))
6 | create_if_not_exists(index(:block_rewards, [:block_hash]))
7 | end
8 | end
9 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190827120224_add_index_on_token_transfer_token_id.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexOnTokenTransferTokenId do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create_if_not_exists(index(:token_transfers, [:token_id]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20190910170703_create_indexes_for_block_number_in_token_transfers_and_transactions.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateIndexesForBlockNumberInTokenTransfersAndTransactions do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create_if_not_exists(index(:token_transfers, [:block_number]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20191007082500_add_indexes_for_token_instances_query.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddIndexesForTokenInstancesQuery do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create_if_not_exists(index(:token_instances, [:token_id]))
6 | create_if_not_exists(index(:tokens, [:type]))
7 | end
8 | end
9 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20191009121635_add_token_transfer_sorting_indexes.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddTokenTransferSortingIndexes do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(
6 | index(
7 | :token_transfers,
8 | ["block_number DESC", "log_index DESC"]
9 | )
10 | )
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20191010075740_add_error_to_token_instances.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddErrorToTokenInstances do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:token_instances) do
6 | add(:error, :string)
7 | end
8 |
9 | create(index(:token_instances, [:error]))
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20191128124415_remove_duplicate_indexes_token_entities.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.RemoveDuplicateIndexesTokenEntities do
2 | use Ecto.Migration
3 |
4 | def change do
5 | drop_if_exists(index(:address_token_balances, [:block_number], name: "address_token_balances_block_number_index"))
6 |
7 | drop_if_exists(index(:token_instances, [:token_id], name: "token_instances_token_id_index"))
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20191208135613_block_rewards_block_hash_partial_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.BlockRewardsBlockHashPartialIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | execute(
6 | "CREATE INDEX IF NOT EXISTS block_rewards_block_hash_partial_index on block_rewards(block_hash) WHERE address_type='validator';"
7 | )
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20191218120138_logs_block_number_index_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.LogsBlockNumberIndexIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create_if_not_exists(index(:logs, ["block_number DESC, index DESC"]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20191220113006_pending_block_operations_block_hash_partial_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.PendingBlockOperationsBlockHashPartialIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | execute(
6 | "CREATE INDEX pending_block_operations_block_hash_index_partial ON pending_block_operations(block_hash) WHERE fetch_internal_transactions=true;"
7 | )
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200214152058_add_token_id_to_token_balances.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddTokenIdToTokenBalances do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:address_token_balances) do
6 | add(:token_id, :numeric, precision: 78, scale: 0, null: true)
7 | add(:token_type, :string, null: true)
8 | end
9 |
10 | create(index(:address_token_balances, [:token_id]))
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200410115841_create_index_address_current_token_balances_token_contract_address_hash_value.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateIndexAddressCurrentTokenBalancesTokenContractAddressHashValue do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create_if_not_exists(index(:address_current_token_balances, [:token_contract_address_hash, :value]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200410141202_create_index_token_transfers_token_contract_address_hash_block_number.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateIndexTokenTransfersTokenContractAddressHashBlockNumber do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create_if_not_exists(index(:token_transfers, [:token_contract_address_hash, :block_number]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200424070607_drop_block_rewards_address_hash_address_type_block_hash_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.DropBlockRewardsAddressHashAddressTypeBlockHashIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | drop_if_exists(
6 | index(:block_rewards, [:address_hash, :block_hash, :address_type],
7 | name: "block_rewards_address_hash_address_type_block_hash_index"
8 | )
9 | )
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200518075748_create_index_blocks_miner_hash_number_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateIndexBlocksMinerHashNumberIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create_if_not_exists(index(:blocks, [:miner_hash, :number]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200521170002_create_token_transfers_token_contract_address_hash_token_id_block_number_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateTokenTransfersTokenContractAddressHashTokenIdBlockNumberIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create_if_not_exists(index(:token_transfers, [:token_contract_address_hash, "token_id DESC", "block_number DESC"]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200527144742_add_counters_table.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddCountersTable do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create table(:last_fetched_counters, primary_key: false) do
6 | add(:counter_type, :string, primary_key: true, null: false)
7 | add(:value, :numeric, precision: 100, null: true)
8 |
9 | timestamps(null: false, type: :utc_datetime_usec)
10 | end
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200608075122_alter_transactions_add_error_reason.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AlterTransactionsAddErrorReason do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:transactions) do
6 | add(:revert_reason, :text)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200806125649_token_add_bridged_column.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.TokenAddBridgedColumn do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:tokens) do
6 | add(:bridged, :boolean, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200812143050_add_addresses_contract_code_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddAddressesContractCodeIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | execute("CREATE INDEX addresses_contract_code_index ON addresses (md5(contract_code::text));")
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200904075501_add_bridged_token_custom_metadata.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddBridgedTokenCustomMetadata do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:bridged_tokens) do
6 | add(:custom_metadata, :string, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20200929075625_add_bridged_token_type.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddBridgedTokenType do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:bridged_tokens) do
6 | add(:type, :string, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20201026093652_transactions_stat_add_gas_usage_column.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.TransactionsStatAddGasUsageColumn do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:transaction_stats) do
6 | add(:gas_used, :numeric, precision: 100, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20210226154732_add_exchange_rate_column_to_bridged_tokens.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddExchangeRateColumnToBridgedTokens do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table("bridged_tokens") do
6 | add(:exchange_rate, :decimal)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20210309104122_add_bridged_token_custom_cap.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddBridgedTokenCustomCap do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:bridged_tokens) do
6 | add(:lp_token, :boolean, null: true)
7 | add(:custom_cap, :decimal, null: true)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20210331074008_add_pool_name_description.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddPoolNameDescription do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:staking_pools) do
6 | add(:name, :string, size: 256, null: true)
7 | add(:description, :string, size: 1024, null: true)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20210423115108_extend_token_transfers_for_erc1155.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.ExtendTokenTransfersForErc1155 do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:token_transfers) do
6 | add(:amounts, {:array, :decimal}, null: true)
7 | add(:token_ids, {:array, :numeric}, precision: 78, scale: 0, null: true)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20210524165427_min_missing_block_number.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.MinMissingBlockNumber do
2 | use Ecto.Migration
3 |
4 | def change do
5 | insert_initial_genesis_block = """
6 | INSERT INTO last_fetched_counters (counter_type, value, inserted_at, updated_at)
7 | VALUES ('min_missing_block_number', 0, NOW(), NOW());
8 | """
9 |
10 | execute(insert_initial_genesis_block)
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20210527093756_transaction_stats_add_total_fee_column.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.TransactionStatsAddTotalFeeColumn do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:transaction_stats) do
6 | add(:total_fee, :numeric, precision: 100, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20210616120552_smart_contracts_add_is_vyper_flag.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.SmartContractsAddIsVyperFlag do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:smart_contracts) do
6 | add(:is_vyper_contract, :boolean, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20210701084814_support_partial_match.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.SupportPartialMatch do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:smart_contracts) do
6 | add(:partially_verified, :boolean, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20210823144531_tokens_add_metadata_fetch_flag.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.TokensAddMetadataFetchFlag do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:tokens) do
6 | add(:skip_metadata, :boolean, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20210916194004_add_file_path_for_sourcify_contracts.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddFilePathForSourcifyContracts do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:smart_contracts) do
6 | add(:file_path, :text, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20211006121008_add_block_is_empty_flag.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddBlockIsEmptyFlag do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:blocks) do
6 | add(:is_empty, :bool, null: true)
7 | end
8 |
9 | create(index(:blocks, [:is_empty]))
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20211017135545_migrate_optimization_runs_to_int8.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.MigrateOptimizationRunsToInt8 do
2 | use Ecto.Migration
3 |
4 | def up do
5 | alter table(:smart_contracts) do
6 | modify(:optimization_runs, :bigint)
7 | end
8 | end
9 |
10 | def down do
11 | alter table(:smart_contracts) do
12 | modify(:optimization_runs, :integer)
13 | end
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20211018073652_add_token_balances_contract_address_hash_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddTokenBalancesContractAddressHashIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(
6 | index(
7 | :address_token_balances,
8 | ~w(token_contract_address_hash)a
9 | )
10 | )
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20211018164843_transactions_block_number_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.TransactionsBlockNumberIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(
6 | index(
7 | :transactions,
8 | ~w(block_number)a
9 | )
10 | )
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20211018170638_add_logs_address_hash_transaction_hash_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddLogsAddressHashTransactionHashIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create(
6 | index(
7 | :logs,
8 | ~w(address_hash transaction_hash)a
9 | )
10 | )
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20211029085117_drop_block_rewards_block_hash_partial_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.DropBlockRewardsBlockHashPartialIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | drop_if_exists(
6 | index(
7 | :block_rewards,
8 | ~w(block_hash)a,
9 | name: :block_rewards_block_hash_partial_index,
10 | where: "address_type='validator'"
11 | )
12 | )
13 | end
14 | end
15 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20211204184037_address_add_gas_used.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddressAddGasUsed do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:addresses) do
6 | add(:gas_used, :integer, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20211206071033_modify_address_gas_used_bigint.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.ModifyAddressGasUsedBigint do
2 | use Ecto.Migration
3 |
4 | def up do
5 | alter table(:addresses) do
6 | modify(:gas_used, :bigint)
7 | end
8 | end
9 |
10 | def down do
11 | alter table(:addresses) do
12 | modify(:gas_used, :integer)
13 | end
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20211210184136_add_display_name_to_address_tag.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddDisplayNameToAddressTag do
2 | use Ecto.Migration
3 |
4 | def up do
5 | alter table(:address_tags) do
6 | add(:display_name, :string, null: true)
7 | end
8 | end
9 |
10 | def down do
11 | alter table(:address_tags) do
12 | remove(:display_name)
13 | end
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20211217201759_add_has_error_in_iternal_txs_field_to_transaction.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddHasErrorInInternalTxsFieldToTransaction do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:transactions) do
6 | add(:has_error_in_internal_txs, :boolean, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220111085751_address_add_counters.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddressAddCounters do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:addresses) do
6 | add(:transactions_count, :integer, null: true)
7 | add(:token_transfers_count, :integer, null: true)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220306091504_add_implementation_name.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddImplementationName do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:smart_contracts) do
6 | add(:implementation_name, :string, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220527131249_add_implementation_fields.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddImplementationFields do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:smart_contracts) do
6 | add(:implementation_address_hash, :bytea, null: true)
7 | add(:implementation_fetched_at, :"timestamp without time zone", null: true)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220622114402_remove_staking_tables.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.RemoveStakingTables do
2 | use Ecto.Migration
3 |
4 | def change do
5 | execute("""
6 | DROP TABLE staking_pools_delegators CASCADE;
7 | """)
8 |
9 | execute("""
10 | DROP TABLE staking_pools CASCADE;
11 | """)
12 | end
13 | end
14 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220622140604_remove_bridged_tokens.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.RemoveBridgedTokens do
2 | use Ecto.Migration
3 |
4 | def change do
5 | drop_if_exists(table(:bridged_tokens))
6 |
7 | alter table(:tokens) do
8 | remove(:bridged)
9 | end
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220706105925_emission_rewards_add_primary_key.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.EmissionRewardsAddPrimaryKey do
2 | use Ecto.Migration
3 |
4 | def change do
5 | drop(
6 | index(
7 | :emission_rewards,
8 | ~w(block_range)a
9 | )
10 | )
11 |
12 | alter table(:emission_rewards) do
13 | modify(:block_range, :int8range, primary_key: true)
14 | end
15 | end
16 | end
17 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220706111510_address_names_add_primary_key.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddressNamesAddPrimaryKey do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:address_names) do
6 | add(:id, :serial, null: false, primary_key: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220804114005_create_event_notifications.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateEventNotifications do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create table(:event_notifications) do
6 | add(:data, :text, null: false)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220902083436_extend_token_name_type.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.ExtendTokenNameType do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:tokens) do
6 | modify(:name, :text, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220902103213_create_index_token_transfers_token_ids.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateIndexTokenTransfersTokenIds do
2 | use Ecto.Migration
3 |
4 | def up do
5 | execute("""
6 | CREATE INDEX token_transfers_token_ids_index on token_transfers USING GIN ("token_ids")
7 | """)
8 | end
9 |
10 | def down do
11 | execute("DROP INDEX token_transfers_token_ids_index")
12 | end
13 | end
14 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220902103527_create_indexes_token_instances_token_contract_address_hash_token_id.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateIndexesTokenInstancesTokenContractAddressHashTokenId do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create_if_not_exists(index(:token_instances, [:token_contract_address_hash, :token_id]))
6 | create_if_not_exists(index(:token_instances, [:token_id]))
7 | end
8 | end
9 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220919105140_add_method_id_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddMethodIdIndex do
2 | use Ecto.Migration
3 |
4 | @disable_ddl_transaction true
5 |
6 | def up do
7 | execute("""
8 | CREATE INDEX CONCURRENTLY IF NOT EXISTS method_id ON public.transactions USING btree (substring(input for 4));
9 | """)
10 | end
11 |
12 | def down do
13 | execute("DROP INDEX IF EXISTS method_id")
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20220926122620_extend_token_symbol_type.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.ExtendTokenSymbolType do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:tokens) do
6 | modify(:symbol, :text, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20221104104635_create_token_transfer_token_id_migrator_progress.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.CreateTokenTransferTokenIdMigratorProgress do
2 | use Ecto.Migration
3 |
4 | def change do
5 | create table(:token_transfer_token_id_migrator_progress) do
6 | add(:last_processed_block_number, :integer)
7 |
8 | timestamps()
9 | end
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20221114113853_remove_not_null_constraint_from_abi.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.RemoveNotNullConstraintFromAbi do
2 | use Ecto.Migration
3 |
4 | def change do
5 | execute("ALTER TABLE smart_contracts ALTER COLUMN abi DROP NOT NULL;")
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20221114121811_drop_internal_transactions_order_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.DropInternalTransactionsOrderIndex do
2 | use Ecto.Migration
3 |
4 | def change do
5 | drop_if_exists(index(:internal_transactions, ["block_number DESC, transaction_index DESC, index DESC"]))
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20221120184715_add_json_compiler_settings.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddJsonCompilerSettings do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:smart_contracts) do
6 | add(:compiler_settings, :jsonb, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20221223151234_add_block_number_to_pending_block_operations.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddBlockNumberToPendingBlockOperations do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:pending_block_operations) do
6 | add(:block_number, :integer)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20230126205627_add_fiat_value_and_circulating_market_cap_for_tokens.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddFiatValueAndCirculatingMarketCapForTokens do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:tokens) do
6 | add(:fiat_value, :decimal)
7 | add(:circulating_market_cap, :decimal)
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20230217095226_add_total_supply_updated_at_block.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddTotalSupplyUpdatedAtBlock do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:tokens) do
6 | add(:total_supply_updated_at_block, :bigint)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20230425185941_add_token_icon_url.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddTokenIconUrl do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:tokens) do
6 | add(:icon_url, :string, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20230522130735_withdrawals_gwei_amount_to_wei_amount.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.WithdrawalsGweiAmountToWeiAmount do
2 | use Ecto.Migration
3 |
4 | def change do
5 | execute("UPDATE withdrawals SET amount = amount * 1000000000")
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20230530074105_market_history_add_market_cap.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.MarketHistoryAddMarketCap do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:market_history) do
6 | add(:market_cap, :decimal)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20230605080138_add_verified_via_eth_bytecode_db.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddVerifiedViaEthBytecodeDb do
2 | use Ecto.Migration
3 |
4 | def change do
5 | alter table(:smart_contracts) do
6 | add(:verified_via_eth_bytecode_db, :boolean, null: true)
7 | end
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20230613181244_address_coin_balances_block_number_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddressCoinBalancesBlockNumberIndex do
2 | use Ecto.Migration
3 |
4 | def up do
5 | create(index(:address_coin_balances, [:block_number]))
6 | end
7 |
8 | def down do
9 | drop(index(:address_coin_balances, [:block_number]))
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/20230615130940_add_blocks_date_index.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Repo.Migrations.AddBlocksDateIndex do
2 | use Ecto.Migration
3 |
4 | def up do
5 | execute("CREATE INDEX IF NOT EXISTS blocks_date ON blocks(date(timestamp), number);")
6 | end
7 |
8 | def down do
9 | execute("DROP INDEX IF EXISTS blocks_date;")
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/migrations/scripts/20190326202921_lose_consensus_for_invalid_blocks.sql:
--------------------------------------------------------------------------------
1 | UPDATE blocks SET consensus = FALSE, updated_at = NOW()
2 | WHERE consensus AND number IN (
3 | SELECT b0.number - 1 FROM "blocks" AS b0
4 | LEFT JOIN "blocks" AS b1 ON (b0."parent_hash" = b1."hash") AND b1."consensus"
5 | WHERE b0."number" > 0 AND b0."consensus" AND b1."hash" IS NULL
6 | );
7 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo/seeds.exs:
--------------------------------------------------------------------------------
1 | # Script for populating the database. You can run it as:
2 | #
3 | # mix run priv/repo/seeds.exs
4 | #
5 | # Inside the script, you can read and write to any of your
6 | # repositories directly:
7 | #
8 | # Explorer.Repo.insert!(%Explorer.SomeSchema{})
9 | #
10 | # We recommend using the bang functions (`insert!`, `update!`
11 | # and so on) as they will fail if something goes wrong.
12 |
--------------------------------------------------------------------------------
/apps/explorer/priv/repo_api/migrations/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scroll-tech/blockscout/a4c731f95475adccf67f1d6ec5b1c0e1aa91bfec/apps/explorer/priv/repo_api/migrations/.gitkeep
--------------------------------------------------------------------------------
/apps/explorer/test/explorer/chain/data_test.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Chain.DataTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest Explorer.Chain.Data
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/test/explorer/chain/hash/nonce_test.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Chain.Hash.NonceTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest Explorer.Chain.Hash.Nonce
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/test/explorer/chain/hash_test.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Chain.HashTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest Explorer.Chain.Hash
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/test/explorer/chain/internal_transaction/call_type_test.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Chain.InternalTransaction.CallTypeTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest Explorer.Chain.InternalTransaction.CallType
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/test/explorer/chain/internal_transaction/type_test.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Chain.InternalTransaction.TypeTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest Explorer.Chain.InternalTransaction.Type
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/test/explorer/chain/transaction/status_test.exs:
--------------------------------------------------------------------------------
1 | defmodule Explorer.Chain.Transaction.StatusTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest Explorer.Chain.Transaction.Status
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/test/string/chars/explorer/chain/address_test.exs:
--------------------------------------------------------------------------------
1 | defmodule String.Chars.Explorer.Chain.AddressTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest String.Chars.Explorer.Chain.Address
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/test/string/chars/explorer/chain/data_test.exs:
--------------------------------------------------------------------------------
1 | defmodule String.Chars.Explorer.Chain.DataTest do
2 | use ExUnit.Case, async: true
3 |
4 | doctest String.Chars.Explorer.Chain.Data
5 | end
6 |
--------------------------------------------------------------------------------
/apps/explorer/test/support/fakes/no_op_source.ex:
--------------------------------------------------------------------------------
1 | defmodule Explorer.ExchangeRates.Source.NoOpSource do
2 | @moduledoc false
3 |
4 | alias Explorer.ExchangeRates.Source
5 |
6 | @behaviour Source
7 |
8 | @impl Source
9 | def format_data(_), do: []
10 |
11 | @impl Source
12 | def source_url, do: ""
13 |
14 | @impl Source
15 | def source_url(_), do: :ignore
16 |
17 | @impl Source
18 | def headers, do: []
19 | end
20 |
--------------------------------------------------------------------------------
/apps/explorer/test/support/fixture/vcr_cassettes/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scroll-tech/blockscout/a4c731f95475adccf67f1d6ec5b1c0e1aa91bfec/apps/explorer/test/support/fixture/vcr_cassettes/.gitkeep
--------------------------------------------------------------------------------
/apps/explorer/test/support/fixture/vcr_cassettes/import_block_perform_later_1_latest.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/apps/explorer/test/support/fixture/vcr_cassettes/import_internal_transaction_perform_1.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/apps/explorer/test/support/fixture/vcr_cassettes/import_skipped_blocks_perform_1.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/apps/explorer/test/support/fixture/vcr_cassettes/import_transaction_perform_1.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/apps/explorer/test/support/fixture/vcr_cassettes/internal_transaction_importer_import_1_from_core-trace.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/apps/indexer/config/runtime/test.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | alias EthereumJSONRPC.Variant
4 |
5 | variant = Variant.get()
6 |
7 | Code.require_file("#{variant}.exs", "#{__DIR__}/../../../explorer/config/test")
8 | Code.require_file("#{variant}.exs", "#{__DIR__}/../../../indexer/config/test")
9 |
--------------------------------------------------------------------------------
/apps/indexer/config/test/arbitrum.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :indexer,
4 | json_rpc_named_arguments: [
5 | transport: EthereumJSONRPC.Mox,
6 | transport_options: [],
7 | variant: EthereumJSONRPC.Arbitrum
8 | ]
9 |
--------------------------------------------------------------------------------
/apps/indexer/config/test/besu.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :indexer,
4 | json_rpc_named_arguments: [
5 | transport: EthereumJSONRPC.Mox,
6 | transport_options: [],
7 | variant: EthereumJSONRPC.Besu
8 | ]
9 |
--------------------------------------------------------------------------------
/apps/indexer/config/test/erigon.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :indexer,
4 | json_rpc_named_arguments: [
5 | transport: EthereumJSONRPC.Mox,
6 | transport_options: [],
7 | variant: EthereumJSONRPC.Erigon
8 | ]
9 |
--------------------------------------------------------------------------------
/apps/indexer/config/test/ganache.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :indexer,
4 | json_rpc_named_arguments: [
5 | transport: EthereumJSONRPC.Mox,
6 | transport_options: [],
7 | variant: EthereumJSONRPC.Ganache
8 | ]
9 |
--------------------------------------------------------------------------------
/apps/indexer/config/test/geth.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :indexer,
4 | json_rpc_named_arguments: [
5 | transport: EthereumJSONRPC.Mox,
6 | transport_options: [],
7 | variant: EthereumJSONRPC.Geth
8 | ]
9 |
--------------------------------------------------------------------------------
/apps/indexer/config/test/nethermind.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :indexer,
4 | json_rpc_named_arguments: [
5 | transport: EthereumJSONRPC.Mox,
6 | transport_options: [],
7 | variant: EthereumJSONRPC.Nethermind
8 | ]
9 |
--------------------------------------------------------------------------------
/apps/indexer/config/test/rsk.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | config :indexer,
4 | json_rpc_named_arguments: [
5 | transport: EthereumJSONRPC.Mox,
6 | transport_options: [],
7 | variant: EthereumJSONRPC.RSK
8 | ]
9 |
--------------------------------------------------------------------------------
/apps/indexer/lib/indexer.ex:
--------------------------------------------------------------------------------
1 | defmodule Indexer do
2 | @moduledoc """
3 | Indexes an Ethereum-based chain using JSONRPC.
4 | """
5 | end
6 |
--------------------------------------------------------------------------------
/apps/indexer/lib/indexer/tracer.ex:
--------------------------------------------------------------------------------
1 | defmodule Indexer.Tracer do
2 | @moduledoc false
3 |
4 | use Spandex.Tracer, otp_app: :indexer
5 | end
6 |
--------------------------------------------------------------------------------
/apps/indexer/lib/indexer/transform/blocks/base.ex:
--------------------------------------------------------------------------------
1 | defmodule Indexer.Transform.Blocks.Base do
2 | @moduledoc """
3 | Default block transformer to be used.
4 | """
5 |
6 | alias Indexer.Transform.Blocks
7 |
8 | @behaviour Blocks
9 |
10 | @impl Blocks
11 | def transform(block) when is_map(block) do
12 | block
13 | end
14 | end
15 |
--------------------------------------------------------------------------------
/apps/indexer/test/indexer_test.exs:
--------------------------------------------------------------------------------
1 | defmodule IndexerTest do
2 | use Explorer.DataCase, async: true
3 |
4 | doctest Indexer
5 | end
6 |
--------------------------------------------------------------------------------
/apps/indexer/test/support/indexer/block/catchup_supervisor_case.ex:
--------------------------------------------------------------------------------
1 | defmodule Indexer.Block.Catchup.Supervisor.Case do
2 | alias Indexer.Block.Catchup
3 |
4 | def start_supervised!(fetcher_arguments) when is_map(fetcher_arguments) do
5 | [fetcher_arguments]
6 | |> Catchup.Supervisor.child_spec()
7 | |> ExUnit.Callbacks.start_supervised!()
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/bin/deployment/build:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e
4 |
5 | cd /opt/app || exit 1
6 |
7 | export HOME=/home/ec2-user
8 | export MIX_ENV=prod
9 |
10 | source /etc/environment
11 |
12 | mix local.rebar --force
13 | mix local.hex --force
14 |
15 | mix deps.get
16 |
17 | mix compile
18 |
19 | # Install node dependencies
20 | pushd apps/explorer || exit 1
21 | npm install
22 | popd
23 |
24 | chown -R ec2-user:ec2-user /opt/app
25 |
26 | exit 0
27 |
--------------------------------------------------------------------------------
/bin/deployment/health_check:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e
4 | # Timeout after 2 min if we still haven't gotten a response
5 | timeout 120s bash </dev/null; then
10 | exit 0
11 | fi
12 | done
13 | }
14 |
15 | ping_server
16 | EOT
17 |
--------------------------------------------------------------------------------
/bin/deployment/migrate:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e
4 |
5 | cd /opt/app || exit 1
6 |
7 | export HOME=/home/ec2-user
8 | export MIX_ENV=prod
9 |
10 | source /etc/environment
11 |
12 | export DATABASE_URL
13 | export POOL_SIZE
14 | export ECTO_USE_SSL
15 |
16 | mix ecto.create
17 | mix ecto.migrate
18 |
19 | exit 0
20 |
--------------------------------------------------------------------------------
/bin/deployment/start:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e
4 |
5 | systemctl start explorer.service
6 |
7 | exit 0
8 |
--------------------------------------------------------------------------------
/bin/deployment/stop:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e
4 |
5 | if systemctl is-active explorer.service; then
6 | systemctl stop explorer.service
7 | fi
8 |
9 | exit 0
10 |
--------------------------------------------------------------------------------
/bin/test:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -ex
4 |
5 | mix format --check-formatted
6 | mix credo --strict
7 | mix sobelow --config
8 | mix dialyzer --halt-exit-status
9 | mix test
10 |
--------------------------------------------------------------------------------
/blockscout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scroll-tech/blockscout/a4c731f95475adccf67f1d6ec5b1c0e1aa91bfec/blockscout.png
--------------------------------------------------------------------------------
/config/test.exs:
--------------------------------------------------------------------------------
1 | import Config
2 |
3 | # Print only warnings and errors during test
4 |
5 | config :logger, :console, level: :warn
6 |
7 | config :logger, :ecto,
8 | level: :warn,
9 | path: Path.absname("logs/test/ecto.log")
10 |
11 | config :logger, :error, path: Path.absname("logs/test/error.log")
12 |
13 | config :explorer, Explorer.ExchangeRates,
14 | source: Explorer.ExchangeRates.Source.NoOpSource,
15 | store: :none
16 |
--------------------------------------------------------------------------------
/coveralls.json:
--------------------------------------------------------------------------------
1 | {
2 | "coverage_options": {
3 | "treat_no_relevant_lines_as_covered": true,
4 | "minimum_coverage": 70
5 | },
6 | "terminal_options": {
7 | "file_column_width": 120
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/deploy/testing/eth-goerli/.sops.yaml:
--------------------------------------------------------------------------------
1 |
2 | ---
3 | creation_rules:
4 | - path_regex: ^(.+/)?secrets\.yaml$
5 | pgp: >-
6 | 99E83B7490B1A9F51781E6055317CE0D5CE1230B
7 |
--------------------------------------------------------------------------------
/docker-compose/envs/common-visualizer.env:
--------------------------------------------------------------------------------
1 | VISUALIZER__SERVER__GRPC__ENABLED=false
2 |
--------------------------------------------------------------------------------
/docker-compose/services/docker-compose-frontend.yml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | services:
4 | frontend:
5 | image: ghcr.io/blockscout/frontend:${FRONTEND_DOCKER_TAG:-latest}
6 | pull_policy: always
7 | restart: always
8 | container_name: 'frontend'
9 | env_file:
10 | - ../envs/common-frontend.env
11 | ports:
12 | - 3000:3000
13 |
--------------------------------------------------------------------------------
/docker-compose/services/docker-compose-nginx.yml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | services:
4 | proxy:
5 | image: nginx
6 | volumes:
7 | - type: bind
8 | source: ../proxy/nginx.conf
9 | target: /etc/nginx/conf.d/default.conf
10 | read_only: true
11 | ports:
12 | - 80:80
13 | - 81:81
14 | - 82:82
--------------------------------------------------------------------------------
/docker-compose/services/docker-compose-redis.yml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | services:
4 | redis_db:
5 | image: 'redis:alpine'
6 | ports:
7 | - 6379:6379
8 | container_name: redis_db
9 | command: redis-server
10 | volumes:
11 | - ./redis-data:/data
12 |
--------------------------------------------------------------------------------
/docker-compose/services/docker-compose-sig-provider.yml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | services:
4 | sig-provider:
5 | image: ghcr.io/blockscout/sig-provider:${SIG_PROVIDER_DOCKER_TAG:-latest}
6 | pull_policy: always
7 | restart: always
8 | container_name: 'sig-provider'
9 | ports:
10 | - 8151:8050
11 |
--------------------------------------------------------------------------------
/docker-compose/services/docker-compose-smart-contract-verifier.yml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | services:
4 | smart-contract-verifier:
5 | image: ghcr.io/blockscout/smart-contract-verifier:${SMART_CONTRACT_VERIFIER_DOCKER_TAG:-latest}
6 | pull_policy: always
7 | restart: always
8 | container_name: 'smart-contract-verifier'
9 | env_file:
10 | - ../envs/common-smart-contract-verifier.env
11 | ports:
12 | - 8150:8050
13 |
--------------------------------------------------------------------------------
/docker-compose/services/docker-compose-visualizer.yml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | services:
4 | visualizer:
5 | image: ghcr.io/blockscout/visualizer:${VISUALIZER_DOCKER_TAG:-latest}
6 | pull_policy: always
7 | restart: always
8 | container_name: 'visualizer'
9 | env_file:
10 | - ../envs/common-visualizer.env
11 | ports:
12 | - 8152:8050
13 |
--------------------------------------------------------------------------------
/docker/README.md:
--------------------------------------------------------------------------------
1 | # BlockScout Docker Integration
2 |
3 | This integration is not production ready, and should be used for local BlockScout deployment only.
4 |
5 | For usage instructions and ENV variables, see the [docker integration documentation](https://docs.blockscout.com/for-developers/information-and-settings/docker-integration-local-use-only).
--------------------------------------------------------------------------------
/prometheus.yml:
--------------------------------------------------------------------------------
1 | scrape_configs:
2 | - job_name: block_scout
3 | scheme: 'http'
4 | scrape_interval: 10s
5 | static_configs:
6 | - targets: ['localhost:4000']
7 |
--------------------------------------------------------------------------------
/rel/commands/migrate.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | release_ctl eval --mfa "Explorer.ReleaseTasks.migrate/1" --argv -- "$@"
--------------------------------------------------------------------------------
/rel/commands/seed.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | release_ctl eval --mfa "Explorer.ReleaseTasks.seed/1" --argv -- "$@"
4 |
--------------------------------------------------------------------------------
/rel/plugins/.gitignore:
--------------------------------------------------------------------------------
1 | *.*
2 | !*.exs
3 | !.gitignore
--------------------------------------------------------------------------------