From e01b3816803715d92583a1e817de5988785cc462 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Thu, 27 Jun 2019 16:18:17 +0300 Subject: [PATCH 01/30] add background smart contract verification --- .../v1/verified_smart_contract_controller.ex | 35 +++---------------- .../smart_contract/publisher_worker.ex | 21 +++++++++++ apps/explorer/mix.exs | 1 + mix.lock | 3 ++ 4 files changed, 29 insertions(+), 31 deletions(-) create mode 100644 apps/explorer/lib/explorer/smart_contract/publisher_worker.ex diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/api/v1/verified_smart_contract_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/api/v1/verified_smart_contract_controller.ex index 50334a1a45..616e67eb5f 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/api/v1/verified_smart_contract_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/api/v1/verified_smart_contract_controller.ex @@ -3,40 +3,17 @@ defmodule BlockScoutWeb.API.V1.VerifiedSmartContractController do alias Explorer.Chain alias Explorer.Chain.Hash.Address - alias Explorer.SmartContract.Publisher + alias Explorer.SmartContract.PublisherWorker def create(conn, params) do with {:ok, hash} <- validate_address_hash(params["address_hash"]), :ok <- smart_contract_exists?(hash), :ok <- verified_smart_contract_exists?(hash) do - external_libraries = fetch_external_libraries(params) + external_libraries = fetch_external_libraries(params) || %{} - case Publisher.publish(hash, params, external_libraries) do - {:ok, _} -> - send_resp(conn, :created, Jason.encode!(%{status: :success})) + PublisherWorker.perform({hash, params, external_libraries}) - {:error, changeset} -> - errors = - changeset.errors - |> Enum.into(%{}, fn {field, {message, _}} -> - {field, message} - end) - - send_resp(conn, :unprocessable_entity, encode(errors)) - end - else - :invalid_address -> - send_resp(conn, :unprocessable_entity, encode(%{error: "address_hash is invalid"})) - - :not_found -> - send_resp(conn, :unprocessable_entity, encode(%{error: "address is not found"})) - - :contract_exists -> - send_resp( - conn, - :unprocessable_entity, - encode(%{error: "verified code already exists for this address"}) - ) + send_resp(conn, :created, Jason.encode!(%{status: :started_processing})) end end @@ -62,10 +39,6 @@ defmodule BlockScoutWeb.API.V1.VerifiedSmartContractController do end end - defp encode(data) do - Jason.encode!(data) - end - defp fetch_external_libraries(params) do keys = Enum.flat_map(1..5, fn i -> ["library#{i}_name", "library#{i}_address"] end) diff --git a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex new file mode 100644 index 0000000000..1a13a237a2 --- /dev/null +++ b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex @@ -0,0 +1,21 @@ +defmodule Explorer.SmartContract.PublisherWorker do + use Que.Worker + + alias Explorer.SmartContract.Publisher + + def perform({address_hash, params, external_libraries}) do + case Publisher.publish(address_hash, params, external_libraries) do + {:ok, _} -> + :ok + + {:error, changeset} -> + errors = + changeset.errors + |> Enum.into(%{}, fn {field, {message, _}} -> + {field, message} + end) + + {:error, errors} + end + end +end diff --git a/apps/explorer/mix.exs b/apps/explorer/mix.exs index f224471740..6eb32b524e 100644 --- a/apps/explorer/mix.exs +++ b/apps/explorer/mix.exs @@ -105,6 +105,7 @@ defmodule Explorer.Mixfile do }, # bypass optional dependency {:plug_cowboy, "~> 2.0", only: [:dev, :test]}, + {:que, "~> 0.10.1"}, {:sobelow, ">= 0.7.0", only: [:dev, :test], runtime: false}, # Tracing {:spandex, github: "spandex-project/spandex", branch: "allow-setting-trace-key", override: true}, diff --git a/mix.lock b/mix.lock index 258c71f03f..f7d2c836cd 100644 --- a/mix.lock +++ b/mix.lock @@ -42,6 +42,7 @@ "ex_doc": {:hex, :ex_doc, "0.19.2", "6f4081ccd9ed081b6dc0bd5af97a41e87f5554de469e7d76025fba535180565f", [:mix], [{:earmark, "~> 1.2", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.10", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, "ex_machina": {:hex, :ex_machina, "2.2.2", "d84217a6fb7840ff771d2561b8aa6d74a0d8968e4b10ecc0d7e9890dc8fb1c6a", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm"}, "ex_rlp": {:hex, :ex_rlp, "0.5.2", "7f4ce7bd55e543c054ce6d49629b01e9833c3462e3d547952be89865f39f2c58", [:mix], [], "hexpm"}, + "ex_utils": {:hex, :ex_utils, "0.1.7", "2c133e0bcdc49a858cf8dacf893308ebc05bc5fba501dc3d2935e65365ec0bf3", [:mix], [], "hexpm"}, "exactor": {:hex, :exactor, "2.2.4", "5efb4ddeb2c48d9a1d7c9b465a6fffdd82300eb9618ece5d34c3334d5d7245b1", [:mix], []}, "excoveralls": {:git, "https://github.com/KronicDeth/excoveralls.git", "0a859b68851eeba9b43eba59fbc8f9098299cfe1", [branch: "circle-workflows"]}, "exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, optional: false]}]}, @@ -66,6 +67,7 @@ "makeup_elixir": {:hex, :makeup_elixir, "0.13.0", "be7a477997dcac2e48a9d695ec730b2d22418292675c75aa2d34ba0909dcdeda", [:mix], [{:makeup, "~> 0.8", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, "math": {:hex, :math, "0.3.0", "e14e7291115201cb155a3567e66d196bf5088a6f55b030d598107d7ae934a11c", [:mix], []}, "meck": {:hex, :meck, "0.8.12", "1f7b1a9f5d12c511848fec26bbefd09a21e1432eadb8982d9a8aceb9891a3cf2", [:rebar3], [], "hexpm"}, + "memento": {:hex, :memento, "0.3.1", "b2909390820550d8b90b68ec96f9e15ff8a45a28b6f97fa4a62ef50e87c2f9d9", [:mix], [], "hexpm"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], []}, "mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"}, @@ -97,6 +99,7 @@ "prometheus_plugs": {:hex, :prometheus_plugs, "1.1.5", "25933d48f8af3a5941dd7b621c889749894d8a1082a6ff7c67cc99dec26377c5", [:mix], [{:accept, "~> 0.1", [hex: :accept, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}, {:prometheus_ex, "~> 1.1 or ~> 2.0 or ~> 3.0", [hex: :prometheus_ex, repo: "hexpm", optional: false]}, {:prometheus_process_collector, "~> 1.1", [hex: :prometheus_process_collector, repo: "hexpm", optional: true]}], "hexpm"}, "prometheus_process_collector": {:hex, :prometheus_process_collector, "1.4.0", "6dbd39e3165b9ef1c94a7a820e9ffe08479f949dcdd431ed4aaea7b250eebfde", [:rebar3], [{:prometheus, "~> 4.0", [hex: :prometheus, repo: "hexpm", optional: false]}], "hexpm"}, "qrcode": {:hex, :qrcode, "0.1.4", "544dc67ba42eed5ebce3d2a691d053387937740561d251f83f0a067917fae2dc", [:mix], [], "hexpm"}, + "que": {:hex, :que, "0.10.1", "788ed0ec92ed69bdf9cfb29bf41a94ca6355b8d44959bd0669cf706e557ac891", [:mix], [{:ex_utils, "~> 0.1.6", [hex: :ex_utils, repo: "hexpm", optional: false]}, {:memento, "~> 0.3.0", [hex: :memento, repo: "hexpm", optional: false]}], "hexpm"}, "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm"}, "set_locale": {:git, "https://github.com/minifast/set_locale.git", "da9ae029642bc0fbd9212c2aaf86c0adca70c084", [branch: "master"]}, "sobelow": {:hex, :sobelow, "0.7.4", "228cc6185b448b63ecc88429b43e864e8dd570e8e09f2d04b3aa71894db1bdbb", [:mix], [], "hexpm"}, From b93da31b9778dc5b01b32f772facca2a21b5d60d Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 2 Jul 2019 12:56:03 +0300 Subject: [PATCH 02/30] fix adding a job to the processing queue --- .../address_contract_verification_controller.ex | 16 +++------------- .../explorer/smart_contract/publisher_worker.ex | 6 +++++- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex index dad0ebaeaf..4aa57038a7 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex @@ -2,7 +2,7 @@ defmodule BlockScoutWeb.AddressContractVerificationController do use BlockScoutWeb, :controller alias Explorer.Chain.SmartContract - alias Explorer.SmartContract.{Publisher, Solidity.CodeCompiler, Solidity.CompilerVersion} + alias Explorer.SmartContract.{PublisherWorker, Solidity.CodeCompiler, Solidity.CompilerVersion} def new(conn, %{"address_id" => address_hash_string}) do changeset = @@ -28,19 +28,9 @@ defmodule BlockScoutWeb.AddressContractVerificationController do "external_libraries" => external_libraries } ) do - case Publisher.publish(address_hash_string, smart_contract, external_libraries) do - {:ok, _smart_contract} -> - redirect(conn, to: address_contract_path(conn, :index, address_hash_string)) + Que.add(PublisherWorker, {address_hash_string, smart_contract, external_libraries}) - {:error, changeset} -> - {:ok, compiler_versions} = CompilerVersion.fetch_versions() - - render(conn, "new.html", - changeset: changeset, - compiler_versions: compiler_versions, - evm_versions: CodeCompiler.allowed_evm_versions() - ) - end + send_resp(conn, 204, "") end def parse_optimization_runs(%{"runs" => runs}) do diff --git a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex index 1a13a237a2..16d4f5d37d 100644 --- a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex +++ b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex @@ -1,5 +1,9 @@ defmodule Explorer.SmartContract.PublisherWorker do - use Que.Worker + @moduledoc """ + Background smart contract verification worker. + """ + + use Que.Worker, concurrency: 5 alias Explorer.SmartContract.Publisher From 0230371deba6e408f3153624eae467cb4b24659b Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 2 Jul 2019 12:59:48 +0300 Subject: [PATCH 03/30] use sync processing in api --- .../v1/verified_smart_contract_controller.ex | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/api/v1/verified_smart_contract_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/api/v1/verified_smart_contract_controller.ex index 616e67eb5f..50334a1a45 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/api/v1/verified_smart_contract_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/api/v1/verified_smart_contract_controller.ex @@ -3,17 +3,40 @@ defmodule BlockScoutWeb.API.V1.VerifiedSmartContractController do alias Explorer.Chain alias Explorer.Chain.Hash.Address - alias Explorer.SmartContract.PublisherWorker + alias Explorer.SmartContract.Publisher def create(conn, params) do with {:ok, hash} <- validate_address_hash(params["address_hash"]), :ok <- smart_contract_exists?(hash), :ok <- verified_smart_contract_exists?(hash) do - external_libraries = fetch_external_libraries(params) || %{} + external_libraries = fetch_external_libraries(params) - PublisherWorker.perform({hash, params, external_libraries}) + case Publisher.publish(hash, params, external_libraries) do + {:ok, _} -> + send_resp(conn, :created, Jason.encode!(%{status: :success})) - send_resp(conn, :created, Jason.encode!(%{status: :started_processing})) + {:error, changeset} -> + errors = + changeset.errors + |> Enum.into(%{}, fn {field, {message, _}} -> + {field, message} + end) + + send_resp(conn, :unprocessable_entity, encode(errors)) + end + else + :invalid_address -> + send_resp(conn, :unprocessable_entity, encode(%{error: "address_hash is invalid"})) + + :not_found -> + send_resp(conn, :unprocessable_entity, encode(%{error: "address is not found"})) + + :contract_exists -> + send_resp( + conn, + :unprocessable_entity, + encode(%{error: "verified code already exists for this address"}) + ) end end @@ -39,6 +62,10 @@ defmodule BlockScoutWeb.API.V1.VerifiedSmartContractController do end end + defp encode(data) do + Jason.encode!(data) + end + defp fetch_external_libraries(params) do keys = Enum.flat_map(1..5, fn i -> ["library#{i}_name", "library#{i}_address"] end) From ca3abfc9eece9e55dd97d55031b956c762ee6cee Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 2 Jul 2019 13:10:16 +0300 Subject: [PATCH 04/30] fix dialyzer --- .dialyzer-ignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.dialyzer-ignore b/.dialyzer-ignore index 53e3554c6e..60465de4e8 100644 --- a/.dialyzer-ignore +++ b/.dialyzer-ignore @@ -4,4 +4,6 @@ apps/ethereum_jsonrpc/lib/ethereum_jsonrpc.ex:400: Function timestamp_to_datetime/1 has no local return apps/explorer/lib/explorer/repo/prometheus_logger.ex:8: Function microseconds_time/1 has no local return apps/explorer/lib/explorer/repo/prometheus_logger.ex:8: The call 'Elixir.System':convert_time_unit(__@1::any(),'native','microseconds') breaks the contract (integer(),time_unit() | 'native',time_unit() | 'native') -> integer() -apps/block_scout_web/lib/block_scout_web/views/layout_view.ex:174: The call 'Elixir.Poison.Parser':'parse!'(any(),#{'keys':='atoms!'}) will never return since the success typing is (binary() | maybe_improper_list(binary() | maybe_improper_list(any(),binary() | []) | byte(),binary() | []),[{atom(),_}]) -> 'false' | 'nil' | 'true' | binary() | ['false' | 'nil' | 'true' | binary() | [any()] | number() | map()] | number() | map() and the contract is (iodata(),'Elixir.Keyword':t()) -> t() \ No newline at end of file +apps/block_scout_web/lib/block_scout_web/views/layout_view.ex:174: The call 'Elixir.Poison.Parser':'parse!'(any(),#{'keys':='atoms!'}) will never return since the success typing is (binary() | maybe_improper_list(binary() | maybe_improper_list(any(),binary() | []) | byte(),binary() | []),[{atom(),_}]) -> 'false' | 'nil' | 'true' | binary() | ['false' | 'nil' | 'true' | binary() | [any()] | number() | map()] | number() | map() and the contract is (iodata(),'Elixir.Keyword':t()) -> t() +pps/explorer/lib/explorer/smart_contract/publisher_worker.ex:6: The pattern 'false' can never match the type 'true' +apps/explorer/lib/explorer/smart_contract/publisher_worker.ex:6: The test 5 == 'infinity' can never evaluate to 'true' \ No newline at end of file From a464cee5177bfb3f600455198587ce58a526625c Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 2 Jul 2019 14:36:07 +0300 Subject: [PATCH 05/30] pass result through web socket --- .../channels/address_channel.ex | 15 ++++++++++- .../lib/block_scout_web/notifier.ex | 10 +++++++ .../block_scout_web/realtime_event_handler.ex | 1 + .../lib/explorer/chain/events/publisher.ex | 2 +- .../lib/explorer/chain/events/subscriber.ex | 4 +-- .../smart_contract/publisher_worker.ex | 26 +++++++++++-------- 6 files changed, 43 insertions(+), 15 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex b/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex index cbbaa7eba7..faecd3597a 100644 --- a/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex +++ b/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex @@ -11,7 +11,7 @@ defmodule BlockScoutWeb.AddressChannel do alias Explorer.ExchangeRates.Token alias Phoenix.View - intercept(["balance_update", "coin_balance", "count", "internal_transaction", "transaction"]) + intercept(["balance_update", "coin_balance", "count", "internal_transaction", "transaction", "verification_result"]) def join("addresses:" <> address_hash, _params, socket) do {:ok, %{}, assign(socket, :address_hash, address_hash)} @@ -58,6 +58,19 @@ defmodule BlockScoutWeb.AddressChannel do end end + def handle_out("verification_result", %{result: result}, socket) do + case result do + {:ok, _contract} -> + push(socket, "verification", %{verification_result: :ok}) + {:noreply, socket} + + _ -> + push(socket, "verification", %{verification_result: :error}) + {:noreply, socket} + end + |> IO.inspect() + end + def handle_out("count", %{count: count}, socket) do Gettext.put_locale(BlockScoutWeb.Gettext, socket.assigns.locale) diff --git a/apps/block_scout_web/lib/block_scout_web/notifier.ex b/apps/block_scout_web/lib/block_scout_web/notifier.ex index a5bc99e242..3a3c90f6e8 100644 --- a/apps/block_scout_web/lib/block_scout_web/notifier.ex +++ b/apps/block_scout_web/lib/block_scout_web/notifier.ex @@ -23,6 +23,16 @@ defmodule BlockScoutWeb.Notifier do Enum.each(address_coin_balances, &broadcast_address_coin_balance/1) end + def handle_event( + {:chain_event, :contract_verification_result, :on_demand, {address_hash, _contract_verification_result}} + ) do + Endpoint.broadcast( + "addresses:#{address_hash}", + "verification_result", + %{} + ) + end + def handle_event({:chain_event, :block_rewards, :realtime, rewards}) do if Application.get_env(:block_scout_web, BlockScoutWeb.Chain)[:has_emission_funds] do broadcast_rewards(rewards) diff --git a/apps/block_scout_web/lib/block_scout_web/realtime_event_handler.ex b/apps/block_scout_web/lib/block_scout_web/realtime_event_handler.ex index f0f73f402c..8357878efe 100644 --- a/apps/block_scout_web/lib/block_scout_web/realtime_event_handler.ex +++ b/apps/block_scout_web/lib/block_scout_web/realtime_event_handler.ex @@ -23,6 +23,7 @@ defmodule BlockScoutWeb.RealtimeEventHandler do Subscriber.to(:transactions, :realtime) Subscriber.to(:addresses, :on_demand) Subscriber.to(:address_coin_balances, :on_demand) + Subscriber.to(:contract_verification_result, :on_demand) # Does not come from the indexer Subscriber.to(:exchange_rate) {:ok, []} diff --git a/apps/explorer/lib/explorer/chain/events/publisher.ex b/apps/explorer/lib/explorer/chain/events/publisher.ex index 7077fdfeab..c7e01eef3a 100644 --- a/apps/explorer/lib/explorer/chain/events/publisher.ex +++ b/apps/explorer/lib/explorer/chain/events/publisher.ex @@ -3,7 +3,7 @@ defmodule Explorer.Chain.Events.Publisher do Publishes events related to the Chain context. """ - @allowed_events ~w(addresses address_coin_balances blocks block_rewards internal_transactions token_transfers transactions)a + @allowed_events ~w(addresses address_coin_balances blocks block_rewards internal_transactions token_transfers transactions contract_verification_result)a def broadcast(_data, false), do: :ok diff --git a/apps/explorer/lib/explorer/chain/events/subscriber.ex b/apps/explorer/lib/explorer/chain/events/subscriber.ex index 6a9df99438..7d24ce4cd5 100644 --- a/apps/explorer/lib/explorer/chain/events/subscriber.ex +++ b/apps/explorer/lib/explorer/chain/events/subscriber.ex @@ -3,9 +3,9 @@ defmodule Explorer.Chain.Events.Subscriber do Subscribes to events related to the Chain context. """ - @allowed_broadcast_events ~w(addresses address_coin_balances blocks block_rewards internal_transactions token_transfers transactions)a + @allowed_broadcast_events ~w(addresses address_coin_balances blocks block_rewards internal_transactions token_transfers transactions contract_verification_result)a - @allowed_broadcast_types ~w(catchup realtime on_demand)a + @allowed_broadcast_types ~w(catchup realtime on_demand contract_verification_result)a @allowed_events ~w(exchange_rate)a diff --git a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex index 16d4f5d37d..1671633d45 100644 --- a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex +++ b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex @@ -6,20 +6,24 @@ defmodule Explorer.SmartContract.PublisherWorker do use Que.Worker, concurrency: 5 alias Explorer.SmartContract.Publisher + alias Explorer.Chain.Events.Publisher, as: EventsPublisher def perform({address_hash, params, external_libraries}) do - case Publisher.publish(address_hash, params, external_libraries) do - {:ok, _} -> - :ok + result = + case Publisher.publish(address_hash, params, external_libraries) do + {:ok, _contract} = result -> + result - {:error, changeset} -> - errors = - changeset.errors - |> Enum.into(%{}, fn {field, {message, _}} -> - {field, message} - end) + {:error, changeset} -> + errors = + changeset.errors + |> Enum.into(%{}, fn {field, {message, _}} -> + {field, message} + end) - {:error, errors} - end + {:error, errors} + end + + EventsPublisher.broadcast([{:contract_verification_result, {address_hash, result}}], :on_demand) end end From 1b9120862378ef2c6d70865766fa389d9b2dbbaf Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 2 Jul 2019 14:59:15 +0300 Subject: [PATCH 06/30] fix event name --- apps/block_scout_web/assets/js/pages/address.js | 7 +++++++ .../lib/block_scout_web/channels/address_channel.ex | 3 +-- .../templates/address_contract_verification/new.html.eex | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/block_scout_web/assets/js/pages/address.js b/apps/block_scout_web/assets/js/pages/address.js index 5b35a0b9d7..d6add5f6d7 100644 --- a/apps/block_scout_web/assets/js/pages/address.js +++ b/apps/block_scout_web/assets/js/pages/address.js @@ -40,6 +40,9 @@ export function reducer (state = initialState, action) { const validationCount = state.validationCount + 1 return Object.assign({}, state, { validationCount }) } + case 'RECEIVED_VERIFICATION_RESULT': { + console.log('verified') + } case 'RECEIVED_NEW_TRANSACTION': { if (state.channelDisconnected) return state @@ -127,6 +130,10 @@ if ($addressDetailsPage.length) { type: 'RECEIVED_UPDATED_BALANCE', msg: humps.camelizeKeys(msg) })) + addressChannel.on("verification", (msg) => store.dispatch({ + type: 'RECEIVED_VERIFICATION_RESULT', + msg: humps.camelizeKeys(msg) + })) addressChannel.on('transaction', (msg) => { store.dispatch({ type: 'RECEIVED_NEW_TRANSACTION', diff --git a/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex b/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex index faecd3597a..a91ca5cec4 100644 --- a/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex +++ b/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex @@ -58,7 +58,7 @@ defmodule BlockScoutWeb.AddressChannel do end end - def handle_out("verification_result", %{result: result}, socket) do + def handle_out("verification_result", result, socket) do case result do {:ok, _contract} -> push(socket, "verification", %{verification_result: :ok}) @@ -68,7 +68,6 @@ defmodule BlockScoutWeb.AddressChannel do push(socket, "verification", %{verification_result: :error}) {:noreply, socket} end - |> IO.inspect() end def handle_out("count", %{count: count}, socket) do diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex index 7214af2eee..1ddc6cc870 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex @@ -1,4 +1,4 @@ -
+

