-
-
-
-
<%= gettext "Transaction Details" %>
-
-
-
-
-
-
-
<%= gettext("The transaction %{bold_hash} was not processed yet", bold_hash: "#{@transaction_hash}") |> raw() %>
-
-
-
-
<%= gettext "Once we have the transaction's data this page will refresh automatically" %>
-
<%= gettext "The possible reasons for this transaction not being processed include the following:" %>
-
- - <%= gettext "The transaction was made a few seconds ago" %>
- - <%= gettext "The transaction may be in the pool of a node that didn't broadcast it yet" %>
- - <%= gettext "Some transactions may take a while longer to be indexed depending on the load on the network" %>
- - <%= gettext "The transaction still does not exist" %>
-
-
+
+
+
+
+
+
<%= gettext("Sorry, We are unable to locate this transaction Hash") %>
+
+
+
+
1
+
<%= gettext("If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page.") %>
+
+
+
2
+
<%= gettext("It could still be in the TX Pool of a different node, waiting to be broadcasted.") %>
+
+
+
+
+
3
+
<%= gettext("During times when the network is busy (i.e during ICOs) it can take a while for your transaction to propagate through the network and for us to index it.") %>
+
+
+
4
+
<%= gettext("If it still does not show up after 1 hour, please check with your sender/exchange/wallet/transaction provider for additional information.") %>
+
<%= gettext("Back Home") %>
-
+
\ No newline at end of file
diff --git a/apps/block_scout_web/lib/block_scout_web/templates/transaction_token_transfer/index.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/transaction_token_transfer/index.html.eex
index 45da95e2b5..53ef700b14 100644
--- a/apps/block_scout_web/lib/block_scout_web/templates/transaction_token_transfer/index.html.eex
+++ b/apps/block_scout_web/lib/block_scout_web/templates/transaction_token_transfer/index.html.eex
@@ -32,20 +32,6 @@
<%= render BlockScoutWeb.CommonComponentsView, "_pagination_container.html", position: "bottom", cur_page_number: "1", show_pagination_limit: true %>
<% end %>
-
diff --git a/apps/block_scout_web/lib/block_scout_web/views/address_view.ex b/apps/block_scout_web/lib/block_scout_web/views/address_view.ex
index 97d13335f2..37073f0509 100644
--- a/apps/block_scout_web/lib/block_scout_web/views/address_view.ex
+++ b/apps/block_scout_web/lib/block_scout_web/views/address_view.ex
@@ -3,8 +3,6 @@ defmodule BlockScoutWeb.AddressView do
require Logger
- import BlockScoutWeb.AddressController, only: [validation_count: 1]
-
alias BlockScoutWeb.LayoutView
alias Explorer.Chain
alias Explorer.Chain.{Address, Hash, InternalTransaction, SmartContract, Token, TokenTransfer, Transaction, Wei}
diff --git a/apps/block_scout_web/lib/block_scout_web/views/api/rpc/contract_view.ex b/apps/block_scout_web/lib/block_scout_web/views/api/rpc/contract_view.ex
index 86bac53410..8f996a2bcc 100644
--- a/apps/block_scout_web/lib/block_scout_web/views/api/rpc/contract_view.ex
+++ b/apps/block_scout_web/lib/block_scout_web/views/api/rpc/contract_view.ex
@@ -76,16 +76,12 @@ defmodule BlockScoutWeb.API.RPC.ContractView do
defp prepare_contract(%Address{
hash: hash,
- smart_contract: nil,
- decompiled_smart_contracts: decompiled_smart_contracts
+ smart_contract: nil
}) do
- decompiled_smart_contract = latest_decompiled_smart_contract(decompiled_smart_contracts)
-
%{
"Address" => to_string(hash),
"ABI" => "Contract source code not verified",
"ContractName" => "",
- "DecompilerVersion" => decompiler_version(decompiled_smart_contract),
"CompilerVersion" => "",
"OptimizationUsed" => ""
}
@@ -93,16 +89,12 @@ defmodule BlockScoutWeb.API.RPC.ContractView do
defp prepare_contract(%Address{
hash: hash,
- smart_contract: %SmartContract{} = contract,
- decompiled_smart_contracts: decompiled_smart_contracts
+ smart_contract: %SmartContract{} = contract
}) do
- decompiled_smart_contract = latest_decompiled_smart_contract(decompiled_smart_contracts)
-
%{
"Address" => to_string(hash),
"ABI" => Jason.encode!(contract.abi),
"ContractName" => contract.name,
- "DecompilerVersion" => decompiler_version(decompiled_smart_contract),
"CompilerVersion" => contract.compiler_version,
"OptimizationUsed" => if(contract.optimization, do: "1", else: "0")
}
diff --git a/apps/block_scout_web/lib/block_scout_web/views/common_components_view..ex b/apps/block_scout_web/lib/block_scout_web/views/common_components_view.ex
similarity index 100%
rename from apps/block_scout_web/lib/block_scout_web/views/common_components_view..ex
rename to apps/block_scout_web/lib/block_scout_web/views/common_components_view.ex
diff --git a/apps/block_scout_web/mix.exs b/apps/block_scout_web/mix.exs
index 34289ec672..02e9d203fb 100644
--- a/apps/block_scout_web/mix.exs
+++ b/apps/block_scout_web/mix.exs
@@ -128,7 +128,7 @@ defmodule BlockScoutWeb.Mixfile do
{:timex, "~> 3.4"},
{:wallaby, "~> 0.22", only: [:test], runtime: false},
# `:cowboy` `~> 2.0` and Phoenix 1.4 compatibility
- {:wobserver, "~> 0.2.0", github: "KronicDeth/wobserver", ref: "99683a936c75c0a94ebb884cef019f7ed0b97112"},
+ {:wobserver, "~> 0.2.0", github: "poanetwork/wobserver", branch: "support-https"},
{:phoenix_form_awesomplete, "~> 0.1.4"}
]
end
diff --git a/apps/block_scout_web/priv/gettext/default.pot b/apps/block_scout_web/priv/gettext/default.pot
index afab9ebdec..dab33f910b 100644
--- a/apps/block_scout_web/priv/gettext/default.pot
+++ b/apps/block_scout_web/priv/gettext/default.pot
@@ -99,7 +99,7 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:16
#: lib/block_scout_web/templates/transaction_log/index.html.eex:22
-#: lib/block_scout_web/views/address_view.ex:101
+#: lib/block_scout_web/views/address_view.ex:99
msgid "Address"
msgstr ""
@@ -190,7 +190,7 @@ msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:32
#: lib/block_scout_web/templates/address/overview.html.eex:95
#: lib/block_scout_web/templates/address_validation/index.html.eex:13
-#: lib/block_scout_web/views/address_view.ex:310
+#: lib/block_scout_web/views/address_view.ex:308
msgid "Blocks Validated"
msgstr ""
@@ -218,7 +218,7 @@ msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:42
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:165
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:187
-#: lib/block_scout_web/views/address_view.ex:306
+#: lib/block_scout_web/views/address_view.ex:304
msgid "Code"
msgstr ""
@@ -262,14 +262,14 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:13
-#: lib/block_scout_web/views/address_view.ex:99
+#: lib/block_scout_web/views/address_view.ex:97
msgid "Contract Address"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:16
-#: lib/block_scout_web/views/address_view.ex:39
-#: lib/block_scout_web/views/address_view.ex:73
+#: lib/block_scout_web/views/address_view.ex:37
+#: lib/block_scout_web/views/address_view.ex:71
msgid "Contract Address Pending"
msgstr ""
@@ -307,13 +307,11 @@ msgid "Copy Address"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:10
#: lib/block_scout_web/templates/transaction/overview.html.eex:16
msgid "Copy Transaction Hash"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:14
#: lib/block_scout_web/templates/transaction/overview.html.eex:20
msgid "Copy Txn Hash"
msgstr ""
@@ -478,7 +476,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:19
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:11
#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:6
-#: lib/block_scout_web/views/address_view.ex:305
+#: lib/block_scout_web/views/address_view.ex:303
#: lib/block_scout_web/views/transaction_view.ex:339
msgid "Internal Transactions"
msgstr ""
@@ -505,7 +503,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_logs/index.html.eex:8
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:17
#: lib/block_scout_web/templates/transaction_log/index.html.eex:8
-#: lib/block_scout_web/views/address_view.ex:311
+#: lib/block_scout_web/views/address_view.ex:309
#: lib/block_scout_web/views/transaction_view.ex:340
msgid "Logs"
msgstr ""
@@ -513,7 +511,7 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/chain/show.html.eex:31
#: lib/block_scout_web/templates/layout/app.html.eex:53
-#: lib/block_scout_web/views/address_view.ex:123
+#: lib/block_scout_web/views/address_view.ex:121
msgid "Market Cap"
msgstr ""
@@ -582,7 +580,6 @@ msgid "Next"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/tokens/holder/index.html.eex:37
#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:32
msgid "Next Page"
msgstr ""
@@ -604,21 +601,6 @@ msgstr ""
msgid "OUT"
msgstr ""
-#, elixir-format
-#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:57
-#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:81
-#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:38
-#: lib/block_scout_web/templates/address_transaction/index.html.eex:80
-#: lib/block_scout_web/templates/address_validation/index.html.eex:38
-#: lib/block_scout_web/templates/block/index.html.eex:30
-#: lib/block_scout_web/templates/block_transaction/index.html.eex:50
-#: lib/block_scout_web/templates/pending_transaction/index.html.eex:39
-#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:43
-#: lib/block_scout_web/templates/transaction/index.html.eex:45
-#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:38
-msgid "Older"
-msgstr ""
-
#, elixir-format
#: lib/block_scout_web/templates/address_contract/index.html.eex:34
msgid "Optimization enabled"
@@ -683,7 +665,7 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_tabs.html.eex:58
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:25
-#: lib/block_scout_web/views/address_view.ex:308
+#: lib/block_scout_web/views/address_view.ex:306
#: lib/block_scout_web/views/tokens/overview_view.ex:37
msgid "Read Contract"
msgstr ""
@@ -750,7 +732,7 @@ msgid "Telegram"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/tokens/holder/index.html.eex:24
+#: lib/block_scout_web/templates/tokens/holder/index.html.eex:26
msgid "There are no holders for this Token."
msgstr ""
@@ -771,7 +753,7 @@ msgid "There are no logs for this transaction."
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:23
+#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:15
msgid "There are no token transfers for this address."
msgstr ""
@@ -863,7 +845,7 @@ msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:8
#: lib/block_scout_web/templates/address_token/index.html.eex:8
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:9
-#: lib/block_scout_web/views/address_view.ex:303
+#: lib/block_scout_web/views/address_view.ex:301
msgid "Tokens"
msgstr ""
@@ -910,7 +892,6 @@ msgid "Transaction %{transaction}, %{subnetwork} %{transaction}"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:22
#: lib/block_scout_web/templates/transaction/overview.html.eex:11
msgid "Transaction Details"
msgstr ""
@@ -922,7 +903,7 @@ msgstr ""
#: lib/block_scout_web/templates/block_transaction/index.html.eex:17
#: lib/block_scout_web/templates/chain/show.html.eex:108
#: lib/block_scout_web/templates/layout/_topnav.html.eex:35
-#: lib/block_scout_web/views/address_view.ex:304
+#: lib/block_scout_web/views/address_view.ex:302
msgid "Transactions"
msgstr ""
@@ -1105,9 +1086,6 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_read_contract/index.html.eex:14
-#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:19
-#: lib/block_scout_web/templates/address_validation/index.html.eex:22
-#: lib/block_scout_web/templates/address_validation/index.html.eex:47
#: lib/block_scout_web/templates/chain/show.html.eex:99
#: lib/block_scout_web/templates/chain/show.html.eex:125
#: lib/block_scout_web/templates/tokens/read_contract/index.html.eex:21
@@ -1130,22 +1108,7 @@ msgid "GraphQL"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:66
-#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:73
-#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:90
-#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:47
-#: lib/block_scout_web/templates/address_transaction/index.html.eex:71
-#: lib/block_scout_web/templates/address_transaction/index.html.eex:89
-#: lib/block_scout_web/templates/block/index.html.eex:19
-#: lib/block_scout_web/templates/block/index.html.eex:39
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:32
-#: lib/block_scout_web/templates/pending_transaction/index.html.eex:48
-#: lib/block_scout_web/templates/tokens/holder/index.html.eex:33
-#: lib/block_scout_web/templates/tokens/holder/index.html.eex:44
-#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:34
-#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:52
-#: lib/block_scout_web/templates/transaction/index.html.eex:36
-#: lib/block_scout_web/templates/transaction/index.html.eex:54
msgid "Loading"
msgstr ""
@@ -1164,11 +1127,6 @@ msgstr ""
msgid "Raw Input"
msgstr ""
-#, elixir-format
-#: lib/block_scout_web/templates/block_transaction/404.html.eex:7
-msgid "Block Details"
-msgstr ""
-
#, elixir-format
#: lib/block_scout_web/views/block_transaction_view.ex:15
msgid "Block not found, please try again later."
@@ -1189,41 +1147,6 @@ msgstr ""
msgid "Invalid Transaction Hash"
msgstr ""
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:33
-msgid "Once we have the transaction's data this page will refresh automatically"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:38
-msgid "Some transactions may take a while longer to be indexed depending on the load on the network"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:34
-msgid "The possible reasons for this transaction not being processed include the following:"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:29
-msgid "The transaction %{bold_hash} was not processed yet"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:37
-msgid "The transaction may be in the pool of a node that didn't broadcast it yet"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:39
-msgid "The transaction still does not exist"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:36
-msgid "The transaction was made a few seconds ago"
-msgstr ""
-
#, elixir-format
#: lib/block_scout_web/templates/transaction/invalid.html.eex:8
msgid "is not a valid transaction hash"
@@ -1316,19 +1239,19 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:34
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:61
-#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:28
+#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:20
#: lib/block_scout_web/templates/address_transaction/index.html.eex:57
-#: lib/block_scout_web/templates/address_validation/index.html.eex:29
+#: lib/block_scout_web/templates/address_validation/index.html.eex:22
#: lib/block_scout_web/templates/chain/show.html.eex:91
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:19
-#: lib/block_scout_web/templates/tokens/holder/index.html.eex:19
+#: lib/block_scout_web/templates/tokens/holder/index.html.eex:21
#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:20
#: lib/block_scout_web/templates/transaction/index.html.eex:20
msgid "Something went wrong, click to reload."
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/address_validation/index.html.eex:25
+#: lib/block_scout_web/templates/address_validation/index.html.eex:18
msgid "There are no blocks validated by this address."
msgstr ""
@@ -1349,15 +1272,10 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_tabs.html.eex:20
-#: lib/block_scout_web/views/address_view.ex:309
+#: lib/block_scout_web/views/address_view.ex:307
msgid "Coin Balance History"
msgstr ""
-#, elixir-format
-#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:48
-msgid "Loading balances"
-msgstr ""
-
#, elixir-format
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:22
#: lib/block_scout_web/templates/chain/show.html.eex:13
@@ -1381,7 +1299,7 @@ msgid "There are no pending transactions."
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/block/index.html.eex:23
+#: lib/block_scout_web/templates/block/index.html.eex:16
msgid "There are no blocks."
msgstr ""
@@ -1658,7 +1576,7 @@ msgid "Copy Decompiled Contract Code"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/views/address_view.ex:307
+#: lib/block_scout_web/views/address_view.ex:305
msgid "Decompiled Code"
msgstr ""
@@ -1726,7 +1644,7 @@ msgstr ""
#, elixir-format
#:
-#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:37
+#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:40
msgid "Page"
msgstr ""
@@ -1744,10 +1662,15 @@ msgstr ""
#, elixir-format
#:
-#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:37
+#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:40
msgid "of"
msgstr ""
+#, elixir-format
+#: lib/block_scout_web/templates/block_transaction/404.html.eex:7
+msgid "Block Details"
+msgstr ""
+
#, elixir-format
#: lib/block_scout_web/templates/address_contract/index.html.eex:83
msgid "Contract Byte Code"
@@ -1777,3 +1700,33 @@ msgstr ""
#: lib/block_scout_web/templates/address_logs/index.html.eex:77
msgid "There are no logs for this address."
msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:7
+msgid "Sorry, We are unable to locate this transaction Hash"
+msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:12
+msgid "If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page."
+msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:30
+msgid "Back Home"
+msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:22
+msgid "During times when the network is busy (i.e during ICOs) it can take a while for your transaction to propagate through the network and for us to index it."
+msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:26
+msgid "If it still does not show up after 1 hour, please check with your sender/exchange/wallet/transaction provider for additional information."
+msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:16
+msgid "It could still be in the TX Pool of a different node, waiting to be broadcasted."
+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 ba97f8ef18..9802f885ab 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
@@ -99,7 +99,7 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:16
#: lib/block_scout_web/templates/transaction_log/index.html.eex:22
-#: lib/block_scout_web/views/address_view.ex:101
+#: lib/block_scout_web/views/address_view.ex:99
msgid "Address"
msgstr ""
@@ -190,7 +190,7 @@ msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:32
#: lib/block_scout_web/templates/address/overview.html.eex:95
#: lib/block_scout_web/templates/address_validation/index.html.eex:13
-#: lib/block_scout_web/views/address_view.ex:310
+#: lib/block_scout_web/views/address_view.ex:308
msgid "Blocks Validated"
msgstr ""
@@ -218,7 +218,7 @@ msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:42
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:165
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:187
-#: lib/block_scout_web/views/address_view.ex:306
+#: lib/block_scout_web/views/address_view.ex:304
msgid "Code"
msgstr ""
@@ -262,14 +262,14 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:13
-#: lib/block_scout_web/views/address_view.ex:99
+#: lib/block_scout_web/views/address_view.ex:97
msgid "Contract Address"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:16
-#: lib/block_scout_web/views/address_view.ex:39
-#: lib/block_scout_web/views/address_view.ex:73
+#: lib/block_scout_web/views/address_view.ex:37
+#: lib/block_scout_web/views/address_view.ex:71
msgid "Contract Address Pending"
msgstr ""
@@ -307,13 +307,11 @@ msgid "Copy Address"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:10
#: lib/block_scout_web/templates/transaction/overview.html.eex:16
msgid "Copy Transaction Hash"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:14
#: lib/block_scout_web/templates/transaction/overview.html.eex:20
msgid "Copy Txn Hash"
msgstr ""
@@ -478,7 +476,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:19
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:11
#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:6
-#: lib/block_scout_web/views/address_view.ex:305
+#: lib/block_scout_web/views/address_view.ex:303
#: lib/block_scout_web/views/transaction_view.ex:339
msgid "Internal Transactions"
msgstr ""
@@ -505,7 +503,7 @@ msgstr ""
#: lib/block_scout_web/templates/address_logs/index.html.eex:8
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:17
#: lib/block_scout_web/templates/transaction_log/index.html.eex:8
-#: lib/block_scout_web/views/address_view.ex:311
+#: lib/block_scout_web/views/address_view.ex:309
#: lib/block_scout_web/views/transaction_view.ex:340
msgid "Logs"
msgstr ""
@@ -513,7 +511,7 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/chain/show.html.eex:31
#: lib/block_scout_web/templates/layout/app.html.eex:53
-#: lib/block_scout_web/views/address_view.ex:123
+#: lib/block_scout_web/views/address_view.ex:121
msgid "Market Cap"
msgstr ""
@@ -582,7 +580,6 @@ msgid "Next"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/tokens/holder/index.html.eex:37
#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:32
msgid "Next Page"
msgstr ""
@@ -604,21 +601,6 @@ msgstr ""
msgid "OUT"
msgstr ""
-#, elixir-format
-#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:57
-#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:81
-#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:38
-#: lib/block_scout_web/templates/address_transaction/index.html.eex:80
-#: lib/block_scout_web/templates/address_validation/index.html.eex:38
-#: lib/block_scout_web/templates/block/index.html.eex:30
-#: lib/block_scout_web/templates/block_transaction/index.html.eex:50
-#: lib/block_scout_web/templates/pending_transaction/index.html.eex:39
-#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:43
-#: lib/block_scout_web/templates/transaction/index.html.eex:45
-#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:38
-msgid "Older"
-msgstr ""
-
#, elixir-format
#: lib/block_scout_web/templates/address_contract/index.html.eex:34
msgid "Optimization enabled"
@@ -683,7 +665,7 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_tabs.html.eex:58
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:25
-#: lib/block_scout_web/views/address_view.ex:308
+#: lib/block_scout_web/views/address_view.ex:306
#: lib/block_scout_web/views/tokens/overview_view.ex:37
msgid "Read Contract"
msgstr ""
@@ -750,7 +732,7 @@ msgid "Telegram"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/tokens/holder/index.html.eex:24
+#: lib/block_scout_web/templates/tokens/holder/index.html.eex:26
msgid "There are no holders for this Token."
msgstr ""
@@ -771,7 +753,7 @@ msgid "There are no logs for this transaction."
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:23
+#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:15
msgid "There are no token transfers for this address."
msgstr ""
@@ -863,7 +845,7 @@ msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:8
#: lib/block_scout_web/templates/address_token/index.html.eex:8
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:9
-#: lib/block_scout_web/views/address_view.ex:303
+#: lib/block_scout_web/views/address_view.ex:301
msgid "Tokens"
msgstr ""
@@ -910,7 +892,6 @@ msgid "Transaction %{transaction}, %{subnetwork} %{transaction}"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:22
#: lib/block_scout_web/templates/transaction/overview.html.eex:11
msgid "Transaction Details"
msgstr ""
@@ -922,7 +903,7 @@ msgstr ""
#: lib/block_scout_web/templates/block_transaction/index.html.eex:17
#: lib/block_scout_web/templates/chain/show.html.eex:108
#: lib/block_scout_web/templates/layout/_topnav.html.eex:35
-#: lib/block_scout_web/views/address_view.ex:304
+#: lib/block_scout_web/views/address_view.ex:302
msgid "Transactions"
msgstr ""
@@ -1105,9 +1086,6 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_read_contract/index.html.eex:14
-#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:19
-#: lib/block_scout_web/templates/address_validation/index.html.eex:22
-#: lib/block_scout_web/templates/address_validation/index.html.eex:47
#: lib/block_scout_web/templates/chain/show.html.eex:99
#: lib/block_scout_web/templates/chain/show.html.eex:125
#: lib/block_scout_web/templates/tokens/read_contract/index.html.eex:21
@@ -1130,22 +1108,7 @@ msgid "GraphQL"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:66
-#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:73
-#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:90
-#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:47
-#: lib/block_scout_web/templates/address_transaction/index.html.eex:71
-#: lib/block_scout_web/templates/address_transaction/index.html.eex:89
-#: lib/block_scout_web/templates/block/index.html.eex:19
-#: lib/block_scout_web/templates/block/index.html.eex:39
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:32
-#: lib/block_scout_web/templates/pending_transaction/index.html.eex:48
-#: lib/block_scout_web/templates/tokens/holder/index.html.eex:33
-#: lib/block_scout_web/templates/tokens/holder/index.html.eex:44
-#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:34
-#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:52
-#: lib/block_scout_web/templates/transaction/index.html.eex:36
-#: lib/block_scout_web/templates/transaction/index.html.eex:54
msgid "Loading"
msgstr ""
@@ -1164,11 +1127,6 @@ msgstr ""
msgid "Raw Input"
msgstr ""
-#, elixir-format
-#: lib/block_scout_web/templates/block_transaction/404.html.eex:7
-msgid "Block Details"
-msgstr ""
-
#, elixir-format
#: lib/block_scout_web/views/block_transaction_view.ex:15
msgid "Block not found, please try again later."
@@ -1189,41 +1147,6 @@ msgstr ""
msgid "Invalid Transaction Hash"
msgstr ""
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:33
-msgid "Once we have the transaction's data this page will refresh automatically"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:38
-msgid "Some transactions may take a while longer to be indexed depending on the load on the network"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:34
-msgid "The possible reasons for this transaction not being processed include the following:"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:29
-msgid "The transaction %{bold_hash} was not processed yet"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:37
-msgid "The transaction may be in the pool of a node that didn't broadcast it yet"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:39
-msgid "The transaction still does not exist"
-msgstr ""
-
-#, elixir-format
-#: lib/block_scout_web/templates/transaction/not_found.html.eex:36
-msgid "The transaction was made a few seconds ago"
-msgstr ""
-
#, elixir-format
#: lib/block_scout_web/templates/transaction/invalid.html.eex:8
msgid "is not a valid transaction hash"
@@ -1316,19 +1239,19 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:34
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:61
-#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:28
+#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:20
#: lib/block_scout_web/templates/address_transaction/index.html.eex:57
-#: lib/block_scout_web/templates/address_validation/index.html.eex:29
+#: lib/block_scout_web/templates/address_validation/index.html.eex:22
#: lib/block_scout_web/templates/chain/show.html.eex:91
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:19
-#: lib/block_scout_web/templates/tokens/holder/index.html.eex:19
+#: lib/block_scout_web/templates/tokens/holder/index.html.eex:21
#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:20
#: lib/block_scout_web/templates/transaction/index.html.eex:20
msgid "Something went wrong, click to reload."
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/address_validation/index.html.eex:25
+#: lib/block_scout_web/templates/address_validation/index.html.eex:18
msgid "There are no blocks validated by this address."
msgstr ""
@@ -1349,15 +1272,10 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_tabs.html.eex:20
-#: lib/block_scout_web/views/address_view.ex:309
+#: lib/block_scout_web/views/address_view.ex:307
msgid "Coin Balance History"
msgstr ""
-#, elixir-format
-#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:48
-msgid "Loading balances"
-msgstr ""
-
#, elixir-format
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:22
#: lib/block_scout_web/templates/chain/show.html.eex:13
@@ -1381,7 +1299,7 @@ msgid "There are no pending transactions."
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/block/index.html.eex:23
+#: lib/block_scout_web/templates/block/index.html.eex:16
msgid "There are no blocks."
msgstr ""
@@ -1658,7 +1576,7 @@ msgid "Copy Decompiled Contract Code"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/views/address_view.ex:307
+#: lib/block_scout_web/views/address_view.ex:305
msgid "Decompiled Code"
msgstr ""
@@ -1726,7 +1644,7 @@ msgstr ""
#, elixir-format
#:
-#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:37
+#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:40
msgid "Page"
msgstr ""
@@ -1744,10 +1662,15 @@ msgstr ""
#, elixir-format
#:
-#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:37
+#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:40
msgid "of"
msgstr ""
+#, elixir-format
+#: lib/block_scout_web/templates/block_transaction/404.html.eex:7
+msgid "Block Details"
+msgstr ""
+
#, elixir-format
#: lib/block_scout_web/templates/address_contract/index.html.eex:83
msgid "Contract Byte Code"
@@ -1777,3 +1700,33 @@ msgstr ""
#: lib/block_scout_web/templates/address_logs/index.html.eex:77
msgid "There are no logs for this address."
msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:7
+msgid "Sorry, We are unable to locate this transaction Hash"
+msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:12
+msgid "If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page."
+msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:30
+msgid "Back Home"
+msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:22
+msgid "During times when the network is busy (i.e during ICOs) it can take a while for your transaction to propagate through the network and for us to index it."
+msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:26
+msgid "If it still does not show up after 1 hour, please check with your sender/exchange/wallet/transaction provider for additional information."
+msgstr ""
+
+#, elixir-format
+#: lib/block_scout_web/templates/transaction/not_found.html.eex:16
+msgid "It could still be in the TX Pool of a different node, waiting to be broadcasted."
+msgstr ""
diff --git a/apps/block_scout_web/test/block_scout_web/controllers/address_controller_test.exs b/apps/block_scout_web/test/block_scout_web/controllers/address_controller_test.exs
index e4e25174b1..8f64abafa6 100644
--- a/apps/block_scout_web/test/block_scout_web/controllers/address_controller_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/controllers/address_controller_test.exs
@@ -15,11 +15,10 @@ defmodule BlockScoutWeb.AddressControllerTest do
start_supervised!(AddressesWithBalanceCounter)
AddressesWithBalanceCounter.consolidate()
- conn = get(conn, address_path(conn, :index))
+ conn = get(conn, address_path(conn, :index, %{type: "JSON"}))
+ {:ok, %{"items" => items}} = Poison.decode(conn.resp_body)
- assert conn.assigns.address_tx_count_pairs
- |> Enum.map(fn {address, _transaction_count} -> address end)
- |> Enum.map(& &1.hash) == address_hashes
+ assert Enum.count(items) == Enum.count(address_hashes)
end
test "returns an address's primary name when present", %{conn: conn} do
@@ -29,9 +28,11 @@ defmodule BlockScoutWeb.AddressControllerTest do
start_supervised!(AddressesWithBalanceCounter)
AddressesWithBalanceCounter.consolidate()
- conn = get(conn, address_path(conn, :index))
+ conn = get(conn, address_path(conn, :index, %{type: "JSON"}))
- assert html_response(conn, 200) =~ address_name.name
+ {:ok, %{"items" => [item]}} = Poison.decode(conn.resp_body)
+
+ assert String.contains?(item, "POA Wallet")
end
end
diff --git a/apps/block_scout_web/test/block_scout_web/controllers/api/rpc/address_controller_test.exs b/apps/block_scout_web/test/block_scout_web/controllers/api/rpc/address_controller_test.exs
index 993b25fcec..e6a0e7e702 100644
--- a/apps/block_scout_web/test/block_scout_web/controllers/api/rpc/address_controller_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/controllers/api/rpc/address_controller_test.exs
@@ -5,7 +5,7 @@ defmodule BlockScoutWeb.API.RPC.AddressControllerTest do
alias BlockScoutWeb.API.RPC.AddressController
alias Explorer.Chain
- alias Explorer.Chain.{BlockNumberCache, Events.Subscriber, Transaction, Wei}
+ alias Explorer.Chain.{Events.Subscriber, Transaction, Wei}
alias Explorer.Counters.{AddressesWithBalanceCounter, AverageBlockTime}
alias Indexer.Fetcher.CoinBalanceOnDemand
alias Explorer.Repo
diff --git a/apps/block_scout_web/test/block_scout_web/controllers/api/rpc/contract_controller_test.exs b/apps/block_scout_web/test/block_scout_web/controllers/api/rpc/contract_controller_test.exs
index 399e49bfff..e070cf8e57 100644
--- a/apps/block_scout_web/test/block_scout_web/controllers/api/rpc/contract_controller_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/controllers/api/rpc/contract_controller_test.exs
@@ -47,7 +47,6 @@ defmodule BlockScoutWeb.API.RPC.ContractControllerTest do
"Address" => to_string(contract.address_hash),
"CompilerVersion" => contract.compiler_version,
"ContractName" => contract.name,
- "DecompilerVersion" => "",
"OptimizationUsed" => if(contract.optimization, do: "1", else: "0")
}
]
@@ -70,7 +69,6 @@ defmodule BlockScoutWeb.API.RPC.ContractControllerTest do
"Address" => to_string(address.hash),
"CompilerVersion" => "",
"ContractName" => "",
- "DecompilerVersion" => "",
"OptimizationUsed" => ""
}
]
@@ -94,7 +92,6 @@ defmodule BlockScoutWeb.API.RPC.ContractControllerTest do
"Address" => to_string(address.hash),
"CompilerVersion" => "",
"ContractName" => "",
- "DecompilerVersion" => "",
"OptimizationUsed" => ""
}
]
@@ -122,7 +119,6 @@ defmodule BlockScoutWeb.API.RPC.ContractControllerTest do
"Address" => to_string(address.hash),
"CompilerVersion" => "",
"ContractName" => "",
- "DecompilerVersion" => "",
"OptimizationUsed" => ""
}
]
@@ -145,7 +141,6 @@ defmodule BlockScoutWeb.API.RPC.ContractControllerTest do
"ABI" => Jason.encode!(contract.abi),
"Address" => to_string(contract.address_hash),
"CompilerVersion" => contract.compiler_version,
- "DecompilerVersion" => "",
"ContractName" => contract.name,
"OptimizationUsed" => if(contract.optimization, do: "1", else: "0")
}
@@ -170,7 +165,6 @@ defmodule BlockScoutWeb.API.RPC.ContractControllerTest do
"Address" => to_string(decompiled_smart_contract.address_hash),
"CompilerVersion" => "",
"ContractName" => "",
- "DecompilerVersion" => "test_decompiler",
"OptimizationUsed" => ""
}
]
@@ -194,7 +188,6 @@ defmodule BlockScoutWeb.API.RPC.ContractControllerTest do
"Address" => to_string(smart_contract.address_hash),
"CompilerVersion" => "",
"ContractName" => "",
- "DecompilerVersion" => "bizbuz",
"OptimizationUsed" => ""
}
]
@@ -214,16 +207,15 @@ defmodule BlockScoutWeb.API.RPC.ContractControllerTest do
assert response["message"] == "OK"
assert response["status"] == "1"
- assert response["result"] == [
- %{
- "ABI" => "Contract source code not verified",
- "Address" => to_string(smart_contract.address_hash),
- "CompilerVersion" => "",
- "ContractName" => "",
- "DecompilerVersion" => "bizbuz",
- "OptimizationUsed" => ""
- }
- ]
+ assert %{
+ "ABI" => "Contract source code not verified",
+ "Address" => to_string(smart_contract.address_hash),
+ "CompilerVersion" => "",
+ "ContractName" => "",
+ "OptimizationUsed" => ""
+ } in response["result"]
+
+ refute to_string(non_match.address_hash) in Enum.map(response["result"], &Map.get(&1, "Address"))
end
test "filtering for only not_decompiled (and by extension not verified contracts)", %{params: params, conn: conn} do
@@ -245,7 +237,6 @@ defmodule BlockScoutWeb.API.RPC.ContractControllerTest do
"Address" => to_string(contract_address.hash),
"CompilerVersion" => "",
"ContractName" => "",
- "DecompilerVersion" => "",
"OptimizationUsed" => ""
}
]
@@ -274,7 +265,6 @@ defmodule BlockScoutWeb.API.RPC.ContractControllerTest do
"Address" => to_string(contract_address.hash),
"CompilerVersion" => "",
"ContractName" => "",
- "DecompilerVersion" => "",
"OptimizationUsed" => ""
}
]
diff --git a/apps/block_scout_web/test/block_scout_web/controllers/api/v1/decompiled_smart_contract_controller_test.exs b/apps/block_scout_web/test/block_scout_web/controllers/api/v1/decompiled_smart_contract_controller_test.exs
index 3df8561d0a..d6b52c8490 100644
--- a/apps/block_scout_web/test/block_scout_web/controllers/api/v1/decompiled_smart_contract_controller_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/controllers/api/v1/decompiled_smart_contract_controller_test.exs
@@ -2,7 +2,7 @@ defmodule BlockScoutWeb.API.V1.DecompiledControllerTest do
use BlockScoutWeb.ConnCase
alias Explorer.Repo
- alias Explorer.Chain.DecompiledSmartContract
+ alias Explorer.Chain.{Address, DecompiledSmartContract}
import Ecto.Query,
only: [from: 2]
@@ -87,6 +87,24 @@ defmodule BlockScoutWeb.API.V1.DecompiledControllerTest do
assert decompiled_smart_contract.decompiler_version == decompiler_version
assert decompiled_smart_contract.decompiled_source_code == decompiled_source_code
end
+
+ test "updates the address to be decompiled", %{conn: conn} do
+ address_hash = to_string(insert(:address, hash: "0x0000000000000000000000000000000000000001").hash)
+ decompiler_version = "test_decompiler"
+ decompiled_source_code = "hello world"
+
+ params = %{
+ "address_hash" => address_hash,
+ "decompiler_version" => decompiler_version,
+ "decompiled_source_code" => decompiled_source_code
+ }
+
+ request = post(conn, api_v1_decompiled_smart_contract_path(conn, :create), params)
+
+ assert request.status == 201
+
+ assert Repo.get!(Address, address_hash).decompiled
+ end
end
describe "when user is not authorized" do
diff --git a/apps/block_scout_web/test/block_scout_web/controllers/block_transaction_controller_test.exs b/apps/block_scout_web/test/block_scout_web/controllers/block_transaction_controller_test.exs
index 6a4e2ebf32..b8f6233e49 100644
--- a/apps/block_scout_web/test/block_scout_web/controllers/block_transaction_controller_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/controllers/block_transaction_controller_test.exs
@@ -165,7 +165,7 @@ defmodule BlockScoutWeb.BlockTransactionControllerTest do
defp assert_block_above_tip(conn) do
assert conn
|> html_response(404)
- |> Floki.find(~S|[data-selector="block-not-found-message"|)
+ |> Floki.find(~S|.error-descr|)
|> Floki.text()
|> String.trim() == "Easy Cowboy! This block does not exist yet!"
end
diff --git a/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/parity/fetched_beneficiaries.ex b/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/parity/fetched_beneficiaries.ex
index d56a85cd9f..98174be69a 100644
--- a/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/parity/fetched_beneficiaries.ex
+++ b/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/parity/fetched_beneficiaries.ex
@@ -173,6 +173,7 @@ defmodule EthereumJSONRPC.Parity.FetchedBeneficiaries do
defp get_address_type(reward_type, index) when reward_type == "external" and index == 1, do: :emission_funds
defp get_address_type(reward_type, index) when reward_type == "external" and index == 2, do: :validator
defp get_address_type(reward_type, index) when reward_type == "external" and index == 3, do: :validator
+ defp get_address_type(reward_type, index) when reward_type == "external" and index == 4, do: :validator
defp get_address_type(reward_type, _index) when reward_type == "block", do: :validator
defp get_address_type(reward_type, _index) when reward_type == "uncle", do: :uncle
end
diff --git a/apps/explorer/config/config.exs b/apps/explorer/config/config.exs
index 0ba1a960c7..94a1d79c6d 100644
--- a/apps/explorer/config/config.exs
+++ b/apps/explorer/config/config.exs
@@ -9,7 +9,10 @@ use Mix.Config
config :explorer,
ecto_repos: [Explorer.Repo],
coin: System.get_env("COIN") || "POA",
- token_functions_reader_max_retries: 3
+ token_functions_reader_max_retries: 3,
+ allowed_evm_versions:
+ System.get_env("ALLOWED_EVM_VERSIONS") ||
+ "homestead,tangerineWhistle,spuriousDragon,byzantium,constantinople,petersburg"
config :explorer, Explorer.Counters.AverageBlockTime, enabled: true
diff --git a/apps/explorer/lib/explorer/chain.ex b/apps/explorer/lib/explorer/chain.ex
index 0977df1dd2..9446388531 100644
--- a/apps/explorer/lib/explorer/chain.ex
+++ b/apps/explorer/lib/explorer/chain.ex
@@ -363,21 +363,6 @@ defmodule Explorer.Chain do
Repo.aggregate(Block, :count, :hash)
end
- @doc """
- The number of consensus blocks.
-
- iex> insert(:block, consensus: true)
- iex> insert(:block, consensus: false)
- iex> Explorer.Chain.block_consensus_count()
- 1
-
- """
- def block_consensus_count do
- Block
- |> where(consensus: true)
- |> Repo.aggregate(:count, :hash)
- end
-
@doc """
Reward for mining a block.
@@ -569,9 +554,19 @@ defmodule Explorer.Chain do
@spec create_decompiled_smart_contract(map()) :: {:ok, Address.t()} | {:error, Ecto.Changeset.t()}
def create_decompiled_smart_contract(attrs) do
- %DecompiledSmartContract{}
- |> DecompiledSmartContract.changeset(attrs)
- |> Repo.insert(on_conflict: :replace_all, conflict_target: [:decompiler_version, :address_hash])
+ changeset = DecompiledSmartContract.changeset(%DecompiledSmartContract{}, attrs)
+
+ Multi.new()
+ |> Multi.insert(:decompiled_smart_contract, changeset,
+ on_conflict: :replace_all,
+ conflict_target: [:decompiler_version, :address_hash]
+ )
+ |> Multi.run(:set_address_decompiled, &set_address_decompiled/2)
+ |> Repo.transaction()
+ |> case do
+ {:ok, %{decompiled_smart_contract: decompiled_smart_contract}} -> {:ok, decompiled_smart_contract}
+ {:error, _, error_value, _} -> {:error, error_value}
+ end
end
@doc """
@@ -1997,7 +1992,9 @@ defmodule Explorer.Chain do
cached_value = BlockCountCache.count()
if is_nil(cached_value) do
- block_consensus_count()
+ %Postgrex.Result{rows: [[count]]} = Repo.query!("SELECT reltuples FROM pg_class WHERE relname = 'blocks';")
+
+ trunc(count * 0.90)
else
cached_value
end
@@ -2248,6 +2245,7 @@ defmodule Explorer.Chain do
|> Multi.insert(:smart_contract, smart_contract_changeset)
|> Multi.run(:clear_primary_address_names, &clear_primary_address_names/2)
|> Multi.run(:insert_address_name, &create_address_name/2)
+ |> Multi.run(:set_address_verified, &set_address_verified/2)
|> Repo.transaction()
with {:ok, %{smart_contract: smart_contract}} <- insert_result do
@@ -2255,6 +2253,35 @@ defmodule Explorer.Chain do
else
{:error, :smart_contract, changeset, _} ->
{:error, changeset}
+
+ {:error, :set_address_verified, message, _} ->
+ {:error, message}
+ end
+ end
+
+ defp set_address_verified(repo, %{smart_contract: %SmartContract{address_hash: address_hash}}) do
+ query =
+ from(
+ address in Address,
+ where: address.hash == ^address_hash
+ )
+
+ case repo.update_all(query, set: [verified: true]) do
+ {1, _} -> {:ok, []}
+ _ -> {:error, "There was an error annotating that the address has been verified."}
+ end
+ end
+
+ defp set_address_decompiled(repo, %{decompiled_smart_contract: %DecompiledSmartContract{address_hash: address_hash}}) do
+ query =
+ from(
+ address in Address,
+ where: address.hash == ^address_hash
+ )
+
+ case repo.update_all(query, set: [decompiled: true]) do
+ {1, _} -> {:ok, []}
+ _ -> {:error, "There was an error annotating that the address has been verified."}
end
end
@@ -2767,50 +2794,46 @@ defmodule Explorer.Chain do
query =
from(
address in Address,
- where:
- fragment(
- "EXISTS (SELECT 1 FROM decompiled_smart_contracts WHERE decompiled_smart_contracts.address_hash = ?)",
- address.hash
- ),
- preload: [:decompiled_smart_contracts, :smart_contract],
- order_by: [asc: address.inserted_at],
+ where: address.contract_code != <<>>,
+ where: not is_nil(address.contract_code),
+ where: address.decompiled == true,
limit: ^limit,
- offset: ^offset
+ offset: ^offset,
+ order_by: [asc: address.inserted_at],
+ preload: [:smart_contract]
)
query
- |> filter_decompiled_with_version(not_decompiled_with_version)
+ |> reject_decompiled_with_version(not_decompiled_with_version)
|> Repo.all()
end
- defp filter_decompiled_with_version(query, nil) do
- query
- end
+ defp reject_decompiled_with_version(query, nil), do: query
- defp filter_decompiled_with_version(query, not_decompiled_with_version) do
- from(address in query,
- left_join: decompiled_smart_contract in DecompiledSmartContract,
- on: decompiled_smart_contract.decompiler_version == ^not_decompiled_with_version,
- on: decompiled_smart_contract.address_hash == address.hash,
- where: is_nil(decompiled_smart_contract.id),
- distinct: [address.hash]
+ defp reject_decompiled_with_version(query, reject_version) do
+ from(
+ address in query,
+ left_join: decompiled_smart_contract in assoc(address, :decompiled_smart_contracts),
+ on: decompiled_smart_contract.decompiler_version == ^reject_version,
+ where: is_nil(decompiled_smart_contract.address_hash)
)
end
def list_verified_contracts(limit, offset) do
query =
from(
- address in Address,
- where: not is_nil(address.contract_code),
- join: smart_contract in SmartContract,
- on: smart_contract.address_hash == address.hash,
- preload: [{:smart_contract, smart_contract}, :decompiled_smart_contracts],
- order_by: [asc: address.inserted_at],
+ smart_contract in SmartContract,
+ order_by: [asc: smart_contract.inserted_at],
limit: ^limit,
- offset: ^offset
+ offset: ^offset,
+ preload: [:address]
)
- Repo.all(query)
+ query
+ |> Repo.all()
+ |> Enum.map(fn smart_contract ->
+ Map.put(smart_contract.address, :smart_contract, smart_contract)
+ end)
end
def list_contracts(limit, offset) do
@@ -2818,7 +2841,7 @@ defmodule Explorer.Chain do
from(
address in Address,
where: not is_nil(address.contract_code),
- preload: [:smart_contract, :decompiled_smart_contracts],
+ preload: [:smart_contract],
order_by: [asc: address.inserted_at],
limit: ^limit,
offset: ^offset
@@ -2827,22 +2850,22 @@ defmodule Explorer.Chain do
Repo.all(query)
end
- def list_unverified_contracts(limit, offset) do
+ def list_unordered_unverified_contracts(limit, offset) do
query =
from(
address in Address,
- left_join: smart_contract in SmartContract,
- on: smart_contract.address_hash == address.hash,
- where: not is_nil(address.contract_code),
- where: is_nil(smart_contract.address_hash),
where: address.contract_code != <<>>,
- preload: [{:smart_contract, smart_contract}, :decompiled_smart_contracts],
- order_by: [asc: address.inserted_at],
+ where: not is_nil(address.contract_code),
+ where: fragment("? IS NOT TRUE", address.verified),
limit: ^limit,
offset: ^offset
)
- Repo.all(query)
+ query
+ |> Repo.all()
+ |> Enum.map(fn address ->
+ %{address | smart_contract: nil}
+ end)
end
def list_empty_contracts(limit, offset) do
@@ -2858,30 +2881,23 @@ defmodule Explorer.Chain do
Repo.all(query)
end
- def list_not_decompiled_contracts(limit, offset) do
+ def list_unordered_not_decompiled_contracts(limit, offset) do
query =
from(
address in Address,
- where:
- fragment(
- "NOT EXISTS (SELECT 1 FROM decompiled_smart_contracts WHERE decompiled_smart_contracts.address_hash = ?)",
- address.hash
- ),
+ where: fragment("? IS NOT TRUE", address.verified),
+ where: fragment("? IS NOT TRUE", address.decompiled),
where: address.contract_code != <<>>,
- left_join: smart_contract in SmartContract,
- on: smart_contract.address_hash == address.hash,
- left_join: decompiled_smart_contract in DecompiledSmartContract,
- on: decompiled_smart_contract.address_hash == address.hash,
- preload: [:smart_contract, :decompiled_smart_contracts],
where: not is_nil(address.contract_code),
- where: is_nil(smart_contract.address_hash),
- where: is_nil(decompiled_smart_contract.address_hash),
- order_by: [asc: address.inserted_at],
limit: ^limit,
offset: ^offset
)
- Repo.all(query)
+ query
+ |> Repo.all()
+ |> Enum.map(fn address ->
+ %{address | smart_contract: nil}
+ end)
end
@doc """
diff --git a/apps/explorer/lib/explorer/chain/address.ex b/apps/explorer/lib/explorer/chain/address.ex
index a565306fd7..a619d70546 100644
--- a/apps/explorer/lib/explorer/chain/address.ex
+++ b/apps/explorer/lib/explorer/chain/address.ex
@@ -22,7 +22,7 @@ defmodule Explorer.Chain.Address do
Wei
}
- @optional_attrs ~w(contract_code fetched_coin_balance fetched_coin_balance_block_number nonce)a
+ @optional_attrs ~w(contract_code fetched_coin_balance fetched_coin_balance_block_number nonce decompiled verified)a
@required_attrs ~w(hash)a
@allowed_attrs @optional_attrs ++ @required_attrs
@@ -75,6 +75,8 @@ defmodule Explorer.Chain.Address do
field(:fetched_coin_balance_block_number, :integer)
field(:contract_code, Data)
field(:nonce, :integer)
+ field(:decompiled, :boolean, default: false)
+ field(:verified, :boolean, default: false)
field(:has_decompiled_code?, :boolean, virtual: true)
field(:stale?, :boolean, virtual: true)
diff --git a/apps/explorer/lib/explorer/chain/import/runner/addresses.ex b/apps/explorer/lib/explorer/chain/import/runner/addresses.ex
index 8a3ab2eb02..564c36452b 100644
--- a/apps/explorer/lib/explorer/chain/import/runner/addresses.ex
+++ b/apps/explorer/lib/explorer/chain/import/runner/addresses.ex
@@ -13,6 +13,11 @@ defmodule Explorer.Chain.Import.Runner.Addresses do
@behaviour Import.Runner
+ @row_defaults %{
+ decompiled: false,
+ verified: false
+ }
+
# milliseconds
@timeout 60_000
@@ -45,9 +50,16 @@ defmodule Explorer.Chain.Import.Runner.Addresses do
update_transactions_options = %{timeout: transactions_timeout, timestamps: timestamps}
+ changes_list_with_defaults =
+ Enum.map(changes_list, fn change ->
+ Enum.reduce(@row_defaults, change, fn {default_key, default_value}, acc ->
+ Map.put_new(acc, default_key, default_value)
+ end)
+ end)
+
multi
|> Multi.run(:addresses, fn repo, _ ->
- insert(repo, changes_list, insert_options)
+ insert(repo, changes_list_with_defaults, insert_options)
end)
|> Multi.run(:created_address_code_indexed_at_transactions, fn repo, %{addresses: addresses}
when is_list(addresses) ->
diff --git a/apps/explorer/lib/explorer/counters/addresses_with_balance_counter.ex b/apps/explorer/lib/explorer/counters/addresses_with_balance_counter.ex
index 3a03a7bcd5..cdc2530f93 100644
--- a/apps/explorer/lib/explorer/counters/addresses_with_balance_counter.ex
+++ b/apps/explorer/lib/explorer/counters/addresses_with_balance_counter.ex
@@ -40,15 +40,10 @@ defmodule Explorer.Counters.AddressesWithBalanceCounter do
end
@impl true
- def init(args) do
+ def init(_args) do
create_table()
- if enable_consolidation?() do
- Task.start_link(&consolidate/0)
- schedule_next_consolidation()
- end
-
- {:ok, args}
+ {:ok, %{consolidate?: enable_consolidation?()}, {:continue, :ok}}
end
def create_table do
@@ -63,9 +58,7 @@ defmodule Explorer.Counters.AddressesWithBalanceCounter do
end
defp schedule_next_consolidation do
- if enable_consolidation?() do
- Process.send_after(self(), :consolidate, :timer.seconds(@update_interval_in_seconds))
- end
+ Process.send_after(self(), :consolidate, :timer.seconds(@update_interval_in_seconds))
end
@doc """
@@ -75,6 +68,19 @@ defmodule Explorer.Counters.AddressesWithBalanceCounter do
:ets.insert(table_name(), {key, info})
end
+ @impl true
+ def handle_continue(:ok, %{consolidate?: true} = state) do
+ consolidate()
+ schedule_next_consolidation()
+
+ {:noreply, state}
+ end
+
+ @impl true
+ def handle_continue(:ok, state) do
+ {:noreply, state}
+ end
+
@impl true
def handle_info(:consolidate, state) do
consolidate()
diff --git a/apps/explorer/lib/explorer/smart_contract/solc_downloader.ex b/apps/explorer/lib/explorer/smart_contract/solc_downloader.ex
index 1aa81d2488..4c4fea4109 100644
--- a/apps/explorer/lib/explorer/smart_contract/solc_downloader.ex
+++ b/apps/explorer/lib/explorer/smart_contract/solc_downloader.ex
@@ -86,7 +86,7 @@ defmodule Explorer.SmartContract.SolcDownloader do
download_path = "https://ethereum.github.io/solc-bin/bin/soljson-#{version}.js"
download_path
- |> HTTPoison.get!([], timeout: 60_000)
+ |> HTTPoison.get!([], timeout: 60_000, recv_timeout: 60_000)
|> Map.get(:body)
end
end
diff --git a/apps/explorer/lib/explorer/smart_contract/solidity/code_compiler.ex b/apps/explorer/lib/explorer/smart_contract/solidity/code_compiler.ex
index 656f1b9734..3e41bb08fa 100644
--- a/apps/explorer/lib/explorer/smart_contract/solidity/code_compiler.ex
+++ b/apps/explorer/lib/explorer/smart_contract/solidity/code_compiler.ex
@@ -8,7 +8,6 @@ defmodule Explorer.SmartContract.Solidity.CodeCompiler do
require Logger
@new_contract_name "New.sol"
- @allowed_evm_versions ["homestead", "tangerineWhistle", "spuriousDragon", "byzantium", "constantinople", "petersburg"]
@doc """
Compiles a code in the solidity command line.
@@ -72,13 +71,13 @@ defmodule Explorer.SmartContract.Solidity.CodeCompiler do
code = Keyword.fetch!(params, :code)
optimize = Keyword.fetch!(params, :optimize)
optimization_runs = params |> Keyword.get(:optimization_runs, 200) |> Integer.to_string()
- evm_version = Keyword.get(params, :evm_version, List.last(@allowed_evm_versions))
+ evm_version = Keyword.get(params, :evm_version, List.last(allowed_evm_versions()))
external_libs = Keyword.get(params, :external_libs, %{})
external_libs_string = Jason.encode!(external_libs)
checked_evm_version =
- if evm_version in @allowed_evm_versions do
+ if evm_version in allowed_evm_versions() do
evm_version
else
"byzantium"
@@ -125,7 +124,12 @@ defmodule Explorer.SmartContract.Solidity.CodeCompiler do
end
end
- def allowed_evm_versions, do: @allowed_evm_versions
+ def allowed_evm_versions do
+ :explorer
+ |> Application.get_env(:allowed_evm_versions)
+ |> String.split(",")
+ |> Enum.map(fn version -> String.trim(version) end)
+ end
def get_contract_info(contracts, _) when contracts == %{}, do: {:error, :compilation}
diff --git a/apps/explorer/priv/repo/migrations/20190516140202_add_address_hash_index_to_decompiled_smart_contracts.exs b/apps/explorer/priv/repo/migrations/20190516140202_add_address_hash_index_to_decompiled_smart_contracts.exs
new file mode 100644
index 0000000000..689a3757d2
--- /dev/null
+++ b/apps/explorer/priv/repo/migrations/20190516140202_add_address_hash_index_to_decompiled_smart_contracts.exs
@@ -0,0 +1,14 @@
+defmodule Explorer.Repo.Migrations.AddAddressHashIndexToDecompiledSmartContracts do
+ use Ecto.Migration
+
+ def change do
+ execute(
+ """
+ CREATE INDEX IF NOT EXISTS decompiled_smart_contracts_address_hash_index ON decompiled_smart_contracts(address_hash);
+ """,
+ """
+ DROP INDEX IF EXISTS decompiled_smart_contracts_address_hash_index
+ """
+ )
+ end
+end
diff --git a/apps/explorer/priv/repo/migrations/20190516160535_add_decompiled_and_verified_flag_to_addresses.exs b/apps/explorer/priv/repo/migrations/20190516160535_add_decompiled_and_verified_flag_to_addresses.exs
new file mode 100644
index 0000000000..cfc45092fd
--- /dev/null
+++ b/apps/explorer/priv/repo/migrations/20190516160535_add_decompiled_and_verified_flag_to_addresses.exs
@@ -0,0 +1,18 @@
+defmodule Explorer.Repo.Migrations.AddDecompiledAndVerifiedFlagToAddresses do
+ use Ecto.Migration
+
+ def change do
+ execute(
+ """
+ ALTER TABLE addresses
+ ADD COLUMN IF NOT EXISTS decompiled BOOLEAN,
+ ADD COLUMN IF NOT EXISTS verified BOOLEAN;
+ """,
+ """
+ ALTER TABLE addresses
+ DROP COLUMN IF EXISTS decompiled,
+ DROP COLUMN IF EXISTS verified;
+ """
+ )
+ end
+end
diff --git a/apps/explorer/test/explorer/chain_test.exs b/apps/explorer/test/explorer/chain_test.exs
index cafd742e2a..0234672183 100644
--- a/apps/explorer/test/explorer/chain_test.exs
+++ b/apps/explorer/test/explorer/chain_test.exs
@@ -2859,6 +2859,12 @@ defmodule Explorer.ChainTest do
assert {:ok, _} = Chain.create_smart_contract(attrs)
assert Repo.get_by(Address.Name, name: "SimpleStorage")
end
+
+ test "sets the address verified field to true", %{valid_attrs: valid_attrs} do
+ assert {:ok, %SmartContract{} = smart_contract} = Chain.create_smart_contract(valid_attrs)
+
+ assert Repo.get_by(Address, hash: smart_contract.address_hash).verified == true
+ end
end
describe "stream_unfetched_balances/2" do
diff --git a/apps/explorer/test/explorer/smart_contract/solidity/code_compiler_test.exs b/apps/explorer/test/explorer/smart_contract/solidity/code_compiler_test.exs
index 57f15577ac..be68a03a0e 100644
--- a/apps/explorer/test/explorer/smart_contract/solidity/code_compiler_test.exs
+++ b/apps/explorer/test/explorer/smart_contract/solidity/code_compiler_test.exs
@@ -310,6 +310,34 @@ defmodule Explorer.SmartContract.Solidity.CodeCompilerTest do
end
end
+ # describe "allowed_evm_versions/0" do
+ # test "returns allowed evm versions defined by ALLOWED_EVM_VERSIONS env var" do
+ # Application.put_env(:explorer, :allowed_evm_versions, "CustomEVM1,CustomEVM2,CustomEVM3")
+ # response = CodeCompiler.allowed_evm_versions()
+
+ # assert ["CustomEVM1", "CustomEVM2", "CustomEVM3"] = response
+ # end
+
+ # test "returns allowed evm versions defined by not trimmed ALLOWED_EVM_VERSIONS env var" do
+ # Application.put_env(:explorer, :allowed_evm_versions, "CustomEVM1, CustomEVM2, CustomEVM3")
+ # response = CodeCompiler.allowed_evm_versions()
+
+ # assert ["CustomEVM1", "CustomEVM2", "CustomEVM3"] = response
+ # end
+
+ # test "returns default_allowed_evm_versions" do
+ # Application.put_env(
+ # :explorer,
+ # :allowed_evm_versions,
+ # "homestead,tangerineWhistle,spuriousDragon,byzantium,constantinople,petersburg"
+ # )
+
+ # response = CodeCompiler.allowed_evm_versions()
+
+ # assert ["homestead", "tangerineWhistle", "spuriousDragon", "byzantium", "constantinople", "petersburg"] = response
+ # end
+ # end
+
defp remove_init_data_and_whisper_data(code) do
{res, _} =
code
diff --git a/apps/explorer/test/support/factory.ex b/apps/explorer/test/support/factory.ex
index 115b07e066..fcde1e13f2 100644
--- a/apps/explorer/test/support/factory.ex
+++ b/apps/explorer/test/support/factory.ex
@@ -482,6 +482,7 @@ defmodule Explorer.Factory do
address = %Address{
hash: address_hash(),
+ verified: true,
contract_code: contract_code_info().bytecode,
smart_contract: smart_contract
}
@@ -519,7 +520,7 @@ defmodule Explorer.Factory do
contract_code_info = contract_code_info()
%SmartContract{
- address_hash: insert(:address, contract_code: contract_code_info.bytecode).hash,
+ address_hash: insert(:address, contract_code: contract_code_info.bytecode, verified: true).hash,
compiler_version: contract_code_info.version,
name: contract_code_info.name,
contract_source_code: contract_code_info.source_code,
@@ -532,7 +533,7 @@ defmodule Explorer.Factory do
contract_code_info = contract_code_info()
%DecompiledSmartContract{
- address_hash: insert(:address, contract_code: contract_code_info.bytecode).hash,
+ address_hash: insert(:address, contract_code: contract_code_info.bytecode, decompiled: true).hash,
decompiler_version: "test_decompiler",
decompiled_source_code: contract_code_info.source_code
}
diff --git a/docker/Makefile b/docker/Makefile
index 1f49ff50b5..ac1c2677d6 100644
--- a/docker/Makefile
+++ b/docker/Makefile
@@ -1,6 +1,7 @@
SYSTEM = $(shell uname -s)
HOST = host.docker.internal
DOCKER_IMAGE = blockscout_prod
+BS_CONTAINER_NAME = blockscout
PG_CONTAINER_NAME = postgres
PG_CONTAINER_IMAGE = postgres:10.4
THIS_FILE = $(lastword $(MAKEFILE_LIST))
@@ -87,7 +88,7 @@ endif
start: build postgres
@echo "==> Starting blockscout"
- @docker run --rm \
+ @docker run --rm --name $(BS_CONTAINER_NAME) \
$(BLOCKSCOUT_CONTAINNER_PARAMS) \
-p 4000:4000 \
$(DOCKER_IMAGE) /bin/sh -c "mix phx.server"
diff --git a/mix.lock b/mix.lock
index e9066554b1..df1be8c242 100644
--- a/mix.lock
+++ b/mix.lock
@@ -109,5 +109,5 @@
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"},
"wallaby": {:hex, :wallaby, "0.22.0", "e5d16bfa7ab23562c8a6e3b0a31445a2fd470ca622082a910114807ba823780d", [:mix], [{:httpoison, "~> 0.12 or ~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:poison, ">= 1.4.0", [hex: :poison, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}], "hexpm"},
"websocket_client": {:hex, :websocket_client, "1.3.0", "2275d7daaa1cdacebf2068891c9844b15f4fdc3de3ec2602420c2fb486db59b6", [:rebar3], [], "hexpm"},
- "wobserver": {:git, "https://github.com/KronicDeth/wobserver.git", "99683a936c75c0a94ebb884cef019f7ed0b97112", [ref: "99683a936c75c0a94ebb884cef019f7ed0b97112"]},
+ "wobserver": {:git, "https://github.com/poanetwork/wobserver.git", "13bcda30a87f4f0be1878920a79433ad831eefbe", [branch: "support-https"]},
}