Finalize rust verifier micro-service integration

pull/5860/head
Никита Поздняков 2 years ago
parent 2da9472b21
commit e699b1e0de
No known key found for this signature in database
GPG Key ID: F344106F9804FE5F
  1. 6
      .dialyzer-ignore
  2. 5
      apps/block_scout_web/assets/js/pages/verification_form.js
  3. 7
      apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex
  4. 2
      apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_via_flattened_code_controller.ex
  5. 2
      apps/block_scout_web/lib/block_scout_web/controllers/api/rpc/contract_controller.ex
  6. 15
      apps/block_scout_web/lib/block_scout_web/notifier.ex
  7. 125
      apps/block_scout_web/priv/gettext/default.pot
  8. 125
      apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po
  9. 4
      apps/explorer/lib/explorer/smart_contract/helper.ex
  10. 17
      apps/explorer/lib/explorer/smart_contract/rust_verifier_interface.ex
  11. 69
      apps/explorer/lib/explorer/smart_contract/solidity/publisher.ex
  12. 8
      apps/explorer/lib/explorer/smart_contract/solidity/publisher_worker.ex
  13. 18
      apps/explorer/lib/explorer/smart_contract/solidity/verifier.ex
  14. 7
      apps/explorer/lib/explorer/third_party_integrations/sourcify.ex

@ -22,11 +22,11 @@ lib/explorer/smart_contract/reader.ex:435
lib/indexer/fetcher/token_total_supply_on_demand.ex:16 lib/indexer/fetcher/token_total_supply_on_demand.ex:16
lib/explorer/exchange_rates/source.ex:116 lib/explorer/exchange_rates/source.ex:116
lib/explorer/exchange_rates/source.ex:119 lib/explorer/exchange_rates/source.ex:119
lib/explorer/smart_contract/solidity/verifier.ex:223 lib/explorer/smart_contract/solidity/verifier.ex:310
lib/block_scout_web/templates/address_contract/index.html.eex:158 lib/block_scout_web/templates/address_contract/index.html.eex:158
lib/block_scout_web/templates/address_contract/index.html.eex:195 lib/block_scout_web/templates/address_contract/index.html.eex:195
lib/explorer/third_party_integrations/sourcify.ex:73 lib/explorer/third_party_integrations/sourcify.ex:120
lib/explorer/third_party_integrations/sourcify.ex:76 lib/explorer/third_party_integrations/sourcify.ex:123
lib/block_scout_web/views/transaction_view.ex:137 lib/block_scout_web/views/transaction_view.ex:137
lib/block_scout_web/views/transaction_view.ex:152 lib/block_scout_web/views/transaction_view.ex:152
lib/block_scout_web/views/transaction_view.ex:197 lib/block_scout_web/views/transaction_view.ex:197

