show external libraries in UI

pull/2264/head
Ayrat Badykov 5 years ago
parent ea1f7f7c3d
commit c1b1f69be4
No known key found for this signature in database
GPG Key ID: B44668E265E9396F
  1. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex
  2. 6
      apps/block_scout_web/lib/block_scout_web/views/address_contract_view.ex
  3. 9
      apps/explorer/lib/explorer/chain.ex
  4. 19
      apps/explorer/lib/explorer/smart_contract/publisher.ex

@ -52,13 +52,13 @@
<dd class="col-sm-8 col-md-10"><%= @address.smart_contract.constructor_arguments %></dd> <dd class="col-sm-8 col-md-10"><%= @address.smart_contract.constructor_arguments %></dd>
</dl> </dl>
<% end %> <% end %>
<%= if @address.smart_contract.external_libraries do %> <%= if @address.smart_contract.external_libraries && @address.smart_contract.external_libraries != [] do %>
<section> <section>
<div class="d-flex justify-content-between align-items-baseline"> <div class="d-flex justify-content-between align-items-baseline">
<h3><%= gettext "External libraries" %></h3> <h3><%= gettext "External libraries" %></h3>
</div> </div>
<div class="tile tile-muted mb-4"> <div class="tile tile-muted mb-4">
<pre class="pre-wrap pre-scrollable"><code class="nohighlight"><%= format_smart_contract_abi(@address.smart_contract.abi) %></code> <pre class="pre-wrap pre-scrollable"><code class="nohighlight"><%= format_external_libraries(@address.smart_contract.external_libraries) %></code>
</pre> </pre>
</div> </div>
</section> </section>

@ -21,6 +21,12 @@ defmodule BlockScoutWeb.AddressContractView do
def format_optimization_text(true), do: gettext("true") def format_optimization_text(true), do: gettext("true")
def format_optimization_text(false), do: gettext("false") 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 def contract_lines_with_index(contract_source_code) do
contract_lines = String.split(contract_source_code, "\n") contract_lines = String.split(contract_source_code, "\n")

@ -2394,8 +2394,13 @@ defmodule Explorer.Chain do
naming the address for reference. naming the address for reference.
""" """
@spec create_smart_contract(map()) :: {:ok, SmartContract.t()} | {:error, Ecto.Changeset.t()} @spec create_smart_contract(map()) :: {:ok, SmartContract.t()} | {:error, Ecto.Changeset.t()}
def create_smart_contract(attrs \\ %{}) do def create_smart_contract(attrs \\ %{}, external_libraries \\ []) do
smart_contract_changeset = SmartContract.changeset(%SmartContract{}, attrs) new_contract = %SmartContract{}
smart_contract_changeset =
new_contract
|> SmartContract.changeset(attrs)
|> Changeset.put_change(:external_libraries, external_libraries)
insert_result = insert_result =
Multi.new() Multi.new()

@ -36,9 +36,9 @@ defmodule Explorer.SmartContract.Publisher do
end end
defp publish_smart_contract(address_hash, params, abi) do defp publish_smart_contract(address_hash, params, abi) do
address_hash attrs = address_hash |> attributes(params, abi)
|> attributes(params, abi)
|> Chain.create_smart_contract() Chain.create_smart_contract(attrs, attrs.external_libraries)
end end
defp unverified_smart_contract(address_hash, params, error) do defp unverified_smart_contract(address_hash, params, error) do
@ -64,6 +64,8 @@ defmodule Explorer.SmartContract.Publisher do
nil nil
end end
prepared_external_libraries = prepare_external_libraies(params["external_libraries"])
%{ %{
address_hash: address_hash, address_hash: address_hash,
name: params["name"], name: params["name"],
@ -73,11 +75,20 @@ defmodule Explorer.SmartContract.Publisher do
optimization: params["optimization"], optimization: params["optimization"],
contract_source_code: params["contract_source_code"], contract_source_code: params["contract_source_code"],
constructor_arguments: clean_constructor_arguments, constructor_arguments: clean_constructor_arguments,
external_libaries: params["external_libraries"], external_libraries: prepared_external_libraries,
abi: abi abi: abi
} }
end 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 defp add_external_libraries(params, external_libraries) do
clean_external_libraries = clean_external_libraries =
Enum.reduce(1..5, %{}, fn number, acc -> Enum.reduce(1..5, %{}, fn number, acc ->

Loading…
Cancel
Save