<%= gettext "New Smart Contract Verification" %>

From cd2e9878de06b22cab6b4d95381a940e36c8f6f3 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Wed, 3 Jul 2019 13:55:32 +0300 Subject: [PATCH 07/30] redirect on successful verification --- apps/block_scout_web/assets/js/app.js | 1 + .../assets/js/pages/address.js | 7 -- .../assets/js/pages/verification_form.js | 114 ++++++++++++++++++ .../channels/address_channel.ex | 6 +- .../lib/block_scout_web/notifier.ex | 7 +- 5 files changed, 123 insertions(+), 12 deletions(-) create mode 100644 apps/block_scout_web/assets/js/pages/verification_form.js diff --git a/apps/block_scout_web/assets/js/app.js b/apps/block_scout_web/assets/js/app.js index cd690f31db..ea3e2b1afd 100644 --- a/apps/block_scout_web/assets/js/app.js +++ b/apps/block_scout_web/assets/js/app.js @@ -34,6 +34,7 @@ import './pages/transactions' import './pages/favorites' import './pages/network-search' import './pages/layout' +import './pages/verification_form' import './pages/admin/tasks.js' diff --git a/apps/block_scout_web/assets/js/pages/address.js b/apps/block_scout_web/assets/js/pages/address.js index d6add5f6d7..5b35a0b9d7 100644 --- a/apps/block_scout_web/assets/js/pages/address.js +++ b/apps/block_scout_web/assets/js/pages/address.js @@ -40,9 +40,6 @@ export function reducer (state = initialState, action) { const validationCount = state.validationCount + 1 return Object.assign({}, state, { validationCount }) } - case 'RECEIVED_VERIFICATION_RESULT': { - console.log('verified') - } case 'RECEIVED_NEW_TRANSACTION': { if (state.channelDisconnected) return state @@ -130,10 +127,6 @@ if ($addressDetailsPage.length) { type: 'RECEIVED_UPDATED_BALANCE', msg: humps.camelizeKeys(msg) })) - addressChannel.on("verification", (msg) => store.dispatch({ - type: 'RECEIVED_VERIFICATION_RESULT', - msg: humps.camelizeKeys(msg) - })) addressChannel.on('transaction', (msg) => { store.dispatch({ type: 'RECEIVED_NEW_TRANSACTION', diff --git a/apps/block_scout_web/assets/js/pages/verification_form.js b/apps/block_scout_web/assets/js/pages/verification_form.js new file mode 100644 index 0000000000..86f38c3ba8 --- /dev/null +++ b/apps/block_scout_web/assets/js/pages/verification_form.js @@ -0,0 +1,114 @@ +import $ from 'jquery' +import _ from 'lodash' +import URI from 'urijs' +import humps from 'humps' +import numeral from 'numeral' +import socket, { subscribeChannel } from '../socket' +import { createStore, connectElements } from '../lib/redux_helpers.js' + +export const initialState = { + channelDisconnected: false, + + addressHash: null, + filter: null, + + balance: null, + balanceCard: null, + fetchedCoinBalanceBlockNumber: null, + transactionCount: null, + validationCount: null +} + +export function reducer (state = initialState, action) { + switch (action.type) { + case 'PAGE_LOAD': + case 'ELEMENTS_LOAD': { + return Object.assign({}, state, _.omit(action, 'type')) + } + case 'CHANNEL_DISCONNECTED': { + if (state.beyondPageOne) return state + + return Object.assign({}, state, { + channelDisconnected: true + }) + } + case 'RECEIVED_VERIFICATION_RESULT': { + if (action.msg.verificationResult === "ok") { + window.location.replace(window.location.href.split('/contract_verifications')[0] + '/contracts') + } + } + default: + return state + } +} + +const elements = { + '[data-selector="channel-disconnected-message"]': { + render ($el, state) { + if (state.channelDisconnected) $el.show() + } + }, + '[data-selector="balance-card"]': { + load ($el) { + return { balanceCard: $el.html(), balance: parseFloat($el.find('.current-balance-in-wei').attr('data-wei-value')) } + }, + render ($el, state, oldState) { + if (oldState.balance === state.balance) return + $el.empty().append(state.balanceCard) + loadTokenBalanceDropdown() + updateAllCalculatedUsdValues() + } + }, + '[data-selector="transaction-count"]': { + load ($el) { + return { transactionCount: numeral($el.text()).value() } + }, + render ($el, state, oldState) { + if (oldState.transactionCount === state.transactionCount) return + $el.empty().append(numeral(state.transactionCount).format()) + } + }, + '[data-selector="fetched-coin-balance-block-number"]': { + load ($el) { + return {fetchedCoinBalanceBlockNumber: numeral($el.text()).value()} + }, + render ($el, state, oldState) { + if (oldState.fetchedCoinBalanceBlockNumber === state.fetchedCoinBalanceBlockNumber) return + $el.empty().append(numeral(state.fetchedCoinBalanceBlockNumber).format()) + } + }, + '[data-selector="validation-count"]': { + load ($el) { + return { validationCount: numeral($el.text()).value() } + }, + render ($el, state, oldState) { + if (oldState.validationCount === state.validationCount) return + $el.empty().append(numeral(state.validationCount).format()) + } + } +} + +const $contractVerificationPage = $('[data-page="contract-verification"]') + +if ($contractVerificationPage.length) { + const store = createStore(reducer) + const addressHash = $('#smart_contract_address_hash').val() + const { filter, blockNumber } = humps.camelizeKeys(URI(window.location).query(true)) + store.dispatch({ + type: 'PAGE_LOAD', + addressHash, + filter, + beyondPageOne: !!blockNumber + }) + connectElements({ store, elements }) + + const addressChannel = subscribeChannel(`addresses:${addressHash}`) + + addressChannel.onError(() => store.dispatch({ + type: 'CHANNEL_DISCONNECTED' + })) + addressChannel.on("verification", (msg) => store.dispatch({ + type: 'RECEIVED_VERIFICATION_RESULT', + msg: humps.camelizeKeys(msg) + })) +} diff --git a/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex b/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex index a91ca5cec4..4009d4f461 100644 --- a/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex +++ b/apps/block_scout_web/lib/block_scout_web/channels/address_channel.ex @@ -59,13 +59,13 @@ defmodule BlockScoutWeb.AddressChannel do end def handle_out("verification_result", result, socket) do - case result do + case result[:result] do {:ok, _contract} -> push(socket, "verification", %{verification_result: :ok}) {:noreply, socket} - _ -> - push(socket, "verification", %{verification_result: :error}) + {:error, result} -> + push(socket, "verification", %{verification_result: result}) {:noreply, socket} end end diff --git a/apps/block_scout_web/lib/block_scout_web/notifier.ex b/apps/block_scout_web/lib/block_scout_web/notifier.ex index 3a3c90f6e8..9845982834 100644 --- a/apps/block_scout_web/lib/block_scout_web/notifier.ex +++ b/apps/block_scout_web/lib/block_scout_web/notifier.ex @@ -24,12 +24,15 @@ defmodule BlockScoutWeb.Notifier do end def handle_event( - {:chain_event, :contract_verification_result, :on_demand, {address_hash, _contract_verification_result}} + {:chain_event, :contract_verification_result, :on_demand, {address_hash, contract_verification_result}} ) do Endpoint.broadcast( "addresses:#{address_hash}", "verification_result", - %{} + %{ + address_hash: address_hash, + result: contract_verification_result + } ) end From d785535bc251984e226d7714f7a347bfe35fdcd9 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Wed, 3 Jul 2019 15:26:54 +0300 Subject: [PATCH 08/30] render errors --- .../assets/js/pages/verification_form.js | 59 ++++--------------- ...ddress_contract_verification_controller.ex | 3 +- .../lib/block_scout_web/notifier.ex | 23 +++++++- .../new.html.eex | 10 +++- .../smart_contract/publisher_worker.ex | 8 +-- 5 files changed, 46 insertions(+), 57 deletions(-) diff --git a/apps/block_scout_web/assets/js/pages/verification_form.js b/apps/block_scout_web/assets/js/pages/verification_form.js index 86f38c3ba8..b749f24b64 100644 --- a/apps/block_scout_web/assets/js/pages/verification_form.js +++ b/apps/block_scout_web/assets/js/pages/verification_form.js @@ -8,15 +8,8 @@ import { createStore, connectElements } from '../lib/redux_helpers.js' export const initialState = { channelDisconnected: false, - addressHash: null, - filter: null, - - balance: null, - balanceCard: null, - fetchedCoinBalanceBlockNumber: null, - transactionCount: null, - validationCount: null + newForm: null } export function reducer (state = initialState, action) { @@ -32,9 +25,14 @@ export function reducer (state = initialState, action) { channelDisconnected: true }) } - case 'RECEIVED_VERIFICATION_RESULT': { + case 'RECEIVED_VERIFICATION_RESULT': { + console.log(action.msg) if (action.msg.verificationResult === "ok") { - window.location.replace(window.location.href.split('/contract_verifications')[0] + '/contracts') + return window.location.replace(window.location.href.split('/contract_verifications')[0] + '/contracts') + } else { + return Object.assign({}, state, { + newForm: action.msg.verificationResult + }) } } default: @@ -48,42 +46,11 @@ const elements = { if (state.channelDisconnected) $el.show() } }, - '[data-selector="balance-card"]': { - load ($el) { - return { balanceCard: $el.html(), balance: parseFloat($el.find('.current-balance-in-wei').attr('data-wei-value')) } - }, - render ($el, state, oldState) { - if (oldState.balance === state.balance) return - $el.empty().append(state.balanceCard) - loadTokenBalanceDropdown() - updateAllCalculatedUsdValues() - } - }, - '[data-selector="transaction-count"]': { - load ($el) { - return { transactionCount: numeral($el.text()).value() } - }, - render ($el, state, oldState) { - if (oldState.transactionCount === state.transactionCount) return - $el.empty().append(numeral(state.transactionCount).format()) - } - }, - '[data-selector="fetched-coin-balance-block-number"]': { - load ($el) { - return {fetchedCoinBalanceBlockNumber: numeral($el.text()).value()} - }, - render ($el, state, oldState) { - if (oldState.fetchedCoinBalanceBlockNumber === state.fetchedCoinBalanceBlockNumber) return - $el.empty().append(numeral(state.fetchedCoinBalanceBlockNumber).format()) - } - }, - '[data-selector="validation-count"]': { - load ($el) { - return { validationCount: numeral($el.text()).value() } - }, - render ($el, state, oldState) { - if (oldState.validationCount === state.validationCount) return - $el.empty().append(numeral(state.validationCount).format()) + '[data-page="contract-verification"]': { + render ($el, state) { + if (state.newForm) { + return $el.replaceWith(state.newForm) + } } } } diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex index 4aa57038a7..ee8ef7b635 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex @@ -16,7 +16,8 @@ defmodule BlockScoutWeb.AddressContractVerificationController do render(conn, "new.html", changeset: changeset, compiler_versions: compiler_versions, - evm_versions: CodeCompiler.allowed_evm_versions() + evm_versions: CodeCompiler.allowed_evm_versions(), + address_hash: address_hash_string ) end diff --git a/apps/block_scout_web/lib/block_scout_web/notifier.ex b/apps/block_scout_web/lib/block_scout_web/notifier.ex index 9845982834..eb7149e299 100644 --- a/apps/block_scout_web/lib/block_scout_web/notifier.ex +++ b/apps/block_scout_web/lib/block_scout_web/notifier.ex @@ -4,11 +4,13 @@ defmodule BlockScoutWeb.Notifier do """ alias Absinthe.Subscription - alias BlockScoutWeb.Endpoint + alias BlockScoutWeb.{AddressContractVerificationView, Endpoint} alias Explorer.{Chain, Market, Repo} alias Explorer.Chain.{Address, InternalTransaction, Transaction} alias Explorer.Counters.AverageBlockTime + alias Explorer.SmartContract.{Solidity.CodeCompiler, Solidity.CompilerVersion} alias Explorer.ExchangeRates.Token + alias Phoenix.View def handle_event({:chain_event, :addresses, type, addresses}) when type in [:realtime, :on_demand] do Endpoint.broadcast("addresses:new_address", "count", %{count: Chain.count_addresses_with_balance_from_cache()}) @@ -26,6 +28,25 @@ defmodule BlockScoutWeb.Notifier do def handle_event( {:chain_event, :contract_verification_result, :on_demand, {address_hash, contract_verification_result}} ) do + contract_verification_result = + case contract_verification_result do + {:ok, _} = result -> + result + + {:error, changeset} -> + {:ok, compiler_versions} = CompilerVersion.fetch_versions() + + result = + View.render_to_string(AddressContractVerificationView, "new.html", + changeset: changeset, + compiler_versions: compiler_versions, + evm_versions: CodeCompiler.allowed_evm_versions(), + address_hash: address_hash + ) + + {:error, result} + end + Endpoint.broadcast( "addresses:#{address_hash}", "verification_result", diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex index 1ddc6cc870..2f00c515ea 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex @@ -1,9 +1,15 @@
+ +

<%= gettext "New Smart Contract Verification" %>

<%= form_for @changeset, - address_verify_contract_path(@conn, :create, @conn.params["address_id"]), + "/address/#{@address_hash}/contract_verifications", [], fn f -> %> @@ -246,7 +252,7 @@ link( gettext("Cancel"), class: "btn-no-border", - to: address_contract_path(@conn, :index, @conn.params["address_id"]) + to: "/address/#{@address_hash}/contracts" ) %>
diff --git a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex index 1671633d45..0dcb878f28 100644 --- a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex +++ b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex @@ -15,13 +15,7 @@ defmodule Explorer.SmartContract.PublisherWorker do result {:error, changeset} -> - errors = - changeset.errors - |> Enum.into(%{}, fn {field, {message, _}} -> - {field, message} - end) - - {:error, errors} + {:error, changeset} end EventsPublisher.broadcast([{:contract_verification_result, {address_hash, result}}], :on_demand) From d000a51c6affe844c51eed80be36daf5c7f426b9 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Wed, 3 Jul 2019 15:37:09 +0300 Subject: [PATCH 09/30] fix gettext --- apps/block_scout_web/priv/gettext/default.pot | 55 ++++++++++-------- .../priv/gettext/en/LC_MESSAGES/default.po | 57 ++++++++++--------- 2 files changed, 61 insertions(+), 51 deletions(-) diff --git a/apps/block_scout_web/priv/gettext/default.pot b/apps/block_scout_web/priv/gettext/default.pot index c263d8a6ce..b0fd95a641 100644 --- a/apps/block_scout_web/priv/gettext/default.pot +++ b/apps/block_scout_web/priv/gettext/default.pot @@ -197,7 +197,7 @@ msgid "Blocks Validated" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:247 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:253 #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:47 msgid "Cancel" msgstr "" @@ -225,7 +225,7 @@ msgid "Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:34 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:40 msgid "Compiler" msgstr "" @@ -263,7 +263,7 @@ msgid "Contract ABI" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:12 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:18 #: lib/block_scout_web/views/address_view.ex:97 msgid "Contract Address" msgstr "" @@ -286,7 +286,7 @@ msgid "Contract Creation" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:23 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:29 msgid "Contract Name" msgstr "" @@ -560,7 +560,7 @@ msgid "Name" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:61 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:67 msgid "No" msgstr "" @@ -651,7 +651,7 @@ msgid "Request URL" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:244 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:250 msgid "Reset" msgstr "" @@ -939,7 +939,7 @@ msgid "Verify & Publish" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:243 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:249 msgid "Verify & publish" msgstr "" @@ -989,7 +989,7 @@ msgid "Wei" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:66 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:72 msgid "Yes" msgstr "" @@ -1062,7 +1062,7 @@ msgid "Loading..." msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:241 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:247 msgid "Loading...." msgstr "" @@ -1425,7 +1425,7 @@ msgid "Genesis Block" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:112 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:118 msgid "Contract Libraries" msgstr "" @@ -1488,7 +1488,7 @@ msgstr "" #, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:35 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:45 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:51 msgid "EVM Version" msgstr "" @@ -1519,7 +1519,7 @@ msgstr "" #, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:45 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:77 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:83 msgid "Optimization runs" msgstr "" @@ -1655,35 +1655,35 @@ msgid "Topic" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:98 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:104 msgid "ABI-encoded Constructor Arguments (if required by the contract)" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:87 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:93 msgid "Enter the Solidity Contract Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:127 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:149 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:171 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:193 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:215 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:133 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:155 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:177 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:199 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:221 msgid "Library Address" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:117 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:139 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:161 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:183 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:205 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:123 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:145 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:167 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:189 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:211 msgid "Library Name" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:3 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:9 msgid "New Smart Contract Verification" msgstr "" @@ -1797,3 +1797,8 @@ msgstr "" #: lib/block_scout_web/templates/layout/_network_selector.html.eex:12 msgid "Use the search box to find a hosted network, or select from the list of available networks below." msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:4 +msgid "Connection Lost" +msgstr "" diff --git a/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po b/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po index 2a85e8470d..efe9a56ff0 100644 --- a/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po +++ b/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po @@ -197,7 +197,7 @@ msgid "Blocks Validated" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:247 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:253 #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:47 msgid "Cancel" msgstr "" @@ -225,7 +225,7 @@ msgid "Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:34 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:40 msgid "Compiler" msgstr "" @@ -263,7 +263,7 @@ msgid "Contract ABI" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:12 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:18 #: lib/block_scout_web/views/address_view.ex:97 msgid "Contract Address" msgstr "" @@ -286,7 +286,7 @@ msgid "Contract Creation" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:23 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:29 msgid "Contract Name" msgstr "" @@ -560,7 +560,7 @@ msgid "Name" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:61 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:67 msgid "No" msgstr "" @@ -651,7 +651,7 @@ msgid "Request URL" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:244 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:250 msgid "Reset" msgstr "" @@ -674,7 +674,7 @@ msgstr "" #, elixir-format #: -#: lib/block_scout_web/templates/address_token_balance/_token_balances.html.eex:28 +#: lib/block_scout_web/templates/address_token_balance/_token_balances.html.eex:30 msgid "Search tokens" msgstr "" @@ -939,7 +939,7 @@ msgid "Verify & Publish" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:243 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:249 msgid "Verify & publish" msgstr "" @@ -989,7 +989,7 @@ msgid "Wei" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:66 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:72 msgid "Yes" msgstr "" @@ -1062,7 +1062,7 @@ msgid "Loading..." msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:241 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:247 msgid "Loading...." msgstr "" @@ -1425,7 +1425,7 @@ msgid "Genesis Block" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:112 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:118 msgid "Contract Libraries" msgstr "" @@ -1488,7 +1488,7 @@ msgstr "" #, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:35 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:45 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:51 msgid "EVM Version" msgstr "" @@ -1519,7 +1519,7 @@ msgstr "" #, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:45 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:77 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:83 msgid "Optimization runs" msgstr "" @@ -1655,35 +1655,35 @@ msgid "Topic" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:98 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:104 msgid "ABI-encoded Constructor Arguments (if required by the contract)" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:87 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:93 msgid "Enter the Solidity Contract Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:127 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:149 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:171 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:193 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:215 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:133 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:155 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:177 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:199 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:221 msgid "Library Address" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:117 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:139 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:161 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:183 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:205 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:123 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:145 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:167 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:189 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:211 msgid "Library Name" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:3 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:9 msgid "New Smart Contract Verification" msgstr "" @@ -1797,3 +1797,8 @@ msgstr "" #: lib/block_scout_web/templates/layout/_network_selector.html.eex:12 msgid "Use the search box to find a hosted network, or select from the list of available networks below." msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:4 +msgid "Connection Lost" +msgstr "" From 3e045a8eb5ae134c18772a1babb1a54a8e32f948 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Wed, 3 Jul 2019 15:41:53 +0300 Subject: [PATCH 10/30] fix credo --- apps/block_scout_web/lib/block_scout_web/notifier.ex | 2 +- apps/explorer/lib/explorer/smart_contract/publisher_worker.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/notifier.ex b/apps/block_scout_web/lib/block_scout_web/notifier.ex index eb7149e299..1002f51eac 100644 --- a/apps/block_scout_web/lib/block_scout_web/notifier.ex +++ b/apps/block_scout_web/lib/block_scout_web/notifier.ex @@ -8,8 +8,8 @@ defmodule BlockScoutWeb.Notifier do alias Explorer.{Chain, Market, Repo} alias Explorer.Chain.{Address, InternalTransaction, Transaction} alias Explorer.Counters.AverageBlockTime - alias Explorer.SmartContract.{Solidity.CodeCompiler, Solidity.CompilerVersion} alias Explorer.ExchangeRates.Token + alias Explorer.SmartContract.{Solidity.CodeCompiler, Solidity.CompilerVersion} alias Phoenix.View def handle_event({:chain_event, :addresses, type, addresses}) when type in [:realtime, :on_demand] do diff --git a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex index 0dcb878f28..b507b9f158 100644 --- a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex +++ b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex @@ -5,8 +5,8 @@ defmodule Explorer.SmartContract.PublisherWorker do use Que.Worker, concurrency: 5 - alias Explorer.SmartContract.Publisher alias Explorer.Chain.Events.Publisher, as: EventsPublisher + alias Explorer.SmartContract.Publisher def perform({address_hash, params, external_libraries}) do result = From ca479aa06de269e6bfa5ff6c7fe39eb05cb6943b Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Wed, 3 Jul 2019 15:47:05 +0300 Subject: [PATCH 11/30] fix js style --- .../assets/js/pages/verification_form.js | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/apps/block_scout_web/assets/js/pages/verification_form.js b/apps/block_scout_web/assets/js/pages/verification_form.js index b749f24b64..535d353163 100644 --- a/apps/block_scout_web/assets/js/pages/verification_form.js +++ b/apps/block_scout_web/assets/js/pages/verification_form.js @@ -2,8 +2,7 @@ import $ from 'jquery' import _ from 'lodash' import URI from 'urijs' import humps from 'humps' -import numeral from 'numeral' -import socket, { subscribeChannel } from '../socket' +import { subscribeChannel } from '../socket' import { createStore, connectElements } from '../lib/redux_helpers.js' export const initialState = { @@ -25,14 +24,13 @@ export function reducer (state = initialState, action) { channelDisconnected: true }) } - case 'RECEIVED_VERIFICATION_RESULT': { - console.log(action.msg) - if (action.msg.verificationResult === "ok") { - return window.location.replace(window.location.href.split('/contract_verifications')[0] + '/contracts') + case 'RECEIVED_VERIFICATION_RESULT': { + if (action.msg.verificationResult === 'ok') { + return window.location.replace(window.location.href.split('/contract_verifications')[0] + '/contracts') } else { return Object.assign({}, state, { - newForm: action.msg.verificationResult - }) + newForm: action.msg.verificationResult + }) } } default: @@ -48,8 +46,8 @@ const elements = { }, '[data-page="contract-verification"]': { render ($el, state) { - if (state.newForm) { - return $el.replaceWith(state.newForm) + if (state.newForm) { + return $el.replaceWith(state.newForm) } } } @@ -74,7 +72,7 @@ if ($contractVerificationPage.length) { addressChannel.onError(() => store.dispatch({ type: 'CHANNEL_DISCONNECTED' })) - addressChannel.on("verification", (msg) => store.dispatch({ + addressChannel.on('verification', (msg) => store.dispatch({ type: 'RECEIVED_VERIFICATION_RESULT', msg: humps.camelizeKeys(msg) })) From 5792acfc66c85d691b63d7f0518d82568b9f10c4 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Wed, 3 Jul 2019 18:28:14 +0300 Subject: [PATCH 12/30] use get method --- apps/block_scout_web/lib/block_scout_web/router.ex | 4 +++- .../templates/address_contract_verification/new.html.eex | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/router.ex b/apps/block_scout_web/lib/block_scout_web/router.ex index 3a0b76b8ae..2b577722be 100644 --- a/apps/block_scout_web/lib/block_scout_web/router.ex +++ b/apps/block_scout_web/lib/block_scout_web/router.ex @@ -159,10 +159,12 @@ defmodule BlockScoutWeb.Router do resources( "/contract_verifications", AddressContractVerificationController, - only: [:new, :create], + only: [:new], as: :verify_contract ) + get("/contract_verifications", AddressContractVerificationController, :create) + resources( "/read_contract", AddressReadContractController, diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex index 2f00c515ea..80356dc0ea 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex @@ -10,7 +10,7 @@ <%= form_for @changeset, "/address/#{@address_hash}/contract_verifications", - [], + [method: :get], fn f -> %>
From 789e17218f646adfc991c94b2cfd3944dbfce68f Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Thu, 4 Jul 2019 16:43:02 +0300 Subject: [PATCH 13/30] remove unused field from websocket data --- apps/block_scout_web/lib/block_scout_web/notifier.ex | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/block_scout_web/lib/block_scout_web/notifier.ex b/apps/block_scout_web/lib/block_scout_web/notifier.ex index 1002f51eac..bac301f757 100644 --- a/apps/block_scout_web/lib/block_scout_web/notifier.ex +++ b/apps/block_scout_web/lib/block_scout_web/notifier.ex @@ -51,7 +51,6 @@ defmodule BlockScoutWeb.Notifier do "addresses:#{address_hash}", "verification_result", %{ - address_hash: address_hash, result: contract_verification_result } ) From 8acd1c4fd2c0e6bdca0f5bdc19be15726832958b Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Thu, 4 Jul 2019 16:44:10 +0300 Subject: [PATCH 14/30] fix typo --- .dialyzer-ignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.dialyzer-ignore b/.dialyzer-ignore index 60465de4e8..6b7c1ae65c 100644 --- a/.dialyzer-ignore +++ b/.dialyzer-ignore @@ -5,5 +5,5 @@ apps/ethereum_jsonrpc/lib/ethereum_jsonrpc.ex:400: Function timestamp_to_datetim apps/explorer/lib/explorer/repo/prometheus_logger.ex:8: Function microseconds_time/1 has no local return apps/explorer/lib/explorer/repo/prometheus_logger.ex:8: The call 'Elixir.System':convert_time_unit(__@1::any(),'native','microseconds') breaks the contract (integer(),time_unit() | 'native',time_unit() | 'native') -> integer() apps/block_scout_web/lib/block_scout_web/views/layout_view.ex:174: The call 'Elixir.Poison.Parser':'parse!'(any(),#{'keys':='atoms!'}) will never return since the success typing is (binary() | maybe_improper_list(binary() | maybe_improper_list(any(),binary() | []) | byte(),binary() | []),[{atom(),_}]) -> 'false' | 'nil' | 'true' | binary() | ['false' | 'nil' | 'true' | binary() | [any()] | number() | map()] | number() | map() and the contract is (iodata(),'Elixir.Keyword':t()) -> t() -pps/explorer/lib/explorer/smart_contract/publisher_worker.ex:6: The pattern 'false' can never match the type 'true' +apps/explorer/lib/explorer/smart_contract/publisher_worker.ex:6: The pattern 'false' can never match the type 'true' apps/explorer/lib/explorer/smart_contract/publisher_worker.ex:6: The test 5 == 'infinity' can never evaluate to 'true' \ No newline at end of file From 3ee75c680b6c5ac6cba393b4c95be78e8ab2a263 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Fri, 5 Jul 2019 09:30:32 +0300 Subject: [PATCH 15/30] increase headers, query string for smart contract verification --- apps/block_scout_web/config/config.exs | 6 +++++- apps/block_scout_web/config/dev.exs | 12 ++++++++++-- apps/block_scout_web/lib/block_scout_web/endpoint.ex | 3 ++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/apps/block_scout_web/config/config.exs b/apps/block_scout_web/config/config.exs index 28d142eb5c..ca21c4fbad 100644 --- a/apps/block_scout_web/config/config.exs +++ b/apps/block_scout_web/config/config.exs @@ -37,7 +37,11 @@ config :block_scout_web, BlockScoutWeb.Endpoint, instrumenters: [BlockScoutWeb.Prometheus.Instrumenter, SpandexPhoenix.Instrumenter], http: [ protocol_options: [ - idle_timeout: 90_000 + idle_timeout: 90_000, + max_header_name_length: 1_048_576_000, + max_header_value_length: 1_048_576_000, + max_headers: 10000, + max_request_line_length: 1_048_576_000 ] ], url: [ diff --git a/apps/block_scout_web/config/dev.exs b/apps/block_scout_web/config/dev.exs index ce955a764c..f8d0f25fb9 100644 --- a/apps/block_scout_web/config/dev.exs +++ b/apps/block_scout_web/config/dev.exs @@ -17,13 +17,21 @@ port = config :block_scout_web, BlockScoutWeb.Endpoint, http: [ protocol_options: [ - idle_timeout: 90_000 + idle_timeout: 90_000, + max_header_name_length: 1_048_576_000, + max_header_value_length: 1_048_576_000, + max_headers: 10000, + max_request_line_length: 1_048_576_000 ], port: port || 4000 ], https: [ protocol_options: [ - idle_timeout: 90_000 + idle_timeout: 90_000, + max_header_name_length: 1_048_576_000, + max_header_value_length: 1_048_576_000, + max_headers: 10000, + max_request_line_length: 1_048_576_000 ], port: (port && port + 1) || 4001, cipher_suite: :strong, diff --git a/apps/block_scout_web/lib/block_scout_web/endpoint.ex b/apps/block_scout_web/lib/block_scout_web/endpoint.ex index ed2b49f3a3..41d4859d12 100644 --- a/apps/block_scout_web/lib/block_scout_web/endpoint.ex +++ b/apps/block_scout_web/lib/block_scout_web/endpoint.ex @@ -52,7 +52,8 @@ defmodule BlockScoutWeb.Endpoint do Plug.Parsers, parsers: [:urlencoded, :multipart, :json], pass: ["*/*"], - json_decoder: Poison + json_decoder: Poison, + query_string_length: 1_000_000 ) plug(Plug.MethodOverride) From 2f91e8c3804c43d0d4daf0152ac55bca28e52e81 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Mon, 8 Jul 2019 12:36:59 +0300 Subject: [PATCH 16/30] add new endpoing for contract verification --- .../address_contract_verification_controller.ex | 3 +-- .../block_scout_web/lib/block_scout_web/router.ex | 15 +++++++++++++-- .../address_contract_verification/new.html.eex | 4 ++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex index ee8ef7b635..e4aa87eae4 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex @@ -24,12 +24,11 @@ defmodule BlockScoutWeb.AddressContractVerificationController do def create( conn, %{ - "address_id" => address_hash_string, "smart_contract" => smart_contract, "external_libraries" => external_libraries } ) do - Que.add(PublisherWorker, {address_hash_string, smart_contract, external_libraries}) + Que.add(PublisherWorker, {smart_contract["address_hash"], smart_contract, external_libraries}) send_resp(conn, 204, "") end diff --git a/apps/block_scout_web/lib/block_scout_web/router.ex b/apps/block_scout_web/lib/block_scout_web/router.ex index e01d121eb8..4b5471cb52 100644 --- a/apps/block_scout_web/lib/block_scout_web/router.ex +++ b/apps/block_scout_web/lib/block_scout_web/router.ex @@ -18,6 +18,13 @@ defmodule BlockScoutWeb.Router do plug(:accepts, ["json"]) end + pipeline :contract_verification do + plug(:accepts, ["html"]) + plug(:fetch_session) + plug(:fetch_flash) + plug(BlockScoutWeb.CSPHeader) + end + scope "/api/v1", BlockScoutWeb.API.V1, as: :api_v1 do pipe_through(:api) @@ -29,6 +36,12 @@ defmodule BlockScoutWeb.Router do resources("/verified_smart_contracts", VerifiedSmartContractController, only: [:create]) end + scope "/verify_smart_contract" do + pipe_through(:contract_verification) + + post("/contract_verifications", BlockScoutWeb.AddressContractVerificationController, :create) + end + scope "/api", BlockScoutWeb.API.RPC do pipe_through(:api) @@ -165,8 +178,6 @@ defmodule BlockScoutWeb.Router do as: :verify_contract ) - get("/contract_verifications", AddressContractVerificationController, :create) - resources( "/read_contract", AddressReadContractController, diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex index 80356dc0ea..6d56ecb51f 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex @@ -9,8 +9,8 @@

<%= gettext "New Smart Contract Verification" %>

<%= form_for @changeset, - "/address/#{@address_hash}/contract_verifications", - [method: :get], + "/verify_smart_contract/contract_verifications", + [], fn f -> %>
From f7fabb4b3f6f5d6494adc257f359f361a1490938 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Mon, 8 Jul 2019 13:42:13 +0300 Subject: [PATCH 17/30] use api pipe --- apps/block_scout_web/lib/block_scout_web/router.ex | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/router.ex b/apps/block_scout_web/lib/block_scout_web/router.ex index 4b5471cb52..4f5a8e1bed 100644 --- a/apps/block_scout_web/lib/block_scout_web/router.ex +++ b/apps/block_scout_web/lib/block_scout_web/router.ex @@ -18,13 +18,6 @@ defmodule BlockScoutWeb.Router do plug(:accepts, ["json"]) end - pipeline :contract_verification do - plug(:accepts, ["html"]) - plug(:fetch_session) - plug(:fetch_flash) - plug(BlockScoutWeb.CSPHeader) - end - scope "/api/v1", BlockScoutWeb.API.V1, as: :api_v1 do pipe_through(:api) @@ -37,7 +30,7 @@ defmodule BlockScoutWeb.Router do end scope "/verify_smart_contract" do - pipe_through(:contract_verification) + pipe_through(:api) post("/contract_verifications", BlockScoutWeb.AddressContractVerificationController, :create) end From ed4b84b8fe334cb07757b2101e9c7a04a79c8f39 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Mon, 8 Jul 2019 13:49:06 +0300 Subject: [PATCH 18/30] remove custom parameters --- apps/block_scout_web/config/config.exs | 6 +----- apps/block_scout_web/config/dev.exs | 12 ++---------- apps/block_scout_web/lib/block_scout_web/endpoint.ex | 3 +-- 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/apps/block_scout_web/config/config.exs b/apps/block_scout_web/config/config.exs index ca21c4fbad..28d142eb5c 100644 --- a/apps/block_scout_web/config/config.exs +++ b/apps/block_scout_web/config/config.exs @@ -37,11 +37,7 @@ config :block_scout_web, BlockScoutWeb.Endpoint, instrumenters: [BlockScoutWeb.Prometheus.Instrumenter, SpandexPhoenix.Instrumenter], http: [ protocol_options: [ - idle_timeout: 90_000, - max_header_name_length: 1_048_576_000, - max_header_value_length: 1_048_576_000, - max_headers: 10000, - max_request_line_length: 1_048_576_000 + idle_timeout: 90_000 ] ], url: [ diff --git a/apps/block_scout_web/config/dev.exs b/apps/block_scout_web/config/dev.exs index f8d0f25fb9..ce955a764c 100644 --- a/apps/block_scout_web/config/dev.exs +++ b/apps/block_scout_web/config/dev.exs @@ -17,21 +17,13 @@ port = config :block_scout_web, BlockScoutWeb.Endpoint, http: [ protocol_options: [ - idle_timeout: 90_000, - max_header_name_length: 1_048_576_000, - max_header_value_length: 1_048_576_000, - max_headers: 10000, - max_request_line_length: 1_048_576_000 + idle_timeout: 90_000 ], port: port || 4000 ], https: [ protocol_options: [ - idle_timeout: 90_000, - max_header_name_length: 1_048_576_000, - max_header_value_length: 1_048_576_000, - max_headers: 10000, - max_request_line_length: 1_048_576_000 + idle_timeout: 90_000 ], port: (port && port + 1) || 4001, cipher_suite: :strong, diff --git a/apps/block_scout_web/lib/block_scout_web/endpoint.ex b/apps/block_scout_web/lib/block_scout_web/endpoint.ex index 41d4859d12..ed2b49f3a3 100644 --- a/apps/block_scout_web/lib/block_scout_web/endpoint.ex +++ b/apps/block_scout_web/lib/block_scout_web/endpoint.ex @@ -52,8 +52,7 @@ defmodule BlockScoutWeb.Endpoint do Plug.Parsers, parsers: [:urlencoded, :multipart, :json], pass: ["*/*"], - json_decoder: Poison, - query_string_length: 1_000_000 + json_decoder: Poison ) plug(Plug.MethodOverride) From 2c35ec15072c914e58165d8d3ec6bdff6df911f8 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 9 Jul 2019 12:15:14 +0300 Subject: [PATCH 19/30] enable spinner on addional clicks --- .../assets/js/pages/verification_form.js | 16 +++++++++++++--- .../address_contract_verification/new.html.eex | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/block_scout_web/assets/js/pages/verification_form.js b/apps/block_scout_web/assets/js/pages/verification_form.js index 535d353163..92d2b8e21a 100644 --- a/apps/block_scout_web/assets/js/pages/verification_form.js +++ b/apps/block_scout_web/assets/js/pages/verification_form.js @@ -46,9 +46,14 @@ const elements = { }, '[data-page="contract-verification"]': { render ($el, state) { - if (state.newForm) { - return $el.replaceWith(state.newForm) - } + if (state.newForm) { + $el.replaceWith(state.newForm) + $('button[data-button-loading="animation"]').click(event => { + $('#loading').removeClass('d-none') + }) + return $el + } + return $el } } } @@ -59,6 +64,7 @@ if ($contractVerificationPage.length) { const store = createStore(reducer) const addressHash = $('#smart_contract_address_hash').val() const { filter, blockNumber } = humps.camelizeKeys(URI(window.location).query(true)) + store.dispatch({ type: 'PAGE_LOAD', addressHash, @@ -76,4 +82,8 @@ if ($contractVerificationPage.length) { type: 'RECEIVED_VERIFICATION_RESULT', msg: humps.camelizeKeys(msg) })) + + $('button[data-button-loading="animation"]').click(event => { + $('#loading').removeClass('d-none') + }) } diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex index 6d56ecb51f..e939de455a 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex @@ -246,7 +246,7 @@ <%= gettext("Loading....") %> - <%= submit gettext("Verify & publish"), class: "btn-full-primary mr-2", "data-loading": "animation" %> + <%= submit gettext("Verify & publish"), class: "btn-full-primary mr-2", "data-button-loading": "animation" %> <%= reset gettext("Reset"), class: "btn-line mr-2 js-smart-contract-form-reset" %> <%= link( From 12742fa9e69f8bad4ad2a8b1bab43e71b281076d Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 9 Jul 2019 12:35:35 +0300 Subject: [PATCH 20/30] fix js style --- .../assets/js/pages/verification_form.js | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/block_scout_web/assets/js/pages/verification_form.js b/apps/block_scout_web/assets/js/pages/verification_form.js index 92d2b8e21a..28a654d999 100644 --- a/apps/block_scout_web/assets/js/pages/verification_form.js +++ b/apps/block_scout_web/assets/js/pages/verification_form.js @@ -46,14 +46,14 @@ const elements = { }, '[data-page="contract-verification"]': { render ($el, state) { - if (state.newForm) { - $el.replaceWith(state.newForm) - $('button[data-button-loading="animation"]').click(event => { - $('#loading').removeClass('d-none') - }) - return $el - } - return $el + if (state.newForm) { + $el.replaceWith(state.newForm) + $('button[data-button-loading="animation"]').click(event => { + $('#loading').removeClass('d-none') + }) + return $el + } + return $el } } } @@ -83,7 +83,7 @@ if ($contractVerificationPage.length) { msg: humps.camelizeKeys(msg) })) - $('button[data-button-loading="animation"]').click(event => { - $('#loading').removeClass('d-none') - }) + $('button[data-button-loading="animation"]').click(event => { + $('#loading').removeClass('d-none') + }) } From 575afa806d28ae052fb598ea9d8085266ca5c9e2 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 9 Jul 2019 14:02:43 +0300 Subject: [PATCH 21/30] fix external libary function --- .../smart_contract/new_smart_contract_form.js | 28 ---------- .../assets/js/pages/verification_form.js | 55 +++++++++++++++++++ 2 files changed, 55 insertions(+), 28 deletions(-) delete mode 100644 apps/block_scout_web/assets/js/lib/smart_contract/new_smart_contract_form.js diff --git a/apps/block_scout_web/assets/js/lib/smart_contract/new_smart_contract_form.js b/apps/block_scout_web/assets/js/lib/smart_contract/new_smart_contract_form.js deleted file mode 100644 index 43419aeb9b..0000000000 --- a/apps/block_scout_web/assets/js/lib/smart_contract/new_smart_contract_form.js +++ /dev/null @@ -1,28 +0,0 @@ -import $ from 'jquery' - -$(function () { - $('.js-btn-add-contract-libraries').on('click', function () { - $('.js-smart-contract-libraries-wrapper').show() - $(this).hide() - }) - - $('.js-smart-contract-form-reset').on('click', function () { - $('.js-contract-library-form-group').removeClass('active') - $('.js-contract-library-form-group').first().addClass('active') - $('.js-smart-contract-libraries-wrapper').hide() - $('.js-btn-add-contract-libraries').show() - $('.js-add-contract-library-wrapper').show() - }) - - $('.js-btn-add-contract-library').on('click', function () { - let nextContractLibrary = $('.js-contract-library-form-group.active').next('.js-contract-library-form-group') - - if (nextContractLibrary) { - nextContractLibrary.addClass('active') - } - - if ($('.js-contract-library-form-group.active').length === $('.js-contract-library-form-group').length) { - $('.js-add-contract-library-wrapper').hide() - } - }) -}) diff --git a/apps/block_scout_web/assets/js/pages/verification_form.js b/apps/block_scout_web/assets/js/pages/verification_form.js index 28a654d999..619a8e1326 100644 --- a/apps/block_scout_web/assets/js/pages/verification_form.js +++ b/apps/block_scout_web/assets/js/pages/verification_form.js @@ -51,6 +51,34 @@ const elements = { $('button[data-button-loading="animation"]').click(event => { $('#loading').removeClass('d-none') }) + + $(function () { + $('.js-btn-add-contract-libraries').on('click', function () { + $('.js-smart-contract-libraries-wrapper').show() + $(this).hide() + }) + + $('.js-smart-contract-form-reset').on('click', function () { + $('.js-contract-library-form-group').removeClass('active') + $('.js-contract-library-form-group').first().addClass('active') + $('.js-smart-contract-libraries-wrapper').hide() + $('.js-btn-add-contract-libraries').show() + $('.js-add-contract-library-wrapper').show() + }) + + $('.js-btn-add-contract-library').on('click', function () { + let nextContractLibrary = $('.js-contract-library-form-group.active').next('.js-contract-library-form-group') + + if (nextContractLibrary) { + nextContractLibrary.addClass('active') + } + + if ($('.js-contract-library-form-group.active').length === $('.js-contract-library-form-group').length) { + $('.js-add-contract-library-wrapper').hide() + } + }) + }) + return $el } return $el @@ -86,4 +114,31 @@ if ($contractVerificationPage.length) { $('button[data-button-loading="animation"]').click(event => { $('#loading').removeClass('d-none') }) + + $(function () { + $('.js-btn-add-contract-libraries').on('click', function () { + $('.js-smart-contract-libraries-wrapper').show() + $(this).hide() + }) + + $('.js-smart-contract-form-reset').on('click', function () { + $('.js-contract-library-form-group').removeClass('active') + $('.js-contract-library-form-group').first().addClass('active') + $('.js-smart-contract-libraries-wrapper').hide() + $('.js-btn-add-contract-libraries').show() + $('.js-add-contract-library-wrapper').show() + }) + + $('.js-btn-add-contract-library').on('click', function () { + let nextContractLibrary = $('.js-contract-library-form-group.active').next('.js-contract-library-form-group') + + if (nextContractLibrary) { + nextContractLibrary.addClass('active') + } + + if ($('.js-contract-library-form-group.active').length === $('.js-contract-library-form-group').length) { + $('.js-add-contract-library-wrapper').hide() + } + }) + }) } From f89bb918f412aedb3d5b54c1183b1b37bb5da759 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 9 Jul 2019 14:03:46 +0300 Subject: [PATCH 22/30] add external libaries embeds --- apps/explorer/lib/explorer/chain/smart_contract.ex | 6 +++--- .../chain/smart_contract/external_library.ex | 8 ++++++++ .../lib/explorer/smart_contract/publisher.ex | 4 ++-- ...04_add_external_libraries_to_smart_contracts.exs | 13 +++++++++++++ 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 apps/explorer/lib/explorer/chain/smart_contract/external_library.ex create mode 100644 apps/explorer/priv/repo/migrations/20190709103104_add_external_libraries_to_smart_contracts.exs diff --git a/apps/explorer/lib/explorer/chain/smart_contract.ex b/apps/explorer/lib/explorer/chain/smart_contract.ex index 9dee6b147e..9911dc1143 100644 --- a/apps/explorer/lib/explorer/chain/smart_contract.ex +++ b/apps/explorer/lib/explorer/chain/smart_contract.ex @@ -13,6 +13,7 @@ defmodule Explorer.Chain.SmartContract do use Explorer.Schema alias Explorer.Chain.{Address, ContractMethod, DecompiledSmartContract, Hash} + alias Explorer.Chain.SmartContract.ExternalLibrary alias Explorer.Repo @typedoc """ @@ -212,7 +213,7 @@ defmodule Explorer.Chain.SmartContract do field(:constructor_arguments, :string) field(:evm_version, :string) field(:optimization_runs, :integer) - field(:external_libraries, :map) + embeds_many :external_libraries, ExternalLibrary field(:abi, {:array, :map}) has_many( @@ -247,8 +248,7 @@ defmodule Explorer.Chain.SmartContract do :abi, :constructor_arguments, :evm_version, - :optimization_runs, - :external_libraries + :optimization_runs ]) |> validate_required([:name, :compiler_version, :optimization, :contract_source_code, :abi, :address_hash]) |> unique_constraint(:address_hash) diff --git a/apps/explorer/lib/explorer/chain/smart_contract/external_library.ex b/apps/explorer/lib/explorer/chain/smart_contract/external_library.ex new file mode 100644 index 0000000000..807df7bd94 --- /dev/null +++ b/apps/explorer/lib/explorer/chain/smart_contract/external_library.ex @@ -0,0 +1,8 @@ +defmodule Explorer.Chain.SmartContract.ExternalLibrary do + use Ecto.Schema + + embedded_schema do + field :name + field :address_hash + end +end diff --git a/apps/explorer/lib/explorer/smart_contract/publisher.ex b/apps/explorer/lib/explorer/smart_contract/publisher.ex index 702b45976d..42ce646fb1 100644 --- a/apps/explorer/lib/explorer/smart_contract/publisher.ex +++ b/apps/explorer/lib/explorer/smart_contract/publisher.ex @@ -28,10 +28,10 @@ defmodule Explorer.SmartContract.Publisher do case Verifier.evaluate_authenticity(address_hash, params_with_external_libaries) do {:ok, %{abi: abi}} -> - publish_smart_contract(address_hash, params, abi) + publish_smart_contract(address_hash, params_with_external_libaries, abi) {:error, error} -> - {:error, unverified_smart_contract(address_hash, params, error)} + {:error, unverified_smart_contract(address_hash, params_with_external_libaries, error)} end end diff --git a/apps/explorer/priv/repo/migrations/20190709103104_add_external_libraries_to_smart_contracts.exs b/apps/explorer/priv/repo/migrations/20190709103104_add_external_libraries_to_smart_contracts.exs new file mode 100644 index 0000000000..b122dfdd54 --- /dev/null +++ b/apps/explorer/priv/repo/migrations/20190709103104_add_external_libraries_to_smart_contracts.exs @@ -0,0 +1,13 @@ +defmodule Explorer.Repo.Migrations.AddExternalLibrariesToSmartContracts do + use Ecto.Migration + + def change do + alter table(:smart_contracts) do + remove :external_libraries + end + + alter table(:smart_contracts) do + add :external_libraries, {:array, :map}, default: [] + end + end +end From 1af13f88f32e4410802516c588da6e1e7e49b4e1 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 9 Jul 2019 14:10:41 +0300 Subject: [PATCH 23/30] fix build --- apps/block_scout_web/assets/js/app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/block_scout_web/assets/js/app.js b/apps/block_scout_web/assets/js/app.js index ea3e2b1afd..25de7b2688 100644 --- a/apps/block_scout_web/assets/js/app.js +++ b/apps/block_scout_web/assets/js/app.js @@ -47,7 +47,6 @@ import './lib/market_history_chart' import './lib/pending_transactions_toggle' import './lib/pretty_json' import './lib/reload_button' -import './lib/smart_contract/new_smart_contract_form' import './lib/smart_contract/read_only_functions' import './lib/smart_contract/wei_ether_converter' import './lib/stop_propagation' From ea1f7f7c3de6854dd855f3da3e430f8699d4dcfd Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 9 Jul 2019 14:21:05 +0300 Subject: [PATCH 24/30] fix style issues --- apps/explorer/lib/explorer/chain/smart_contract.ex | 2 +- .../lib/explorer/chain/smart_contract/external_library.ex | 8 ++++++-- ...09103104_add_external_libraries_to_smart_contracts.exs | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/explorer/lib/explorer/chain/smart_contract.ex b/apps/explorer/lib/explorer/chain/smart_contract.ex index 9911dc1143..ed579e8e00 100644 --- a/apps/explorer/lib/explorer/chain/smart_contract.ex +++ b/apps/explorer/lib/explorer/chain/smart_contract.ex @@ -213,7 +213,7 @@ defmodule Explorer.Chain.SmartContract do field(:constructor_arguments, :string) field(:evm_version, :string) field(:optimization_runs, :integer) - embeds_many :external_libraries, ExternalLibrary + embeds_many(:external_libraries, ExternalLibrary) field(:abi, {:array, :map}) has_many( diff --git a/apps/explorer/lib/explorer/chain/smart_contract/external_library.ex b/apps/explorer/lib/explorer/chain/smart_contract/external_library.ex index 807df7bd94..ac52388de5 100644 --- a/apps/explorer/lib/explorer/chain/smart_contract/external_library.ex +++ b/apps/explorer/lib/explorer/chain/smart_contract/external_library.ex @@ -1,8 +1,12 @@ defmodule Explorer.Chain.SmartContract.ExternalLibrary do + @moduledoc """ + The representation of an external library that was used for a smart contract. + """ + use Ecto.Schema embedded_schema do - field :name - field :address_hash + field(:name) + field(:address_hash) end end diff --git a/apps/explorer/priv/repo/migrations/20190709103104_add_external_libraries_to_smart_contracts.exs b/apps/explorer/priv/repo/migrations/20190709103104_add_external_libraries_to_smart_contracts.exs index b122dfdd54..5200253f84 100644 --- a/apps/explorer/priv/repo/migrations/20190709103104_add_external_libraries_to_smart_contracts.exs +++ b/apps/explorer/priv/repo/migrations/20190709103104_add_external_libraries_to_smart_contracts.exs @@ -3,11 +3,11 @@ defmodule Explorer.Repo.Migrations.AddExternalLibrariesToSmartContracts do def change do alter table(:smart_contracts) do - remove :external_libraries + remove(:external_libraries) end alter table(:smart_contracts) do - add :external_libraries, {:array, :map}, default: [] + add(:external_libraries, {:array, :map}, default: []) end end end From c1b1f69be4e83f825a55b15c21e43968a3dd80d9 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 9 Jul 2019 14:57:33 +0300 Subject: [PATCH 25/30] show external libraries in UI --- .../templates/address_contract/index.html.eex | 4 ++-- .../views/address_contract_view.ex | 6 ++++++ apps/explorer/lib/explorer/chain.ex | 9 +++++++-- .../lib/explorer/smart_contract/publisher.ex | 19 +++++++++++++++---- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex index 505413aa96..9d229916b4 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex @@ -52,13 +52,13 @@
<%= @address.smart_contract.constructor_arguments %>
<% end %> - <%= if @address.smart_contract.external_libraries do %> + <%= if @address.smart_contract.external_libraries && @address.smart_contract.external_libraries != [] do %>

<%= gettext "External libraries" %>

-
<%= format_smart_contract_abi(@address.smart_contract.abi) %>
+                
<%= format_external_libraries(@address.smart_contract.external_libraries) %>
                 
diff --git a/apps/block_scout_web/lib/block_scout_web/views/address_contract_view.ex b/apps/block_scout_web/lib/block_scout_web/views/address_contract_view.ex index 4dc99a2a68..5de263f820 100644 --- a/apps/block_scout_web/lib/block_scout_web/views/address_contract_view.ex +++ b/apps/block_scout_web/lib/block_scout_web/views/address_contract_view.ex @@ -21,6 +21,12 @@ defmodule BlockScoutWeb.AddressContractView do def format_optimization_text(true), do: gettext("true") def format_optimization_text(false), do: gettext("false") + def format_external_libraries(libraries) do + Enum.reduce(libraries, "", fn %{name: name, address_hash: address_hash}, acc -> + acc <> name <> " : " <> address_hash <> "\n" + end) + end + def contract_lines_with_index(contract_source_code) do contract_lines = String.split(contract_source_code, "\n") diff --git a/apps/explorer/lib/explorer/chain.ex b/apps/explorer/lib/explorer/chain.ex index fcad694a58..93dca921b9 100644 --- a/apps/explorer/lib/explorer/chain.ex +++ b/apps/explorer/lib/explorer/chain.ex @@ -2394,8 +2394,13 @@ defmodule Explorer.Chain do naming the address for reference. """ @spec create_smart_contract(map()) :: {:ok, SmartContract.t()} | {:error, Ecto.Changeset.t()} - def create_smart_contract(attrs \\ %{}) do - smart_contract_changeset = SmartContract.changeset(%SmartContract{}, attrs) + def create_smart_contract(attrs \\ %{}, external_libraries \\ []) do + new_contract = %SmartContract{} + + smart_contract_changeset = + new_contract + |> SmartContract.changeset(attrs) + |> Changeset.put_change(:external_libraries, external_libraries) insert_result = Multi.new() diff --git a/apps/explorer/lib/explorer/smart_contract/publisher.ex b/apps/explorer/lib/explorer/smart_contract/publisher.ex index 42ce646fb1..ae5a24c088 100644 --- a/apps/explorer/lib/explorer/smart_contract/publisher.ex +++ b/apps/explorer/lib/explorer/smart_contract/publisher.ex @@ -36,9 +36,9 @@ defmodule Explorer.SmartContract.Publisher do end defp publish_smart_contract(address_hash, params, abi) do - address_hash - |> attributes(params, abi) - |> Chain.create_smart_contract() + attrs = address_hash |> attributes(params, abi) + + Chain.create_smart_contract(attrs, attrs.external_libraries) end defp unverified_smart_contract(address_hash, params, error) do @@ -64,6 +64,8 @@ defmodule Explorer.SmartContract.Publisher do nil end + prepared_external_libraries = prepare_external_libraies(params["external_libraries"]) + %{ address_hash: address_hash, name: params["name"], @@ -73,11 +75,20 @@ defmodule Explorer.SmartContract.Publisher do optimization: params["optimization"], contract_source_code: params["contract_source_code"], constructor_arguments: clean_constructor_arguments, - external_libaries: params["external_libraries"], + external_libraries: prepared_external_libraries, abi: abi } end + defp prepare_external_libraies(nil), do: [] + + defp prepare_external_libraies(map) do + map + |> Enum.map(fn {key, value} -> + %{name: key, address_hash: value} + end) + end + defp add_external_libraries(params, external_libraries) do clean_external_libraries = Enum.reduce(1..5, %{}, fn number, acc -> From 908402151a6af765a72b59a53ee35e3e81d3ff0f Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Tue, 9 Jul 2019 16:03:33 +0300 Subject: [PATCH 26/30] Fix Contract byte code header style, external libraries to the bottom of the verified contract view --- .../templates/address_contract/index.html.eex | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex index 9d229916b4..8394e69f08 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex @@ -52,17 +52,6 @@
<%= @address.smart_contract.constructor_arguments %>
<% end %> - <%= if @address.smart_contract.external_libraries && @address.smart_contract.external_libraries != [] do %> -
-
-

<%= gettext "External libraries" %>

-
-
-
<%= format_external_libraries(@address.smart_contract.external_libraries) %>
-                
-
-
- <% end %>

@@ -109,7 +98,7 @@
<% {:ok, contract_code} -> %>
-

<%= gettext "Contract Byte Code" %>

+

<%= gettext "Contract Byte Code" %>

@@ -120,6 +109,18 @@ <% end %>
+ <%= if @address.smart_contract.external_libraries && @address.smart_contract.external_libraries != [] do %> +
+
+

<%= gettext "External libraries" %>

+
+
+
<%= format_external_libraries(@address.smart_contract.external_libraries) %>
+            
+
+
+ <% end %> +
From 85b76342a4bd3b3db4537a005e622cbbed74a1ff Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Tue, 9 Jul 2019 16:10:37 +0300 Subject: [PATCH 27/30] fix: external library is only for verified contract --- .../templates/address_contract/index.html.eex | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex index 8394e69f08..f6ada86532 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex @@ -109,18 +109,19 @@ <% end %>
- <%= if @address.smart_contract.external_libraries && @address.smart_contract.external_libraries != [] do %> -
-
-

<%= gettext "External libraries" %>

-
-
-
<%= format_external_libraries(@address.smart_contract.external_libraries) %>
-            
-
-
+ <%= if BlockScoutWeb.AddressView.smart_contract_verified?(@address) do %> + <%= if @address.smart_contract.external_libraries && @address.smart_contract.external_libraries != [] do %> +
+
+

<%= gettext "External libraries" %>

+
+
+
<%= format_external_libraries(@address.smart_contract.external_libraries) %>
+              
+
+
+ <% end %> <% end %> - From 0dc5cfa4fd225cc8f0f89651b73eb17688ba3c8e Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Tue, 9 Jul 2019 16:18:08 +0300 Subject: [PATCH 28/30] Fix gettext test --- apps/block_scout_web/priv/gettext/default.pot | 22 ++++++++-------- .../priv/gettext/en/LC_MESSAGES/default.po | 26 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/apps/block_scout_web/priv/gettext/default.pot b/apps/block_scout_web/priv/gettext/default.pot index ed6f3c655f..8217a39d9c 100644 --- a/apps/block_scout_web/priv/gettext/default.pot +++ b/apps/block_scout_web/priv/gettext/default.pot @@ -258,7 +258,7 @@ msgid "Connection Lost, click to load newer validations" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:82 +#: lib/block_scout_web/templates/address_contract/index.html.eex:71 msgid "Contract ABI" msgstr "" @@ -296,7 +296,7 @@ msgid "Contract name:" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:70 +#: lib/block_scout_web/templates/address_contract/index.html.eex:59 msgid "Contract source code" msgstr "" @@ -1405,17 +1405,17 @@ msgid "Support" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:84 +#: lib/block_scout_web/templates/address_contract/index.html.eex:73 msgid "Copy ABI" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:100 +#: lib/block_scout_web/templates/address_contract/index.html.eex:89 msgid "Copy Contract Creation Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:72 +#: lib/block_scout_web/templates/address_contract/index.html.eex:61 msgid "Copy Source Code" msgstr "" @@ -1585,27 +1585,27 @@ msgid "Block Details" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:112 +#: lib/block_scout_web/templates/address_contract/index.html.eex:101 msgid "Contract Byte Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:98 +#: lib/block_scout_web/templates/address_contract/index.html.eex:87 msgid "Contract Creation Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:104 +#: lib/block_scout_web/templates/address_contract/index.html.eex:93 msgid "Contracts that self destruct in their constructors have no contract code published and cannot be verified." msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:114 +#: lib/block_scout_web/templates/address_contract/index.html.eex:103 msgid "Copy Contract Byte Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:105 +#: lib/block_scout_web/templates/address_contract/index.html.eex:94 msgid "Displaying the init data provided of the creating transaction." msgstr "" @@ -1769,7 +1769,7 @@ msgid "ERC-721 " msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:58 +#: lib/block_scout_web/templates/address_contract/index.html.eex:116 msgid "External libraries" msgstr "" diff --git a/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po b/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po index efe9a56ff0..b58c06af59 100644 --- a/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po +++ b/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po @@ -258,7 +258,7 @@ msgid "Connection Lost, click to load newer validations" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:82 +#: lib/block_scout_web/templates/address_contract/index.html.eex:71 msgid "Contract ABI" msgstr "" @@ -296,7 +296,7 @@ msgid "Contract name:" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:70 +#: lib/block_scout_web/templates/address_contract/index.html.eex:59 msgid "Contract source code" msgstr "" @@ -877,7 +877,7 @@ msgid "Transactions" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address/_tile.html.eex:19 +#: lib/block_scout_web/templates/address/_tile.html.eex:31 msgid "Transactions sent" msgstr "" @@ -923,7 +923,7 @@ msgid "Validated Transactions" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address/_tile.html.eex:23 +#: lib/block_scout_web/templates/address/_tile.html.eex:35 msgid "Validations" msgstr "" @@ -1405,17 +1405,17 @@ msgid "Support" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:84 +#: lib/block_scout_web/templates/address_contract/index.html.eex:73 msgid "Copy ABI" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:100 +#: lib/block_scout_web/templates/address_contract/index.html.eex:89 msgid "Copy Contract Creation Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:72 +#: lib/block_scout_web/templates/address_contract/index.html.eex:61 msgid "Copy Source Code" msgstr "" @@ -1585,27 +1585,27 @@ msgid "Block Details" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:112 +#: lib/block_scout_web/templates/address_contract/index.html.eex:101 msgid "Contract Byte Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:98 +#: lib/block_scout_web/templates/address_contract/index.html.eex:87 msgid "Contract Creation Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:104 +#: lib/block_scout_web/templates/address_contract/index.html.eex:93 msgid "Contracts that self destruct in their constructors have no contract code published and cannot be verified." msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:114 +#: lib/block_scout_web/templates/address_contract/index.html.eex:103 msgid "Copy Contract Byte Code" msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:105 +#: lib/block_scout_web/templates/address_contract/index.html.eex:94 msgid "Displaying the init data provided of the creating transaction." msgstr "" @@ -1769,7 +1769,7 @@ msgid "ERC-721 " msgstr "" #, elixir-format -#: lib/block_scout_web/templates/address_contract/index.html.eex:58 +#: lib/block_scout_web/templates/address_contract/index.html.eex:116 msgid "External libraries" msgstr "" From 33ede5f8f24d69d91df6de5588d21db6162fbf8b Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Tue, 9 Jul 2019 16:29:16 +0300 Subject: [PATCH 29/30] Remove card-title class from "Contract Byte Code" --- .../block_scout_web/templates/address_contract/index.html.eex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex index f6ada86532..32f77425ca 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex @@ -98,7 +98,7 @@ <% {:ok, contract_code} -> %>
-

<%= gettext "Contract Byte Code" %>

+

<%= gettext "Contract Byte Code" %>

From 5ce569880a40aae25efce75592f04adc6b29fbe1 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Tue, 9 Jul 2019 19:57:51 +0300 Subject: [PATCH 30/30] fix path issue --- .../controllers/address_contract_verification_controller.ex | 2 +- apps/block_scout_web/lib/block_scout_web/notifier.ex | 5 +++-- .../templates/address_contract_verification/new.html.eex | 4 ++-- .../explorer/lib/explorer/smart_contract/publisher_worker.ex | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex b/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex index e4aa87eae4..cfffb85f3b 100644 --- a/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex +++ b/apps/block_scout_web/lib/block_scout_web/controllers/address_contract_verification_controller.ex @@ -28,7 +28,7 @@ defmodule BlockScoutWeb.AddressContractVerificationController do "external_libraries" => external_libraries } ) do - Que.add(PublisherWorker, {smart_contract["address_hash"], smart_contract, external_libraries}) + Que.add(PublisherWorker, {smart_contract["address_hash"], smart_contract, external_libraries, conn}) send_resp(conn, 204, "") end diff --git a/apps/block_scout_web/lib/block_scout_web/notifier.ex b/apps/block_scout_web/lib/block_scout_web/notifier.ex index bac301f757..2fbe17537b 100644 --- a/apps/block_scout_web/lib/block_scout_web/notifier.ex +++ b/apps/block_scout_web/lib/block_scout_web/notifier.ex @@ -26,7 +26,7 @@ defmodule BlockScoutWeb.Notifier do end def handle_event( - {:chain_event, :contract_verification_result, :on_demand, {address_hash, contract_verification_result}} + {:chain_event, :contract_verification_result, :on_demand, {address_hash, contract_verification_result, conn}} ) do contract_verification_result = case contract_verification_result do @@ -41,7 +41,8 @@ defmodule BlockScoutWeb.Notifier do changeset: changeset, compiler_versions: compiler_versions, evm_versions: CodeCompiler.allowed_evm_versions(), - address_hash: address_hash + address_hash: address_hash, + conn: conn ) {:error, result} diff --git a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex index e939de455a..fd93b0af2b 100644 --- a/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex +++ b/apps/block_scout_web/lib/block_scout_web/templates/address_contract_verification/new.html.eex @@ -9,7 +9,7 @@

<%= gettext "New Smart Contract Verification" %>

<%= form_for @changeset, - "/verify_smart_contract/contract_verifications", + address_contract_verification_path(@conn, :create), [], fn f -> %> @@ -252,7 +252,7 @@ link( gettext("Cancel"), class: "btn-no-border", - to: "/address/#{@address_hash}/contracts" + to: address_contract_path(@conn, :index, @address_hash) ) %>
diff --git a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex index b507b9f158..f0c248c8fb 100644 --- a/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex +++ b/apps/explorer/lib/explorer/smart_contract/publisher_worker.ex @@ -8,7 +8,7 @@ defmodule Explorer.SmartContract.PublisherWorker do alias Explorer.Chain.Events.Publisher, as: EventsPublisher alias Explorer.SmartContract.Publisher - def perform({address_hash, params, external_libraries}) do + def perform({address_hash, params, external_libraries, conn}) do result = case Publisher.publish(address_hash, params, external_libraries) do {:ok, _contract} = result -> @@ -18,6 +18,6 @@ defmodule Explorer.SmartContract.PublisherWorker do {:error, changeset} end - EventsPublisher.broadcast([{:contract_verification_result, {address_hash, result}}], :on_demand) + EventsPublisher.broadcast([{:contract_verification_result, {address_hash, result, conn}}], :on_demand) end end