@ -188,6 +188,7 @@ if ($contractVerificationPage.length) {
const $jsonDropzoneMetadata = $('#metadata-json-dropzone-form') const $jsonDropzoneMetadata = $('#metadata-json-dropzone-form')
const $jsonDropzoneStandardInput = $('#standard-json-dropzone-form') const $jsonDropzoneStandardInput = $('#standard-json-dropzone-form')
let dropzone
if ($jsonDropzoneMetadata.length || $jsonDropzoneStandardInput.length) { if ($jsonDropzoneMetadata.length || $jsonDropzoneStandardInput.length) {
const func = $jsonDropzoneMetadata.length ? metadataJSONBehavior : standardJSONBehavior const func = $jsonDropzoneMetadata.length ? metadataJSONBehavior : standardJSONBehavior
@ -196,7 +197,7 @@ if ($contractVerificationPage.length) {
const tag = $jsonDropzoneMetadata.length ? '#metadata-json-dropzone-form' : '#standard-json-dropzone-form' const tag = $jsonDropzoneMetadata.length ? '#metadata-json-dropzone-form' : '#standard-json-dropzone-form'
const jsonVerificationType = $jsonDropzoneMetadata.length ? 'json:metadata' : 'json:standard' const jsonVerificationType = $jsonDropzoneMetadata.length ? 'json:metadata' : 'json:standard'
var dropzone = new Dropzone(tag, { dropzone = new Dropzone(tag, {
autoProcessQueue: false, autoProcessQueue: false,
acceptedFiles, acceptedFiles,
parallelUploads: 100, parallelUploads: 100,
@ -219,7 +220,7 @@ if ($contractVerificationPage.length) {
const tag = '#multi-part-dropzone-form' const tag = '#multi-part-dropzone-form'
const jsonVerificationType = 'multi-part-files' const jsonVerificationType = 'multi-part-files'
var dropzone = new Dropzone(tag, { dropzone = new Dropzone(tag, {
autoProcessQueue: false, autoProcessQueue: false,
acceptedFiles, acceptedFiles,
parallelUploads: 100, parallelUploads: 100,

@ -59,7 +59,7 @@ defmodule BlockScoutWeb.AddressContractVerificationController do
|> Map.values() |> Map.values()
|> read_files() |> read_files()
Que.add(SolidityPublisherWorker, {smart_contract, files_array, external_libraries, conn}) Que.add(SolidityPublisherWorker, {"multipart", smart_contract, files_array, external_libraries, conn})
send_resp(conn, 204, "") send_resp(conn, 204, "")
end end
@ -71,7 +71,7 @@ defmodule BlockScoutWeb.AddressContractVerificationController do
"external_libraries" => external_libraries "external_libraries" => external_libraries
} }
) do ) do
Que.add(SolidityPublisherWorker, {smart_contract, external_libraries, conn}) Que.add(SolidityPublisherWorker, {"flattened", smart_contract, external_libraries, conn})
send_resp(conn, 204, "") send_resp(conn, 204, "")
end end
@ -89,7 +89,7 @@ defmodule BlockScoutWeb.AddressContractVerificationController do
with %Plug.Upload{path: path} <- get_one_json(files_array), with %Plug.Upload{path: path} <- get_one_json(files_array),
{:ok, json_input} <- File.read(path) do {:ok, json_input} <- File.read(path) do
Que.add(SolidityPublisherWorker, {smart_contract, json_input, conn}) Que.add(SolidityPublisherWorker, {"json_web", smart_contract, json_input, conn})
else else
_ -> _ ->
nil nil
@ -245,6 +245,7 @@ defmodule BlockScoutWeb.AddressContractVerificationController do
|> Enum.at(0) |> Enum.at(0)
end end
# sobelow_skip ["Traversal.FileModule"]
defp read_files(plug_uploads) do defp read_files(plug_uploads) do
Enum.reduce(plug_uploads, %{}, fn %Plug.Upload{path: path, filename: file_name}, acc -> Enum.reduce(plug_uploads, %{}, fn %Plug.Upload{path: path, filename: file_name}, acc ->
{:ok, file_content} = File.read(path) {:ok, file_content} = File.read(path)

@ -46,7 +46,7 @@ defmodule BlockScoutWeb.AddressContractVerificationViaFlattenedCodeController do
"external_libraries" => external_libraries "external_libraries" => external_libraries
} }
) do ) do
Que.add(PublisherWorker, {smart_contract, external_libraries, conn}) Que.add(PublisherWorker, {"flattened", smart_contract, external_libraries, conn})
send_resp(conn, 204, "") send_resp(conn, 204, "")
end end

@ -120,7 +120,7 @@ defmodule BlockScoutWeb.API.RPC.ContractController do
{:format, {:ok, _casted_address_hash}} <- to_address_hash(address_hash), {:format, {:ok, _casted_address_hash}} <- to_address_hash(address_hash),
{:params, {:ok, fetched_params}} <- {:params, fetch_verifysourcecode_params(params)}, {:params, {:ok, fetched_params}} <- {:params, fetch_verifysourcecode_params(params)},
uid <- VerificationStatus.generate_uid(address_hash) do uid <- VerificationStatus.generate_uid(address_hash) do
Que.add(SolidityPublisherWorker, {fetched_params, json_input, uid}) Que.add(SolidityPublisherWorker, {"json_api", fetched_params, json_input, uid})
render(conn, :show, %{result: uid}) render(conn, :show, %{result: uid})
else else

@ -207,17 +207,13 @@ defmodule BlockScoutWeb.Notifier do
end end
def select_contract_type_and_form_view(params) do def select_contract_type_and_form_view(params) do
verification_from_metadata_json? = verification_from_metadata_json? = check_verification_type(params, "json:metadata")
Map.has_key?(params, "verification_type") && Map.get(params, "verification_type") == "json:metadata"
verification_from_standard_json_input? = verification_from_standard_json_input? = check_verification_type(params, "json:standard")
Map.has_key?(params, "verification_type") && Map.get(params, "verification_type") == "json:standard"
verification_from_vyper? = verification_from_vyper? = check_verification_type(params, "vyper")
Map.has_key?(params, "verification_type") && Map.get(params, "verification_type") == "vyper"
verification_from_multi_part_files? = verification_from_multi_part_files? = check_verification_type(params, "multi-part-files")
Map.has_key?(params, "verification_type") && Map.get(params, "verification_type") == "multi-part-files"
compiler = if verification_from_vyper?, do: :vyper, else: :solc compiler = if verification_from_vyper?, do: :vyper, else: :solc
@ -233,6 +229,9 @@ defmodule BlockScoutWeb.Notifier do
%{view: view, compiler: compiler} %{view: view, compiler: compiler}
end end
defp check_verification_type(params, type),
do: Map.has_key?(params, "verification_type") && Map.get(params, "verification_type") == type
@doc """ @doc """
Broadcast the percentage of blocks indexed so far. Broadcast the percentage of blocks indexed so far.
""" """

@ -1,12 +1,12 @@
#: lib/block_scout_web/views/address_token_balance_view.ex:10 #: lib/block_scout_web/views/address_token_balance_view.ex:10
#, elixir-format #, elixir-autogen, elixir-format
msgid "%{count} token" msgid "%{count} token"
msgid_plural "%{count} tokens" msgid_plural "%{count} tokens"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: lib/block_scout_web/templates/block/_tile.html.eex:29 #: lib/block_scout_web/templates/block/_tile.html.eex:29
#, elixir-format #, elixir-autogen, elixir-format
msgid "%{count} transaction" msgid "%{count} transaction"
msgid_plural "%{count} transactions" msgid_plural "%{count} transactions"
msgstr[0] "" msgstr[0] ""
@ -158,6 +158,11 @@ msgstr ""
msgid "Address (external or contract) sending the transaction." msgid "Address (external or contract) sending the transaction."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:165
#, elixir-autogen, elixir-format
msgid "Address balance in"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:50 #: lib/block_scout_web/templates/tokens/overview/_details.html.eex:50
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Address of the token contract" msgid "Address of the token contract"
@ -214,6 +219,11 @@ msgstr ""
msgid "Apps" msgid "Apps"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:21
#, elixir-autogen, elixir-format
msgid "Average"
msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:100 #: lib/block_scout_web/templates/chain/show.html.eex:100
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Average block time" msgid "Average block time"
@ -367,9 +377,10 @@ msgstr ""
msgid "Call Code" msgid "Call Code"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:105 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:120
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:145 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:145
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:41 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:41
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:141
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:55 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:55
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:51 #: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:51
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:47 #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:47
@ -452,6 +463,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:2 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:2
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:6 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:6
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:2 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:2
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:4
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:6 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:6
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:4 #: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:4
#: lib/block_scout_web/templates/tokens/holder/index.html.eex:15 #: lib/block_scout_web/templates/tokens/holder/index.html.eex:15
@ -528,6 +540,7 @@ msgid "Contract Creation Code"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:86 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:86
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Contract Libraries" msgid "Contract Libraries"
msgstr "" msgstr ""
@ -702,6 +715,11 @@ msgstr ""
msgid "Current transaction state: Success, Failed (Error), or Pending (In Process)" msgid "Current transaction state: Success, Failed (Error), or Pending (In Process)"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:69
#, elixir-autogen, elixir-format
msgid "Daily Transactions"
msgstr ""
#: lib/block_scout_web/templates/address_logs/_logs.html.eex:101 #: lib/block_scout_web/templates/address_logs/_logs.html.eex:101
#: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:7 #: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:7
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:23 #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:23
@ -803,6 +821,11 @@ msgstr ""
msgid "Drop sources and metadata JSON file or click here" msgid "Drop sources and metadata JSON file or click here"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:67
#, elixir-autogen, elixir-format
msgid "Drop sources or click here"
msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:28 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Drop the standard input JSON file or click here" msgid "Drop the standard input JSON file or click here"
@ -848,6 +871,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:76 #: lib/block_scout_web/templates/address_contract/index.html.eex:76
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:26 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:26
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:22
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "EVM Version" msgid "EVM Version"
msgstr "" msgstr ""
@ -883,6 +907,11 @@ msgstr ""
msgid "Error" msgid "Error"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/transaction/_tile.html.eex:9
#, elixir-autogen, elixir-format
msgid "Error in internal transactions"
msgstr ""
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:33 #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Error rendering value" msgid "Error rendering value"
@ -966,6 +995,11 @@ msgstr ""
msgid "Failed to decode log data." msgid "Failed to decode log data."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:22
#, elixir-autogen, elixir-format
msgid "Fast"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:263 #: lib/block_scout_web/templates/address/overview.html.eex:263
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Fetching gas used..." msgid "Fetching gas used..."
@ -1049,6 +1083,12 @@ msgstr ""
msgid "Gas Used by Transaction" msgid "Gas Used by Transaction"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:3
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:18
#, elixir-autogen, elixir-format
msgid "Gas tracker"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:255 #: lib/block_scout_web/templates/address/overview.html.eex:255
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Gas used by the address." msgid "Gas used by the address."
@ -1254,9 +1294,10 @@ msgstr ""
msgid "Loading chart..." msgid "Loading chart..."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:70 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:77
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:139 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:139
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:35 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:35
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:133
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:49 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:49
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:45 #: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:45
#: lib/block_scout_web/templates/address_read_contract/index.html.eex:12 #: lib/block_scout_web/templates/address_read_contract/index.html.eex:12
@ -1416,6 +1457,7 @@ msgid "New Smart Contract Verification"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:9 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:9
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:7
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Solidity Smart Contract Verification" msgid "New Solidity Smart Contract Verification"
msgstr "" msgstr ""
@ -1425,10 +1467,11 @@ msgstr ""
msgid "New Vyper Smart Contract Verification" msgid "New Vyper Smart Contract Verification"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:73
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:80 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:80
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:88 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:87
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:96 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:95
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:103
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:111
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Next" msgid "Next"
msgstr "" msgstr ""
@ -1436,6 +1479,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:9 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:9
#: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:9 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:9
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:42 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:42
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:38
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No" msgid "No"
msgstr "" msgstr ""
@ -1499,6 +1543,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:70 #: lib/block_scout_web/templates/address_contract/index.html.eex:70
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:58 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:58
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Optimization runs" msgid "Optimization runs"
msgstr "" msgstr ""
@ -1658,6 +1703,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:142 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:142
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:38 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:38
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:138
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:52 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:52
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:48 #: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:48
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1775,6 +1821,11 @@ msgstr ""
msgid "Size of the block in bytes." msgid "Size of the block in bytes."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:20
#, elixir-autogen, elixir-format
msgid "Slow"
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:30 #: lib/block_scout_web/templates/address_coin_balance/index.html.eex:30
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:50 #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:50
#: lib/block_scout_web/templates/address_logs/index.html.eex:23 #: lib/block_scout_web/templates/address_logs/index.html.eex:23
@ -1808,6 +1859,11 @@ msgstr ""
msgid "Sorry, We are unable to locate this transaction Hash" msgid "Sorry, We are unable to locate this transaction Hash"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:63
#, elixir-autogen, elixir-format
msgid "Sources *.sol files"
msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:14 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:14
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sources and Metadata JSON" msgid "Sources and Metadata JSON"
@ -2473,6 +2529,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:141 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:141
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:37 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:37
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:137
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:51 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:51
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:47 #: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:47
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -2506,6 +2563,11 @@ msgstr ""
msgid "Via flattened source code" msgid "Via flattened source code"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:40
#, elixir-autogen, elixir-format
msgid "Via multi-part files"
msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:152 #: lib/block_scout_web/templates/chain/show.html.eex:152
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View All Blocks" msgid "View All Blocks"
@ -2557,7 +2619,7 @@ msgstr ""
msgid "View transaction %{transaction} on %{subnetwork}" msgid "View transaction %{transaction} on %{subnetwork}"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:39 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:46
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Vyper contract" msgid "Vyper contract"
msgstr "" msgstr ""
@ -2609,6 +2671,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:14 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:14
#: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:14 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:14
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:47 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:47
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Yes" msgid "Yes"
msgstr "" msgstr ""
@ -2648,6 +2711,11 @@ msgstr ""
msgid "custom RPC" msgid "custom RPC"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:165
#, elixir-autogen, elixir-format
msgid "doesn't include ERC20, ERC721, ERC1155 tokens)."
msgstr ""
#: lib/block_scout_web/templates/common_components/_rap_pagination_container.html.eex:13 #: lib/block_scout_web/templates/common_components/_rap_pagination_container.html.eex:13
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "elements are displayed" msgid "elements are displayed"
@ -2718,44 +2786,3 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "true" msgid "true"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/transaction/_tile.html.eex:9
#, elixir-autogen, elixir-format
msgid "Error in internal transactions"
msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:21
#, elixir-autogen, elixir-format
msgid "Average"
msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:69
#, elixir-autogen, elixir-format
msgid "Daily Transactions"
msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:22
#, elixir-autogen, elixir-format
msgid "Fast"
msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:3
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:18
#, elixir-autogen, elixir-format
msgid "Gas tracker"
msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:20
#, elixir-autogen, elixir-format
msgid "Slow"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:165
#, elixir-autogen, elixir-format
msgid "Address balance in"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:165
#, elixir-autogen, elixir-format
msgid "doesn't include ERC20, ERC721, ERC1155 tokens)."
msgstr ""

@ -1,12 +1,12 @@
#: lib/block_scout_web/views/address_token_balance_view.ex:10 #: lib/block_scout_web/views/address_token_balance_view.ex:10
#, elixir-format #, elixir-autogen, elixir-format
msgid "%{count} token" msgid "%{count} token"
msgid_plural "%{count} tokens" msgid_plural "%{count} tokens"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: lib/block_scout_web/templates/block/_tile.html.eex:29 #: lib/block_scout_web/templates/block/_tile.html.eex:29
#, elixir-format #, elixir-autogen, elixir-format
msgid "%{count} transaction" msgid "%{count} transaction"
msgid_plural "%{count} transactions" msgid_plural "%{count} transactions"
msgstr[0] "" msgstr[0] ""
@ -158,6 +158,11 @@ msgstr ""
msgid "Address (external or contract) sending the transaction." msgid "Address (external or contract) sending the transaction."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:165
#, elixir-autogen, elixir-format
msgid "Address balance in"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:50 #: lib/block_scout_web/templates/tokens/overview/_details.html.eex:50
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Address of the token contract" msgid "Address of the token contract"
@ -214,6 +219,11 @@ msgstr ""
msgid "Apps" msgid "Apps"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:21
#, elixir-autogen, elixir-format
msgid "Average"
msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:100 #: lib/block_scout_web/templates/chain/show.html.eex:100
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Average block time" msgid "Average block time"
@ -367,9 +377,10 @@ msgstr ""
msgid "Call Code" msgid "Call Code"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:105 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:120
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:145 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:145
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:41 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:41
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:141
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:55 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:55
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:51 #: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:51
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:47 #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:47
@ -452,6 +463,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:2 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:2
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:6 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:6
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:2 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:2
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:4
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:6 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:6
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:4 #: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:4
#: lib/block_scout_web/templates/tokens/holder/index.html.eex:15 #: lib/block_scout_web/templates/tokens/holder/index.html.eex:15
@ -528,6 +540,7 @@ msgid "Contract Creation Code"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:86 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:86
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Contract Libraries" msgid "Contract Libraries"
msgstr "" msgstr ""
@ -702,6 +715,11 @@ msgstr ""
msgid "Current transaction state: Success, Failed (Error), or Pending (In Process)" msgid "Current transaction state: Success, Failed (Error), or Pending (In Process)"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:69
#, elixir-autogen, elixir-format
msgid "Daily Transactions"
msgstr ""
#: lib/block_scout_web/templates/address_logs/_logs.html.eex:101 #: lib/block_scout_web/templates/address_logs/_logs.html.eex:101
#: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:7 #: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:7
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:23 #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:23
@ -803,6 +821,11 @@ msgstr ""
msgid "Drop sources and metadata JSON file or click here" msgid "Drop sources and metadata JSON file or click here"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:67
#, elixir-autogen, elixir-format
msgid "Drop sources or click here"
msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:28 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Drop the standard input JSON file or click here" msgid "Drop the standard input JSON file or click here"
@ -848,6 +871,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:76 #: lib/block_scout_web/templates/address_contract/index.html.eex:76
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:26 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:26
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:22
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "EVM Version" msgid "EVM Version"
msgstr "" msgstr ""
@ -883,6 +907,11 @@ msgstr ""
msgid "Error" msgid "Error"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/transaction/_tile.html.eex:9
#, elixir-autogen, elixir-format
msgid "Error in internal transactions"
msgstr ""
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:33 #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Error rendering value" msgid "Error rendering value"
@ -966,6 +995,11 @@ msgstr ""
msgid "Failed to decode log data." msgid "Failed to decode log data."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:22
#, elixir-autogen, elixir-format
msgid "Fast"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:263 #: lib/block_scout_web/templates/address/overview.html.eex:263
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Fetching gas used..." msgid "Fetching gas used..."
@ -1049,6 +1083,12 @@ msgstr ""
msgid "Gas Used by Transaction" msgid "Gas Used by Transaction"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:3
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:18
#, elixir-autogen, elixir-format
msgid "Gas tracker"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:255 #: lib/block_scout_web/templates/address/overview.html.eex:255
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Gas used by the address." msgid "Gas used by the address."
@ -1254,9 +1294,10 @@ msgstr ""
msgid "Loading chart..." msgid "Loading chart..."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:70 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:77
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:139 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:139
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:35 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:35
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:133
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:49 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:49
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:45 #: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:45
#: lib/block_scout_web/templates/address_read_contract/index.html.eex:12 #: lib/block_scout_web/templates/address_read_contract/index.html.eex:12
@ -1416,6 +1457,7 @@ msgid "New Smart Contract Verification"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:9 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:9
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:7
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Solidity Smart Contract Verification" msgid "New Solidity Smart Contract Verification"
msgstr "" msgstr ""
@ -1425,10 +1467,11 @@ msgstr ""
msgid "New Vyper Smart Contract Verification" msgid "New Vyper Smart Contract Verification"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:73
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:80 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:80
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:88 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:87
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:96 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:95
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:103
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:111
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Next" msgid "Next"
msgstr "" msgstr ""
@ -1436,6 +1479,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:9 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:9
#: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:9 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:9
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:42 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:42
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:38
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No" msgid "No"
msgstr "" msgstr ""
@ -1499,6 +1543,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:70 #: lib/block_scout_web/templates/address_contract/index.html.eex:70
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:58 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:58
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Optimization runs" msgid "Optimization runs"
msgstr "" msgstr ""
@ -1658,6 +1703,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:142 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:142
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:38 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:38
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:138
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:52 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:52
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:48 #: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:48
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1775,6 +1821,11 @@ msgstr ""
msgid "Size of the block in bytes." msgid "Size of the block in bytes."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:20
#, elixir-autogen, elixir-format
msgid "Slow"
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:30 #: lib/block_scout_web/templates/address_coin_balance/index.html.eex:30
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:50 #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:50
#: lib/block_scout_web/templates/address_logs/index.html.eex:23 #: lib/block_scout_web/templates/address_logs/index.html.eex:23
@ -1808,6 +1859,11 @@ msgstr ""
msgid "Sorry, We are unable to locate this transaction Hash" msgid "Sorry, We are unable to locate this transaction Hash"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:63
#, elixir-autogen, elixir-format
msgid "Sources *.sol files"
msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:14 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:14
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sources and Metadata JSON" msgid "Sources and Metadata JSON"
@ -2473,6 +2529,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:141 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:141
#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:37 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:37
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:137
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:51 #: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:51
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:47 #: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:47
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -2506,6 +2563,11 @@ msgstr ""
msgid "Via flattened source code" msgid "Via flattened source code"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:40
#, elixir-autogen, elixir-format
msgid "Via multi-part files"
msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:152 #: lib/block_scout_web/templates/chain/show.html.eex:152
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View All Blocks" msgid "View All Blocks"
@ -2557,7 +2619,7 @@ msgstr ""
msgid "View transaction %{transaction} on %{subnetwork}" msgid "View transaction %{transaction} on %{subnetwork}"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:39 #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:46
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Vyper contract" msgid "Vyper contract"
msgstr "" msgstr ""
@ -2609,6 +2671,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:14 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:14
#: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:14 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:14
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:47 #: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:47
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Yes" msgid "Yes"
msgstr "" msgstr ""
@ -2648,6 +2711,11 @@ msgstr ""
msgid "custom RPC" msgid "custom RPC"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:165
#, elixir-autogen, elixir-format
msgid "doesn't include ERC20, ERC721, ERC1155 tokens)."
msgstr ""
#: lib/block_scout_web/templates/common_components/_rap_pagination_container.html.eex:13 #: lib/block_scout_web/templates/common_components/_rap_pagination_container.html.eex:13
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "elements are displayed" msgid "elements are displayed"
@ -2718,44 +2786,3 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "true" msgid "true"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/transaction/_tile.html.eex:9
#, elixir-autogen, elixir-format
msgid "Error in internal transactions"
msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:21
#, elixir-autogen, elixir-format
msgid "Average"
msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:69
#, elixir-autogen, elixir-format
msgid "Daily Transactions"
msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:22
#, elixir-autogen, elixir-format
msgid "Fast"
msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:3
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:18
#, elixir-autogen, elixir-format
msgid "Gas tracker"
msgstr ""
#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:20
#, elixir-autogen, elixir-format
msgid "Slow"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:165
#, elixir-autogen, elixir-format
msgid "Address balance in"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:165
#, elixir-autogen, elixir-format, fuzzy
msgid "doesn't include ERC20, ERC721, ERC1155 tokens)."
msgstr ""

@ -82,7 +82,7 @@ defmodule Explorer.SmartContract.Helper do
|> String.trim() |> String.trim()
end end
defp sol_file?(filename) do def sol_file?(filename) do
case List.last(String.split(String.downcase(filename), ".")) do case List.last(String.split(String.downcase(filename), ".")) do
"sol" -> "sol" ->
true true
@ -92,7 +92,7 @@ defmodule Explorer.SmartContract.Helper do
end end
end end
defp json_file?(filename) do def json_file?(filename) do
case List.last(String.split(String.downcase(filename), ".")) do case List.last(String.split(String.downcase(filename), ".")) do
"json" -> "json" ->
true true

@ -1,4 +1,7 @@
defmodule Explorer.SmartContract.RustVerifierInterface do defmodule Explorer.SmartContract.RustVerifierInterface do
@moduledoc """
Adapter for contracts verification with https://github.com/blockscout/blockscout-rs/tree/main/verification
"""
alias HTTPoison.Response alias HTTPoison.Response
require Logger require Logger
@ -26,7 +29,7 @@ defmodule Explorer.SmartContract.RustVerifierInterface do
"input" => _ "input" => _
} = body } = body
) do ) do
http_post_request(multiple_files_verification_url(), body) http_post_request(standard_json_input_verification_url(), body)
end end
def http_post_request(url, body) do def http_post_request(url, body) do
@ -71,7 +74,7 @@ defmodule Explorer.SmartContract.RustVerifierInterface do
end end
end end
def get_versions_list() do def get_versions_list do
http_get_request(versions_list_url()) http_get_request(versions_list_url())
end end
@ -97,13 +100,13 @@ defmodule Explorer.SmartContract.RustVerifierInterface do
def proccess_verifier_response(other), do: {:error, other} def proccess_verifier_response(other), do: {:error, other}
def multiple_files_verification_url(), do: "#{base_url()}" <> "/api/v1/solidity/verify/multiple-files" def multiple_files_verification_url, do: "#{base_url()}" <> "/api/v1/solidity/verify/multiple-files"
def standard_json_input_verification_url(), do: "#{base_url()}" <> "/api/v1/solidity/verify/standard-json" def standard_json_input_verification_url, do: "#{base_url()}" <> "/api/v1/solidity/verify/standard-json"
def versions_list_url(), do: "#{base_url()}" <> "/api/v1/solidity/versions" def versions_list_url, do: "#{base_url()}" <> "/api/v1/solidity/versions"
def base_url(), do: Application.get_env(:explorer, __MODULE__)[:service_url] def base_url, do: Application.get_env(:explorer, __MODULE__)[:service_url]
def enabled?(), do: Application.get_env(:explorer, __MODULE__)[:enabled] def enabled?, do: Application.get_env(:explorer, __MODULE__)[:enabled]
end end

@ -41,12 +41,12 @@ defmodule Explorer.SmartContract.Solidity.Publisher do
"optimization" => _, "optimization" => _,
"optimization_runs" => _, "optimization_runs" => _,
"sources" => sources "sources" => sources
} = params } = result_params
} -> } ->
%{^file_name => contract_source_code} = sources %{^file_name => contract_source_code} = sources
prepared_params = prepared_params =
params result_params
|> Map.put("contract_source_code", contract_source_code) |> Map.put("contract_source_code", contract_source_code)
|> Map.put("external_libraries", contract_libraries) |> Map.put("external_libraries", contract_libraries)
|> Map.put("name", contract_name) |> Map.put("name", contract_name)
@ -77,33 +77,18 @@ defmodule Explorer.SmartContract.Solidity.Publisher do
case Verifier.evaluate_authenticity_via_standard_json_input(address_hash, params, json_input) do case Verifier.evaluate_authenticity_via_standard_json_input(address_hash, params, json_input) do
{:ok, {:ok,
%{ %{
"abi" => abi_string, "abi" => _,
"compiler_version" => _, "compiler_version" => _,
"constructor_arguments" => _, "constructor_arguments" => _,
"contract_libraries" => contract_libraries, "contract_libraries" => _,
"contract_name" => contract_name, "contract_name" => _,
"evm_version" => _, "evm_version" => _,
"file_name" => file_name, "file_name" => _,
"optimization" => _, "optimization" => _,
"optimization_runs" => _, "optimization_runs" => _,
"sources" => sources "sources" => _
} = params} -> } = result_params} ->
secondary_sources = proccess_rust_verifier_response(result_params, address_hash)
for {file, source} <- sources,
file != file_name,
do: %{"file_name" => file, "contract_source_code" => source, "address_hash" => address_hash}
%{^file_name => contract_source_code} = sources
prepared_params =
params
|> Map.put("contract_source_code", contract_source_code)
|> Map.put("external_libraries", contract_libraries)
|> Map.put("name", contract_name)
|> Map.put("file_path", file_name)
|> Map.put("secondary_sources", secondary_sources)
publish_smart_contract(address_hash, prepared_params, Jason.decode!(abi_string))
{:ok, %{abi: abi, constructor_arguments: constructor_arguments}, additional_params} -> {:ok, %{abi: abi, constructor_arguments: constructor_arguments}, additional_params} ->
params_with_constructor_arguments = params_with_constructor_arguments =
@ -133,6 +118,29 @@ defmodule Explorer.SmartContract.Solidity.Publisher do
case Verifier.evaluate_authenticity_via_multi_part_files(address_hash, params_with_external_libaries, files) do case Verifier.evaluate_authenticity_via_multi_part_files(address_hash, params_with_external_libaries, files) do
{:ok, {:ok,
%{
"abi" => _,
"compiler_version" => _,
"constructor_arguments" => _,
"contract_libraries" => _,
"contract_name" => _,
"evm_version" => _,
"file_name" => _,
"optimization" => _,
"optimization_runs" => _,
"sources" => _
} = result_params} ->
proccess_rust_verifier_response(result_params, address_hash)
{:error, error} ->
{:error, unverified_smart_contract(address_hash, params, error, nil, true)}
_ ->
{:error, unverified_smart_contract(address_hash, params, "Failed to verify", nil, true)}
end
end
def proccess_rust_verifier_response(
%{ %{
"abi" => abi_string, "abi" => abi_string,
"compiler_version" => _, "compiler_version" => _,
@ -144,7 +152,9 @@ defmodule Explorer.SmartContract.Solidity.Publisher do
"optimization" => _, "optimization" => _,
"optimization_runs" => _, "optimization_runs" => _,
"sources" => sources "sources" => sources
} = params} -> } = result_params,
address_hash
) do
secondary_sources = secondary_sources =
for {file, source} <- sources, for {file, source} <- sources,
file != file_name, file != file_name,
@ -153,7 +163,7 @@ defmodule Explorer.SmartContract.Solidity.Publisher do
%{^file_name => contract_source_code} = sources %{^file_name => contract_source_code} = sources
prepared_params = prepared_params =
params result_params
|> Map.put("contract_source_code", contract_source_code) |> Map.put("contract_source_code", contract_source_code)
|> Map.put("external_libraries", contract_libraries) |> Map.put("external_libraries", contract_libraries)
|> Map.put("name", contract_name) |> Map.put("name", contract_name)
@ -161,13 +171,6 @@ defmodule Explorer.SmartContract.Solidity.Publisher do
|> Map.put("secondary_sources", secondary_sources) |> Map.put("secondary_sources", secondary_sources)
publish_smart_contract(address_hash, prepared_params, Jason.decode!(abi_string)) publish_smart_contract(address_hash, prepared_params, Jason.decode!(abi_string))
{:error, error} ->
{:error, unverified_smart_contract(address_hash, params, error, nil, true)}
_ ->
{:error, unverified_smart_contract(address_hash, params, "Failed to verify", nil, true)}
end
end end
def publish_smart_contract(address_hash, params, abi) do def publish_smart_contract(address_hash, params, abi) do

@ -9,7 +9,7 @@ defmodule Explorer.SmartContract.Solidity.PublisherWorker do
alias Explorer.Chain.SmartContract.VerificationStatus alias Explorer.Chain.SmartContract.VerificationStatus
alias Explorer.SmartContract.Solidity.Publisher alias Explorer.SmartContract.Solidity.Publisher
def perform({%{"address_hash" => address_hash} = params, external_libraries, conn}) do def perform({"flattened", %{"address_hash" => address_hash} = params, external_libraries, conn}) do
result = result =
case Publisher.publish(address_hash, params, external_libraries) do case Publisher.publish(address_hash, params, external_libraries) do
{:ok, _contract} = result -> {:ok, _contract} = result ->
@ -22,7 +22,7 @@ defmodule Explorer.SmartContract.Solidity.PublisherWorker do
EventsPublisher.broadcast([{:contract_verification_result, {address_hash, result, conn}}], :on_demand) EventsPublisher.broadcast([{:contract_verification_result, {address_hash, result, conn}}], :on_demand)
end end
def perform({%{"address_hash" => address_hash} = params, files_map, external_libraries, conn}) def perform({"multipart", %{"address_hash" => address_hash} = params, files_map, external_libraries, conn})
when is_map(files_map) do when is_map(files_map) do
result = result =
case Publisher.publish_with_multi_part_files(params, external_libraries, files_map) do case Publisher.publish_with_multi_part_files(params, external_libraries, files_map) do
@ -36,7 +36,7 @@ defmodule Explorer.SmartContract.Solidity.PublisherWorker do
EventsPublisher.broadcast([{:contract_verification_result, {address_hash, result, conn}}], :on_demand) EventsPublisher.broadcast([{:contract_verification_result, {address_hash, result, conn}}], :on_demand)
end end
def perform({%{"address_hash" => address_hash} = params, json_input, uid}) when is_binary(uid) do def perform({"json_api", %{"address_hash" => address_hash} = params, json_input, uid}) when is_binary(uid) do
VerificationStatus.insert_status(uid, :pending, address_hash) VerificationStatus.insert_status(uid, :pending, address_hash)
case Publisher.publish_with_standard_json_input(params, json_input) do case Publisher.publish_with_standard_json_input(params, json_input) do
@ -48,7 +48,7 @@ defmodule Explorer.SmartContract.Solidity.PublisherWorker do
end end
end end
def perform({%{"address_hash" => address_hash} = params, json_input, conn}) do def perform({"json_web", %{"address_hash" => address_hash} = params, json_input, conn}) do
result = result =
case Publisher.publish_with_standard_json_input(params, json_input) do case Publisher.publish_with_standard_json_input(params, json_input) do
{:ok, _contract} = result -> {:ok, _contract} = result ->

@ -113,8 +113,22 @@ defmodule Explorer.SmartContract.Solidity.Verifier do
end end
def evaluate_authenticity_via_standard_json_input_inner(true, address_hash, params, json_input) do def evaluate_authenticity_via_standard_json_input_inner(true, address_hash, params, json_input) do
# wait update from rust team with modifying json verification end point deployed_bytecode = Chain.smart_contract_bytecode(address_hash)
verify(address_hash, params, json_input)
creation_tx_input =
case Chain.smart_contract_creation_tx_bytecode(address_hash) do
%{init: init, created_contract_code: _created_contract_code} ->
init
_ ->
""
end
params
|> Map.put("creation_bytecode", creation_tx_input)
|> Map.put("deployed_bytecode", deployed_bytecode)
|> Map.put("input", json_input)
|> RustVerifierInterface.verify_standard_json_input()
end end
def evaluate_authenticity_via_standard_json_input_inner(false, address_hash, params, json_input) do def evaluate_authenticity_via_standard_json_input_inner(false, address_hash, params, json_input) do

@ -4,8 +4,7 @@ defmodule Explorer.ThirdPartyIntegrations.Sourcify do
""" """
use Tesla use Tesla
alias Explorer.SmartContract.Helper alias Explorer.SmartContract.{Helper, RustVerifierInterface}
alias Explorer.SmartContract.RustVerifierInterface
alias HTTPoison.{Error, Response} alias HTTPoison.{Error, Response}
alias Tesla.Multipart alias Tesla.Multipart
@ -61,6 +60,7 @@ defmodule Explorer.ThirdPartyIntegrations.Sourcify do
http_post_request(verify_url(), multipart_body) http_post_request(verify_url(), multipart_body)
end end
# sobelow_skip ["Traversal.FileModule"]
def verify_via_rust_microservice(address_hash_string, files) do def verify_via_rust_microservice(address_hash_string, files) do
chain_id = config(__MODULE__, :chain_id) chain_id = config(__MODULE__, :chain_id)
@ -180,6 +180,9 @@ defmodule Explorer.ThirdPartyIntegrations.Sourcify do
%{"status" => "0"} -> %{"status" => "0"} ->
{:ok, body_json} {:ok, body_json}
%{"status" => "1", "message" => message} ->
{:error, message}
%{"result" => [%{"status" => unknown_status}]} -> %{"result" => [%{"status" => unknown_status}]} ->
{:error, unknown_status} {:error, unknown_status}

Loading…
Cancel
Save