Create Address Tags and UI

Add tags to controllers

Get rid of private_tags

Add address tags link into topnav

Add model to get tags
account
Oleg Sovetnik 3 years ago committed by Viktor Baranov
parent 4cf8976bdb
commit 69f9dcdd0f
  1. 81
      apps/block_scout_web/lib/block_scout_web/controllers/account/tag_address_controller.ex
  2. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_coin_balance_controller.ex
  3. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_contract_controller.ex
  4. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_decompiled_contract_controller.ex
  5. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_internal_transaction_controller.ex
  6. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_logs_controller.ex
  7. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_read_contract_controller.ex
  8. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_read_proxy_controller.ex
  9. 9
      apps/block_scout_web/lib/block_scout_web/controllers/address_token_transfer_controller.ex
  10. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_transaction_controller.ex
  11. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_validation_controller.ex
  12. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_write_contract_controller.ex
  13. 5
      apps/block_scout_web/lib/block_scout_web/controllers/address_write_proxy_controller.ex
  14. 5
      apps/block_scout_web/lib/block_scout_web/controllers/tokens/contract_controller.ex
  15. 5
      apps/block_scout_web/lib/block_scout_web/controllers/tokens/holder_controller.ex
  16. 5
      apps/block_scout_web/lib/block_scout_web/controllers/tokens/transfer_controller.ex
  17. 71
      apps/block_scout_web/lib/block_scout_web/models/add_tag_address.ex
  18. 67
      apps/block_scout_web/lib/block_scout_web/models/get_address_tags.ex
  19. 3
      apps/block_scout_web/lib/block_scout_web/templates/account/auth/profile.html.eex
  20. 13
      apps/block_scout_web/lib/block_scout_web/templates/account/common/_nav.html.eex
  21. 38
      apps/block_scout_web/lib/block_scout_web/templates/account/tag_address/index.html.eex
  22. 41
      apps/block_scout_web/lib/block_scout_web/templates/account/tag_address/new.html.eex
  23. 11
      apps/block_scout_web/lib/block_scout_web/templates/account/tag_address/row.html.eex
  24. 11
      apps/block_scout_web/lib/block_scout_web/templates/account/watchlist/show.html.eex
  25. 12
      apps/block_scout_web/lib/block_scout_web/templates/account/watchlist_address/edit.html.eex
  26. 12
      apps/block_scout_web/lib/block_scout_web/templates/account/watchlist_address/new.html.eex
  27. 16
      apps/block_scout_web/lib/block_scout_web/templates/address/_labels.html.eex
  28. 3
      apps/block_scout_web/lib/block_scout_web/templates/address/overview.html.eex
  29. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_coin_balance/index.html.eex
  30. 48
      apps/block_scout_web/lib/block_scout_web/templates/address_contract/index.html.eex
  31. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_decompiled_contract/index.html.eex
  32. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_internal_transaction/index.html.eex
  33. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_logs/index.html.eex
  34. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_read_contract/index.html.eex
  35. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_read_proxy/index.html.eex
  36. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_token/index.html.eex
  37. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_token_transfer/index.html.eex
  38. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_transaction/index.html.eex
  39. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_validation/index.html.eex
  40. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_write_contract/index.html.eex
  41. 4
      apps/block_scout_web/lib/block_scout_web/templates/address_write_proxy/index.html.eex
  42. 1
      apps/block_scout_web/lib/block_scout_web/templates/layout/_topnav.html.eex
  43. 2
      apps/block_scout_web/lib/block_scout_web/templates/tokens/contract/index.html.eex
  44. 2
      apps/block_scout_web/lib/block_scout_web/templates/tokens/holder/index.html.eex
  45. 2
      apps/block_scout_web/lib/block_scout_web/templates/tokens/inventory/index.html.eex
  46. 3
      apps/block_scout_web/lib/block_scout_web/templates/tokens/overview/_details.html.eex
  47. 2
      apps/block_scout_web/lib/block_scout_web/templates/tokens/transfer/index.html.eex
  48. 4
      apps/block_scout_web/lib/block_scout_web/templates/transaction/_tile.html.eex
  49. 4
      apps/block_scout_web/lib/block_scout_web/templates/transaction/overview.html.eex
  50. 3
      apps/block_scout_web/lib/block_scout_web/views/account/common_view.ex
  51. 7
      apps/block_scout_web/lib/block_scout_web/views/account/tag_address_view.ex
  52. 1
      apps/block_scout_web/lib/block_scout_web/views/transaction_view.ex
  53. 16
      apps/block_scout_web/lib/block_scout_web/web_router.ex
  54. 228
      apps/block_scout_web/priv/gettext/default.pot
  55. 228
      apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po
  56. 3
      apps/explorer/lib/explorer/accounts/identity.ex
  57. 32
      apps/explorer/lib/explorer/accounts/tag_address.ex
  58. 1
      apps/explorer/lib/explorer/exchange_rates/token.ex
  59. 37
      apps/explorer/lib/explorer/tags/address_to_tag.ex
  60. 20
      apps/explorer/priv/repo/migrations/20220212222222_create_account_tag_addresses.exs
  61. 4
      docker/Makefile

@ -0,0 +1,81 @@
defmodule BlockScoutWeb.Account.TagAddressController do
use BlockScoutWeb, :controller
alias BlockScoutWeb.Account.AuthController
alias Ecto.Changeset
alias Explorer.Accounts.TagAddress
alias Explorer.Repo
import BlockScoutWeb.Account.AuthController, only: [authenticate!: 1]
def index(conn, _params) do
case AuthController.current_user(conn) do
nil ->
conn
# |> put_flash(:info, "Sign in to see address tags")
|> redirect(to: root())
%{} = user ->
render(
conn,
"index.html",
address_tags: address_tags(user)
)
end
end
def new(conn, _params) do
authenticate!(conn)
render(conn, "new.html", new_tag: new_tag())
end
def create(conn, %{"tag_address" => params}) do
current_user = authenticate!(conn)
case AddTagAddress.call(current_user.id, params) do
{:ok, _tag_address} ->
conn
# |> put_flash(:info, "Tag Address created!")
|> redirect(to: tag_address_path(conn, :index))
{:error, message = message} ->
conn
# |> put_flash(:error, message)
|> render("new.html", new_tag: changeset_with_error(params, message))
end
end
def delete(conn, %{"id" => id}) do
current_user = authenticate!(conn)
TagAddress
|> Repo.get_by(id: id, identity_id: current_user.id)
|> Repo.delete()
conn
# |> put_flash(:info, "Tag Address removed successfully.")
|> redirect(to: tag_address_path(conn, :index))
end
def address_tags(user) do
TagAddress
|> Repo.all(identity_id: user.id)
|> Repo.preload(:address)
end
defp new_tag, do: TagAddress.changeset(%TagAddress{}, %{})
defp changeset_with_error(params, message) do
%{changeset(params) | action: :insert}
|> Changeset.add_error(:address_hash, message)
end
defp changeset(params) do
TagAddress.changeset(%TagAddress{}, params)
end
defp root do
System.get_env("NETWORK_PATH") || "/"
end
end

@ -12,7 +12,6 @@ defmodule BlockScoutWeb.AddressCoinBalanceController do
alias Explorer.{Chain, Market}
alias Explorer.Chain.{Address, Wei}
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.CoinBalanceOnDemand
alias Phoenix.View
@ -74,7 +73,7 @@ defmodule BlockScoutWeb.AddressCoinBalanceController do
{:ok, address} <- Chain.hash_to_address(address_hash),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(conn, "index.html",
address: address,
@ -82,7 +81,7 @@ defmodule BlockScoutWeb.AddressCoinBalanceController do
exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(),
current_path: Controller.current_full_path(conn),
counters_path: address_path(conn, :address_counters, %{"id" => Address.checksum(address_hash)}),
private_tags: private_tags
tags: tags
)
else
{:restricted_access, _} ->

@ -7,7 +7,6 @@ defmodule BlockScoutWeb.AddressContractController do
alias BlockScoutWeb.AddressContractVerificationController, as: VerificationController
alias Explorer.{Chain, Market}
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.CoinBalanceOnDemand
def index(conn, %{"address_id" => address_hash_string} = params) do
@ -26,7 +25,7 @@ defmodule BlockScoutWeb.AddressContractController do
_ <- VerificationController.check_and_verify(address_hash_string),
{:ok, address} <- Chain.find_contract_address(address_hash, address_options, true) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -35,7 +34,7 @@ defmodule BlockScoutWeb.AddressContractController do
coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address),
exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(),
counters_path: address_path(conn, :address_counters, %{"id" => address_hash_string}),
private_tags: private_tags
tags: tags
)
else
{:restricted_access, _} ->

@ -5,7 +5,6 @@ defmodule BlockScoutWeb.AddressDecompiledContractController do
alias BlockScoutWeb.Account.AuthController
alias Explorer.{Chain, Market}
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.CoinBalanceOnDemand
def index(conn, %{"address_id" => address_hash_string} = params) do
@ -13,7 +12,7 @@ defmodule BlockScoutWeb.AddressDecompiledContractController do
{:ok, address} <- Chain.find_decompiled_contract_address(address_hash),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -22,7 +21,7 @@ defmodule BlockScoutWeb.AddressDecompiledContractController do
coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address),
exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(),
counters_path: address_path(conn, :address_counters, %{"id" => address_hash_string}),
private_tags: private_tags
tags: tags
)
else
{:restricted_access, _} ->

@ -12,7 +12,6 @@ defmodule BlockScoutWeb.AddressInternalTransactionController do
alias Explorer.{Chain, Market}
alias Explorer.Chain.{Address, Wei}
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.CoinBalanceOnDemand
alias Phoenix.View
@ -81,7 +80,7 @@ defmodule BlockScoutWeb.AddressInternalTransactionController do
{:ok, address} <- Chain.hash_to_address(address_hash),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -92,7 +91,7 @@ defmodule BlockScoutWeb.AddressInternalTransactionController do
exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(),
filter: params["filter"],
counters_path: address_path(conn, :address_counters, %{"id" => address_hash_string}),
private_tags: private_tags
tags: tags
)
else
{:restricted_access, _} ->

@ -9,7 +9,6 @@ defmodule BlockScoutWeb.AddressLogsController do
alias BlockScoutWeb.Account.AuthController
alias Explorer.{Chain, Market}
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.CoinBalanceOnDemand
alias Phoenix.View
@ -60,7 +59,7 @@ defmodule BlockScoutWeb.AddressLogsController do
{:ok, address} <- Chain.hash_to_address(address_hash),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -70,7 +69,7 @@ defmodule BlockScoutWeb.AddressLogsController do
coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address),
exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(),
counters_path: address_path(conn, :address_counters, %{"id" => address_hash_string}),
private_tags: private_tags
tags: tags
)
else
_ ->

@ -13,7 +13,6 @@ defmodule BlockScoutWeb.AddressReadContractController do
alias Explorer.{Chain, Market}
alias Explorer.Chain.Address
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.CoinBalanceOnDemand
def index(conn, %{"address_id" => address_hash_string} = params) do
@ -32,7 +31,7 @@ defmodule BlockScoutWeb.AddressReadContractController do
false <- is_nil(address.smart_contract),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -43,7 +42,7 @@ defmodule BlockScoutWeb.AddressReadContractController do
coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address),
exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(),
counters_path: address_path(conn, :address_counters, %{"id" => Address.checksum(address_hash)}),
private_tags: private_tags
tags: tags
)
else
_ ->

@ -7,7 +7,6 @@ defmodule BlockScoutWeb.AddressReadProxyController do
alias Explorer.{Chain, Market}
alias Explorer.Chain.Address
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.CoinBalanceOnDemand
def index(conn, %{"address_id" => address_hash_string} = params) do
@ -26,7 +25,7 @@ defmodule BlockScoutWeb.AddressReadProxyController do
false <- is_nil(address.smart_contract),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -37,7 +36,7 @@ defmodule BlockScoutWeb.AddressReadProxyController do
coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address),
exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(),
counters_path: address_path(conn, :address_counters, %{"id" => Address.checksum(address_hash)}),
private_tags: private_tags
tags: tags
)
else
_ ->

@ -6,7 +6,6 @@ defmodule BlockScoutWeb.AddressTokenTransferController do
alias Explorer.ExchangeRates.Token
alias Explorer.{Chain, Market}
alias Explorer.Chain.Address
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.CoinBalanceOnDemand
alias Phoenix.View
@ -104,7 +103,7 @@ defmodule BlockScoutWeb.AddressTokenTransferController do
{:ok, token} <- Chain.token_from_address_hash(token_hash),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -115,7 +114,7 @@ defmodule BlockScoutWeb.AddressTokenTransferController do
current_path: Controller.current_full_path(conn),
token: token,
counters_path: address_path(conn, :address_counters, %{"id" => Address.checksum(address_hash)}),
private_tags: private_tags
tags: tags
)
else
{:restricted_access, _} ->
@ -199,7 +198,7 @@ defmodule BlockScoutWeb.AddressTokenTransferController do
{:ok, address} <- Chain.hash_to_address(address_hash),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -210,7 +209,7 @@ defmodule BlockScoutWeb.AddressTokenTransferController do
filter: params["filter"],
current_path: Controller.current_full_path(conn),
counters_path: address_path(conn, :address_counters, %{"id" => Address.checksum(address_hash)}),
private_tags: private_tags
tags: tags
)
else
{:restricted_access, _} ->

@ -9,7 +9,6 @@ defmodule BlockScoutWeb.AddressTransactionController do
alias BlockScoutWeb.{AccessHelpers, Controller, TransactionView}
alias BlockScoutWeb.Account.AuthController
alias Explorer.Tags.AddressToTag
alias Explorer.{Chain, Market}
alias Explorer.Chain.{
@ -117,7 +116,7 @@ defmodule BlockScoutWeb.AddressTransactionController do
{:ok, address} <- Chain.hash_to_address(address_hash),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -128,7 +127,7 @@ defmodule BlockScoutWeb.AddressTransactionController do
filter: params["filter"],
counters_path: address_path(conn, :address_counters, %{"id" => address_hash_string}),
current_path: Controller.current_full_path(conn),
private_tags: private_tags
tags: tags
)
else
:error ->

@ -10,7 +10,6 @@ defmodule BlockScoutWeb.AddressValidationController do
alias BlockScoutWeb.{AccessHelpers, BlockView, Controller}
alias BlockScoutWeb.Account.AuthController
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Explorer.{Chain, Market}
alias Indexer.Fetcher.CoinBalanceOnDemand
alias Phoenix.View
@ -75,7 +74,7 @@ defmodule BlockScoutWeb.AddressValidationController do
{:ok, address} <- Chain.find_or_insert_address_from_hash(address_hash),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -85,7 +84,7 @@ defmodule BlockScoutWeb.AddressValidationController do
current_path: Controller.current_full_path(conn),
counters_path: address_path(conn, :address_counters, %{"id" => address_hash_string}),
exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(),
private_tags: private_tags
tags: tags
)
else
{:restricted_access, _} ->

@ -13,7 +13,6 @@ defmodule BlockScoutWeb.AddressWriteContractController do
alias Explorer.{Chain, Market}
alias Explorer.Chain.Address
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.CoinBalanceOnDemand
def index(conn, %{"address_id" => address_hash_string} = params) do
@ -32,7 +31,7 @@ defmodule BlockScoutWeb.AddressWriteContractController do
false <- is_nil(address.smart_contract),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -43,7 +42,7 @@ defmodule BlockScoutWeb.AddressWriteContractController do
coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address),
exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(),
counters_path: address_path(conn, :address_counters, %{"id" => Address.checksum(address_hash)}),
private_tags: private_tags
tags: tags
)
else
_ ->

@ -7,7 +7,6 @@ defmodule BlockScoutWeb.AddressWriteProxyController do
alias Explorer.{Chain, Market}
alias Explorer.Chain.Address
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.CoinBalanceOnDemand
def index(conn, %{"address_id" => address_hash_string} = params) do
@ -26,7 +25,7 @@ defmodule BlockScoutWeb.AddressWriteProxyController do
false <- is_nil(address.smart_contract),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -37,7 +36,7 @@ defmodule BlockScoutWeb.AddressWriteProxyController do
coin_balance_status: CoinBalanceOnDemand.trigger_fetch(address),
exchange_rate: Market.get_exchange_rate(Explorer.coin()) || Token.null(),
counters_path: address_path(conn, :address_counters, %{"id" => Address.checksum(address_hash)}),
private_tags: private_tags
tags: tags
)
else
_ ->

@ -5,7 +5,6 @@ defmodule BlockScoutWeb.Tokens.ContractController do
alias BlockScoutWeb.{AccessHelpers, TabHelpers}
alias Explorer.{Chain, Market}
alias Explorer.Chain.Address
alias Explorer.Tags.AddressToTag
def index(conn, %{"token_id" => address_hash_string} = params) do
options = [necessity_by_association: %{[contract_address: :smart_contract] => :optional}]
@ -15,7 +14,7 @@ defmodule BlockScoutWeb.Tokens.ContractController do
{:ok, token} <- Chain.token_from_address_hash(address_hash, options),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
%{type: type, action: action} =
cond do
@ -39,7 +38,7 @@ defmodule BlockScoutWeb.Tokens.ContractController do
action: action,
token: Market.add_price(token),
counters_path: token_path(conn, :token_counters, %{"id" => Address.checksum(address_hash)}),
private_tags: private_tags
tags: tags
)
else
{:restricted_access, _} ->

@ -6,7 +6,6 @@ defmodule BlockScoutWeb.Tokens.HolderController do
alias BlockScoutWeb.Tokens.HolderView
alias Explorer.{Chain, Market}
alias Explorer.Chain.Address
alias Explorer.Tags.AddressToTag
alias Phoenix.View
import BlockScoutWeb.Chain,
@ -64,7 +63,7 @@ defmodule BlockScoutWeb.Tokens.HolderController do
{:ok, token} <- Chain.token_from_address_hash(address_hash, options),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -72,7 +71,7 @@ defmodule BlockScoutWeb.Tokens.HolderController do
current_path: Controller.current_full_path(conn),
token: Market.add_price(token),
counters_path: token_path(conn, :token_counters, %{"id" => Address.checksum(address_hash)}),
private_tags: private_tags
tags: tags
)
else
{:restricted_access, _} ->

@ -6,7 +6,6 @@ defmodule BlockScoutWeb.Tokens.TransferController do
alias BlockScoutWeb.Tokens.TransferView
alias Explorer.{Chain, Market}
alias Explorer.Chain.Address
alias Explorer.Tags.AddressToTag
alias Indexer.Fetcher.TokenTotalSupplyOnDemand
alias Phoenix.View
@ -68,7 +67,7 @@ defmodule BlockScoutWeb.Tokens.TransferController do
{:ok, token} <- Chain.token_from_address_hash(address_hash, options),
{:ok, false} <- AccessHelpers.restricted_access?(address_hash_string, params) do
current_user = AuthController.current_user(conn)
private_tags = AddressToTag.get_private_tags_on_address(address_hash, current_user)
tags = GetAddressTags.call(address_hash, current_user)
render(
conn,
@ -77,7 +76,7 @@ defmodule BlockScoutWeb.Tokens.TransferController do
current_path: Controller.current_full_path(conn),
token: Market.add_price(token),
token_total_supply_status: TokenTotalSupplyOnDemand.trigger_fetch(address_hash),
private_tags: private_tags
tags: tags
)
else
{:restricted_access, _} ->

@ -0,0 +1,71 @@
defmodule AddTagAddress do
@moduledoc """
Create tag address, associated with Address and Identity
"""
alias Explorer.Accounts.TagAddress
alias Explorer.{Chain, Repo}
alias Explorer.Chain.Address
def call(identity_id, %{"address_hash" => address_hash_string} = params) do
case format_address(address_hash_string) do
{:ok, address_hash} ->
try_create_tag_address(identity_id, address_hash, params)
:error ->
{:error, "Wrong address, "}
end
end
defp try_create_tag_address(identity_id, address_hash, params) do
case find_tag_address(identity_id, address_hash) do
%TagAddress{} ->
{:error, "Address tag already exists!"}
nil ->
with {:ok, %Address{} = address} <- find_or_create_address(address_hash) do
address
|> build_tag_address(identity_id, params)
|> Repo.insert()
end
end
end
defp format_address(address_hash_string) do
Chain.string_to_address_hash(address_hash_string)
end
defp find_tag_address(identity_id, address_hash) do
Repo.get_by(TagAddress,
address_hash: address_hash,
identity_id: identity_id
)
end
defp find_or_create_address(address_hash) do
with {:error, :address_not_found} <- find_address(address_hash),
do: create_address(address_hash)
end
defp create_address(address_hash) do
with {:error, _} <- Repo.insert(%Address{hash: address_hash}),
do: {:error, :wrong_address}
end
defp find_address(address_hash) do
case Repo.get(Address, address_hash) do
nil -> {:error, :address_not_found}
%Address{} = address -> {:ok, address}
end
end
defp build_tag_address(address, identity_id, %{"name" => name}) do
TagAddress.changeset(
%TagAddress{
identity_id: identity_id,
address_hash: address.hash
},
%{name: name}
)
end
end

@ -0,0 +1,67 @@
defmodule GetAddressTags do
@moduledoc """
Get various types of tags associated with the address
"""
import Ecto.Query, only: [from: 2]
alias Explorer.Accounts.{TagAddress, WatchlistAddress}
alias Explorer.Chain.Hash
alias Explorer.Repo
alias Explorer.Tags.{AddressTag, AddressToTag}
def call(nil, nil),
do: %{personal_tags: [], watchlist_names: []}
def call(%Hash{} = address_hash, current_user) do
%{
# common_tags: get_tags_on_address(address_hash),
personal_tags: get_personal_tags(address_hash, current_user),
watchlist_names: get_watchlist_names_on_address(address_hash, current_user)
}
end
def get_tags_on_address(%Hash{} = address_hash) do
query =
from(
tt in AddressTag,
left_join: att in AddressToTag,
on: tt.id == att.tag_id,
where: att.address_hash == ^address_hash,
where: tt.label != ^"validator",
select: %{label: tt.label, display_name: tt.display_name}
)
Repo.all(query)
end
def get_tags_on_address(_), do: []
def get_personal_tags(%Hash{} = address_hash, %{id: id}) do
query =
from(
ta in TagAddress,
where: ta.address_hash == ^address_hash,
where: ta.identity_id == ^id,
select: %{label: ta.name, display_name: ta.name}
)
Repo.all(query)
end
def get_personal_tags(_, _), do: []
def get_watchlist_names_on_address(%Hash{} = address_hash, %{watchlist_id: watchlist_id}) do
query =
from(
wa in WatchlistAddress,
where: wa.address_hash == ^address_hash,
where: wa.watchlist_id == ^watchlist_id,
select: %{label: wa.name, display_name: wa.name}
)
Repo.all(query)
end
def get_watchlist_names_on_address(_, _), do: []
end

@ -8,6 +8,9 @@
<li class="nav-item">
<a class="dropdown-item fs-14" href="<%= watchlist_path(@conn, :show) %>">Watchlist</a>
</li>
<li class="nav-item">
<a class="dropdown-item fs-14" href="<%= tag_address_path(@conn, :index) %>">Address Tags</a>
</li>
</ul>
</div>
<div class="col-md">

@ -0,0 +1,13 @@
<div class="col-2 mb-3">
<ul class="nav flex-column">
<li class="nav-item">
<a class="dropdown-item fs-14" aria-current="page" href="<%= auth_path(@conn, :profile) %>">Profile</a>
</li>
<li class="nav-item">
<a class="dropdown-item fs-14" href="<%= watchlist_path(@conn, :show) %>">Watchlist</a>
</li>
<li class="nav-item">
<a class="dropdown-item fs-14" href="<%= tag_address_path(@conn, :index) %>">Address Tags</a>
</li>
</ul>
</div>

@ -0,0 +1,38 @@
<section class="container">
<div class="row">
<%= render BlockScoutWeb.Account.CommonView, "_nav.html", conn: @conn %>
<div class="col-md">
<div class="card">
<div class="card-body" >
<h1 class="card-title list-title-description header-account">Address Tags</h1>
<br>
<div class="col-sm">
<div class="mb-3 row o-flow-x">
<%= if @address_tags == [] do %>
<div style="min-width: 100%;">
<div class="tile tile-muted text-center" data-selector="empty-coin-balances-list">
You don't have address tags yet
</div>
</div>
<h2></h2>
<% else %>
<table class="table mb-3 table-watchlist">
<thead style="font-size: 14px; color: #6c757d" >
<tr>
<th scope="col">Name</th>
<th scope="col">Address</th>
</tr>
</thead>
<tbody style="font-size: 15px; color: #6c757d" >
<%= Enum.map(@address_tags, fn at ->
render(TagAddressView, "row.html", address_tag: at, conn: @conn)
end) %>
</tbody>
</table>
<% end %>
</div>
</div>
<a class="button button-primary button-sm" href="<%= tag_address_path(@conn, :new) %>">Add address tag</a>
</div>
</div>
</section>

@ -0,0 +1,41 @@
<section class="container">
<div class="row">
<div class="col-2 mb-3">
<ul class="nav flex-column">
<li class="nav-item">
<a class="dropdown-item fs-14" aria-current="page" href="<%= auth_path(@conn, :profile) %>">Profile</a>
</li>
<li class="nav-item">
<a class="dropdown-item acc-link-active fs-14" style="font-size: 14px;" href="#">Watchlist</a>
</li>
</ul>
</div>
<div class="col-sm-10">
<div class="card">
<div class="card-body" >
<h1 class="card-title list-title-description header-account">Add address tag</h1>
<div class="col-sm-10 card-body-account">
<%= form_for @new_tag, tag_address_path(@conn, :create), fn f -> %>
<div class="form-group">
<%= label f, :address_hash, "Address", class: "control-label", style: "font-size: 14px" %>
<%= text_input f, :address_hash, class: "form-control", placeholder: "0x0000000000000000000000000000000000000000" %>
<%= error_tag f, :address_hash, style: "color: #ff7986;" %>
</div>
<div class="form-group">
<%= label f, :name, "Name", class: "control-label", style: "font-size: 14px" %>
<%= text_input f, :name, class: "form-control", placeholder: "Name this address" %>
<%= error_tag f, :name %>
</div>
<div class="form-group float-right form-input">
<a class="btn btn-line" href="<%= tag_address_path(@conn, :index) %>"> Back to Address Tags (Cancel)</a>
<%= submit "Save", class: "button button-primary button-sm ml-3" %>
</div>
<% end %>
</div>
</div>
</div>
</div>
</div>
</section>

@ -0,0 +1,11 @@
<tr>
<td><%= @address_tag.name %></td>
<td>
<div>
<%= link(trimmed_hash(@address_tag.address_hash), to: address_path(@conn, :show, @address_tag.address_hash)) %>
<%= render BlockScoutWeb.CommonComponentsView, "_btn_copy.html",
additional_classes: ["btn-copy-icon-small", "btn-copy-icon-custom", "btn-copy-icon-no-borders"], clipboard_text: @address_tag.address_hash, aria_label: gettext("Copy Address"), title: gettext("Copy Address"), style: "display: inline-block; vertical-align: text-bottom; position: initial; margin-top: 1px;" %>
<%= link "Remove Tag", to: tag_address_path(@conn, :delete, @address_tag.id), method: :delete, class: "btn btn-danger white button-sm", style: "color: #fff !important;" %>
</div>
</td>
</tr>

@ -1,15 +1,6 @@
<section class="container">
<div class="row">
<div class="col-2 mb-3">
<ul class="nav flex-column">
<li class="nav-item">
<a class="dropdown-item fs-14" aria-current="page" href="<%= auth_path(@conn, :profile) %>">Profile</a>
</li>
<li class="nav-item">
<a class="dropdown-item acc-link-active fs-14" href="#">Watchlist</a>
</li>
</ul>
</div>
<%= render BlockScoutWeb.Account.CommonView, "_nav.html", conn: @conn %>
<div class="col-md">
<div class="card">
<div class="card-body" >

@ -1,16 +1,6 @@
<section class="container">
<div class="row">
<div class="col-2 mb-3">
<ul class="nav flex-column">
<li class="nav-item">
<a class="dropdown-item fs-14" aria-current="page" style="font-size: 14px;" href="<%= auth_path(@conn, :profile) %>">Profile</a>
</li>
<li class="nav-item">
<a class="dropdown-item acc-link-active fs-14" style="font-size: 14px;" href="#">Watchlist</a>
</li>
</ul>
</div>
<%= render BlockScoutWeb.Account.CommonView, "_nav.html", conn: @conn %>
<div class="col-sm-10">
<div class="card">
<div class="card-body" >

@ -1,16 +1,6 @@
<section class="container">
<div class="row">
<div class="col-2 mb-3">
<ul class="nav flex-column">
<li class="nav-item">
<a class="dropdown-item fs-14" aria-current="page" href="<%= auth_path(@conn, :profile) %>">Profile</a>
</li>
<li class="nav-item">
<a class="dropdown-item acc-link-active fs-14" style="font-size: 14px;" href="#">Watchlist</a>
</li>
</ul>
</div>
<%= render BlockScoutWeb.Account.CommonView, "_nav.html", conn: @conn %>
<div class="col-sm-10">
<div class="card">
<div class="card-body" >

@ -1,8 +1,14 @@
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= for private_tag <- private_tags do %>
<%= if private_tag.label =~ "dark forest" do %>
<%= render BlockScoutWeb.FormView, "_tag.html", text: private_tag.display_name, additional_classes: ["df", "ml-1"] %>
<%= for personal_tag <- @tags.personal_tags do %>
<%= if personal_tag.label =~ "dark forest" do %>
<%= render BlockScoutWeb.FormView, "_tag.html", text: personal_tag.display_name, additional_classes: ["df", "ml-1"] %>
<% else %>
<%= render BlockScoutWeb.FormView, "_tag.html", text: private_tag.display_name, additional_classes: [tag_name_to_label(private_tag.label), "ml-1"] %>
<%= render BlockScoutWeb.FormView, "_tag.html", text: personal_tag.display_name, additional_classes: [tag_name_to_label(personal_tag.label), "ml-1"] %>
<% end %>
<% end %>
<%= for watchlist_name <- @tags.watchlist_names do %>
<%= if watchlist_name.label =~ "dark forest" do %>
<%= render BlockScoutWeb.FormView, "_tag.html", text: watchlist_name.display_name, additional_classes: ["df", "ml-1"] %>
<% else %>
<%= render BlockScoutWeb.FormView, "_tag.html", text: watchlist_name.display_name, additional_classes: [tag_name_to_label(watchlist_name.label), "ml-1"] %>
<% end %>
<% end %>

@ -5,7 +5,6 @@
<% circles_addresses_list = CustomContractsHelpers.get_custom_addresses_list(:circles_addresses) %>
<% current_address = "0x" <> Base.encode16(@address.hash.bytes, case: :lower) %>
<% created_from_address_hash = if from_address_hash(@address), do: "0x" <> Base.encode16(from_address_hash(@address).bytes, case: :lower), else: nil %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<div class="row js-ad-dependant-mb-2 js-ad-dependant-mb-5-reverse">
<!-- Address details -->
<div class="col-md-12 js-ad-dependant-mb-2">
@ -29,7 +28,7 @@
<% end %>
<h1 class="card-title lg-card-title mb-2-desktop">
<div class="title-with-label"><%= address_title(@address) %> <%= gettext "Details" %></div>
<%= render BlockScoutWeb.AddressView, "_labels.html", address_hash: @address.hash, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "_labels.html", address_hash: @address.hash, tags: @tags %>
<!-- buttons -->
<span class="overview-title-buttons float-right">
<%= render BlockScoutWeb.CommonComponentsView, "_btn_copy.html",

@ -3,9 +3,7 @@
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<section>
<div class="card">

@ -8,9 +8,7 @@
<section class="container">
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
@ -157,20 +155,14 @@
<button type="button" class="btn-line" style="float: left;" id="button" data-clipboard-text="<%= creation_code(@address) %>" aria-label="copy contract creation code">
<%= gettext "Copy Contract Creation Code" %>
</button>
<%= if match?({:selfdestructed, _}, contract_creation_code) do %>
<div class="button button-disabled button-sm float-right ml-3">
<%= gettext("Verify & Publish") %>
</div>
<% else %>
<%= if !fully_verified do %>
<% path = address_verify_contract_path(@conn, :new, @address.hash) %>
<%= link(
gettext("Verify & Publish"),
to: path,
class: "button button-primary button-sm float-right ml-3",
"data-test": "verify_and_publish"
) %>
<% end %>
<%= if !fully_verified do %>
<% path = address_verify_contract_path(@conn, :new, @address.hash) %>
<%= link(
gettext("Verify & Publish"),
to: path,
class: "button button-primary button-sm float-right ml-3",
"data-test": "verify_and_publish"
) %>
<% end %>
</div>
</div>
@ -194,20 +186,14 @@
<button type="button" class="btn-line" style="float: left;" id="button" data-clipboard-text="<%= contract_code %>" aria-label="copy contract creation code">
<%= gettext "Copy Deployed ByteCode" %>
</button>
<%= if match?({:selfdestructed, _}, contract_creation_code) and !creation_code(@address) do %>
<div class="button button-disabled button-sm float-right ml-3">
<%= gettext("Verify & Publish") %>
</div>
<% else %>
<%= if !fully_verified and !creation_code(@address) do %>
<% path = address_verify_contract_path(@conn, :new, @address.hash) %>
<%= link(
gettext("Verify & Publish"),
to: path,
class: "button button-primary button-sm float-right ml-3",
"data-test": "verify_and_publish"
) %>
<% end %>
<%= if !fully_verified and !creation_code(@address) do %>
<% path = address_verify_contract_path(@conn, :new, @address.hash) %>
<%= link(
gettext("Verify & Publish"),
to: path,
class: "button button-primary button-sm float-right ml-3",
"data-test": "verify_and_publish"
) %>
<% end %>
</div>
</div>

@ -1,9 +1,7 @@
<section class="container">
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<% contract = last_decompiled_contract_version(@address.decompiled_smart_contracts) %>

@ -1,9 +1,7 @@
<section class="container">
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<section data-page="address-internal-transactions">
<div class="card">

@ -1,9 +1,7 @@
<section class="container">
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<section data-page="address-logs">
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>

@ -2,9 +2,7 @@
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>

@ -2,9 +2,7 @@
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>

@ -1,9 +1,7 @@
<section class="container">
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<section id="tokens">
<div class="card">

@ -1,9 +1,7 @@
<section class="container">
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<section data-page="address-token-transfers" id="transfers">
<div class="card">

@ -2,9 +2,7 @@
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<section data-page="address-transactions" id="txs">
<div class="card">

@ -1,9 +1,7 @@
<section class="container">
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<section data-page="blocks-validated">
<div class="card">

@ -2,9 +2,7 @@
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>

@ -2,9 +2,7 @@
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "overview.html", address: @address, is_proxy: is_proxy, conn: @conn, exchange_rate: @exchange_rate, coin_balance_status: @coin_balance_status, counters_path: @counters_path, tags: @tags %>
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>

@ -185,6 +185,7 @@
</div>
<a href="<%= auth_path(@conn, :profile) %>" class= "dropdown-item">Profile</a>
<a href="<%= watchlist_path(@conn, :show) %>" class= "dropdown-item">Watch list</a>
<a href="<%= tag_address_path(@conn, :index) %>" class= "dropdown-item">Address Tags</a>
<a href="<%= BlockScoutWeb.LayoutView.sign_out_link %>" class= "dropdown-item">Sign out</a>
</div>
</li>

@ -4,7 +4,7 @@
"_details.html",
token: @token,
counters_path: @counters_path,
private_tags: (if assigns[:private_tags], do: @private_tags, else: []),
tags: @tags,
conn: @conn
) %>

@ -4,7 +4,7 @@
"_details.html",
token: @token,
counters_path: @counters_path,
private_tags: (if assigns[:private_tags], do: @private_tags, else: []),
tags: @tags,
conn: @conn
) %>

@ -4,7 +4,7 @@
"_details.html",
token: @token,
counters_path: @counters_path,
private_tags: (if assigns[:private_tags], do: @private_tags, else: []),
tags: @tags,
conn: @conn
) %>

@ -2,7 +2,6 @@
<% address_hash_str = "0x" <> Base.encode16(@token.contract_address_hash.bytes, case: :lower) %>
<% {:ok, created_from_address} = if @token.contract_address_hash, do: Chain.hash_to_address(@token.contract_address_hash), else: {:ok, nil} %>
<% created_from_address_hash = if from_address_hash(created_from_address), do: "0x" <> Base.encode16(from_address_hash(created_from_address).bytes, case: :lower), else: nil %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<section class="address-overview" data-page="token-details" data-page-address-hash="<%= @token.contract_address_hash %>">
<%= render BlockScoutWeb.Advertisement.TextAdView, "index.html", conn: @conn %>
<div class="row js-ad-dependant-mb-2 js-ad-dependant-mb-5-reverse">
@ -34,7 +33,7 @@
<% else %>
<%= gettext("Token Details") %>
<% end %>
<%= render BlockScoutWeb.AddressView, "_labels.html", address_hash: @token.contract_address_hash, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "_labels.html", address_hash: @token.contract_address_hash, tags: @tags %>
</div>
<!-- buttons -->
<span class="overview-title-buttons token float-right">

@ -4,7 +4,7 @@
"_details.html",
token: @token,
counters_path: @counters_path,
private_tags: (if assigns[:private_tags], do: @private_tags, else: []),
tags: @tags,
conn: @conn
) %>

@ -1,7 +1,7 @@
<% status = transaction_status(@transaction) %>
<% error_in_internal_tx = @transaction.has_error_in_internal_txs %>
<% current_user = AuthController.current_user(@conn) %>
<% private_tags = AddressToTag.get_private_tags_on_address(@transaction.to_address_hash, current_user) %>
<% tags = GetAddressTags.call(@transaction.to_address_hash, current_user) %>
<div class="tile tile-type-<%= type_suffix(@transaction) %> fade-in <%= status_class(@transaction) %>" data-test="<%= type_suffix(@transaction) %>" data-identifier-hash="<%= @transaction.hash %>">
<div class="row tile-body" data-selector="token-transfers-toggle" data-test="chain_transaction">
<!-- Color Block -->
@ -33,7 +33,7 @@
<%= if method_name do %>
<%= render BlockScoutWeb.FormView, "_tag.html", text: method_name, additional_classes: ["method", "ml-1"] %>
<% end %>
<%= render BlockScoutWeb.AddressView, "_labels.html", address_hash: @transaction.to_address_hash, height_auto: true, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "_labels.html", address_hash: @transaction.to_address_hash, height_auto: true, tags: tags %>
</div>
</span>
<span>

@ -26,7 +26,7 @@
<% address_hash_str = if to_address_hash, do: "0x" <> Base.encode16(to_address_hash.bytes, case: :lower), else: nil %>
<% {:ok, created_from_address} = if to_address_hash, do: Chain.hash_to_address(to_address_hash), else: {:ok, nil} %>
<% created_from_address_hash_str = if from_address_hash(created_from_address), do: "0x" <> Base.encode16(from_address_hash(created_from_address).bytes, case: :lower), else: nil %>
<% private_tags = if assigns[:private_tags], do: @private_tags, else: [] %>
<% tags = if assigns[:tags], do: @tags, else: %{common_tags: [], personal_tags: [], watchlist_names: []} %>
<%= render BlockScoutWeb.Advertisement.TextAdView, "index.html", conn: @conn %>
<section class="fs-14" data-page="transaction-details" data-page-transaction-hash="<%= @transaction %>">
<div class="row">
@ -50,7 +50,7 @@
<div style="display: inline-block; vertical-align: bottom; line-height: 25px;">
<%= gettext "Transaction Details" %>
</div>
<%= render BlockScoutWeb.AddressView, "_labels.html", address_hash: @transaction.to_address_hash, private_tags: private_tags %>
<%= render BlockScoutWeb.AddressView, "_labels.html", address_hash: @transaction.to_address_hash, tags: tags %>
</h1>
<%= if status == :pending do %>
<div class="tile tile-muted d-flex justify-content-center align-items-center mb-4">

@ -0,0 +1,3 @@
defmodule BlockScoutWeb.Account.CommonView do
use BlockScoutWeb, :view
end

@ -0,0 +1,7 @@
defmodule BlockScoutWeb.Account.TagAddressView do
use BlockScoutWeb, :view
import BlockScoutWeb.AddressView, only: [trimmed_hash: 1]
alias BlockScoutWeb.Account.TagAddressView
end

@ -9,7 +9,6 @@ defmodule BlockScoutWeb.TransactionView do
alias Explorer.Chain.{Address, Block, InternalTransaction, Transaction, Wei}
alias Explorer.Counters.AverageBlockTime
alias Explorer.ExchangeRates.Token
alias Explorer.Tags.AddressToTag
alias Timex.Duration
import BlockScoutWeb.Gettext

@ -30,7 +30,16 @@ defmodule BlockScoutWeb.WebRouter do
scope "/account", BlockScoutWeb do
pipe_through(:browser)
resources("/watchlist", Account.WatchlistController, only: [:show], singleton: true, as: :watchlist)
resources("/tag_address", Account.TagAddressController,
only: [:index, :new, :create, :edit, :update, :delete],
as: :tag_address
)
resources("/watchlist", Account.WatchlistController,
only: [:show],
singleton: true,
as: :watchlist
)
resources("/watchlist_address", Account.WatchlistAddressController,
only: [:new, :create, :edit, :update, :delete],
@ -65,7 +74,10 @@ defmodule BlockScoutWeb.WebRouter do
resources("/blocks", BlockController, as: :blocks, only: [:index])
resources "/blocks", BlockController, as: :block_secondary, only: [:show], param: "hash_or_number" do
resources "/blocks", BlockController,
as: :block_secondary,
only: [:show],
param: "hash_or_number" do
resources("/transactions", BlockTransactionController, only: [:index], as: :transaction)
end

@ -63,7 +63,7 @@ msgstr ""
msgid "%{subnetwork} Explorer - BlockScout"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:351
#: lib/block_scout_web/views/transaction_view.ex:350
#, elixir-autogen, elixir-format
msgid "(Awaiting internal transactions for status)"
msgstr ""
@ -189,7 +189,7 @@ msgstr ""
msgid "All functions displayed below are from ABI of that contract. In order to verify current contract, proceed with"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:29
#: lib/block_scout_web/templates/address_contract/index.html.eex:27
#, elixir-autogen, elixir-format
msgid "All metadata displayed below is from that contract. In order to verify current contract, click"
msgstr ""
@ -241,7 +241,7 @@ msgstr ""
msgid "Balance"
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:16
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:14
#, elixir-autogen, elixir-format
msgid "Balances"
msgstr ""
@ -296,7 +296,7 @@ msgstr ""
msgid "Block Mined, awaiting import..."
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:35
#: lib/block_scout_web/views/transaction_view.ex:34
#, elixir-autogen, elixir-format
msgid "Block Pending"
msgstr ""
@ -441,12 +441,12 @@ msgstr ""
msgid "Compiler"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:67
#: lib/block_scout_web/templates/address_contract/index.html.eex:65
#, elixir-autogen, elixir-format
msgid "Compiler version"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:344
#: lib/block_scout_web/views/transaction_view.ex:343
#, elixir-autogen, elixir-format
msgid "Confirmed"
msgstr ""
@ -472,30 +472,30 @@ msgstr ""
msgid "Connection Lost"
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:14
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:12
#: lib/block_scout_web/templates/block/index.html.eex:5
#, elixir-autogen, elixir-format
msgid "Connection Lost, click to load newer blocks"
msgstr ""
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:17
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:15
#, elixir-autogen, elixir-format
msgid "Connection Lost, click to load newer internal transactions"
msgstr ""
#: lib/block_scout_web/templates/address_transaction/index.html.eex:13
#: lib/block_scout_web/templates/address_transaction/index.html.eex:11
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:16
#: lib/block_scout_web/templates/transaction/index.html.eex:22
#, elixir-autogen, elixir-format
msgid "Connection Lost, click to load newer transactions"
msgstr ""
#: lib/block_scout_web/templates/address_validation/index.html.eex:12
#: lib/block_scout_web/templates/address_validation/index.html.eex:10
#, elixir-autogen, elixir-format
msgid "Connection Lost, click to load newer validations"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:92
#: lib/block_scout_web/templates/address_contract/index.html.eex:90
#, elixir-autogen, elixir-format
msgid "Constructor Arguments"
msgstr ""
@ -506,7 +506,7 @@ msgstr ""
msgid "Contract"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:124
#: lib/block_scout_web/templates/address_contract/index.html.eex:122
#, elixir-autogen, elixir-format
msgid "Contract ABI"
msgstr ""
@ -524,18 +524,18 @@ msgstr ""
msgid "Contract Address Pending"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:459
#: lib/block_scout_web/views/transaction_view.ex:458
#, elixir-autogen, elixir-format
msgid "Contract Call"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:456
#: lib/block_scout_web/views/transaction_view.ex:455
#, elixir-autogen, elixir-format
msgid "Contract Creation"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:140
#: lib/block_scout_web/templates/address_contract/index.html.eex:155
#: lib/block_scout_web/templates/address_contract/index.html.eex:138
#: lib/block_scout_web/templates/address_contract/index.html.eex:153
#, elixir-autogen, elixir-format
msgid "Contract Creation Code"
msgstr ""
@ -546,29 +546,29 @@ msgstr ""
msgid "Contract Libraries"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:76
#: lib/block_scout_web/templates/address/overview.html.eex:75
#: lib/block_scout_web/templates/address_contract_verification_common_fields/_contract_name_field.html.eex:3
#, elixir-autogen, elixir-format
msgid "Contract Name"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:27
#: lib/block_scout_web/templates/address_contract/index.html.eex:25
#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:11
#, elixir-autogen, elixir-format
msgid "Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:59
#: lib/block_scout_web/templates/address_contract/index.html.eex:57
#, elixir-autogen, elixir-format
msgid "Contract name:"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:102
#: lib/block_scout_web/templates/address_contract/index.html.eex:100
#, elixir-autogen, elixir-format
msgid "Contract source code"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:146
#: lib/block_scout_web/templates/address_contract/index.html.eex:144
#, elixir-autogen, elixir-format
msgid "Contracts that self destruct in their constructors have no contract code published and cannot be verified."
msgstr ""
@ -578,35 +578,37 @@ msgstr ""
msgid "Contribute"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:126
#: lib/block_scout_web/templates/address_contract/index.html.eex:124
#, elixir-autogen, elixir-format
msgid "Copy ABI"
msgstr ""
#: lib/block_scout_web/templates/account/tag_address/row.html.eex:7
#: lib/block_scout_web/templates/account/tag_address/row.html.eex:7
#: lib/block_scout_web/templates/account/watchlist_address/row.html.eex:7
#: lib/block_scout_web/templates/address/overview.html.eex:38
#: lib/block_scout_web/templates/address/overview.html.eex:39
#: lib/block_scout_web/templates/address/overview.html.eex:40
#: lib/block_scout_web/templates/block/overview.html.eex:104
#: lib/block_scout_web/templates/block/overview.html.eex:105
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:43
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:44
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:45
#, elixir-autogen, elixir-format
msgid "Copy Address"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:142
#: lib/block_scout_web/templates/address_contract/index.html.eex:158
#: lib/block_scout_web/templates/address_contract/index.html.eex:140
#: lib/block_scout_web/templates/address_contract/index.html.eex:156
#, elixir-autogen, elixir-format
msgid "Copy Contract Creation Code"
msgstr ""
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:21
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:19
#, elixir-autogen, elixir-format
msgid "Copy Decompiled Contract Code"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:185
#: lib/block_scout_web/templates/address_contract/index.html.eex:195
#: lib/block_scout_web/templates/address_contract/index.html.eex:177
#: lib/block_scout_web/templates/address_contract/index.html.eex:187
#, elixir-autogen, elixir-format
msgid "Copy Deployed ByteCode"
msgstr ""
@ -642,8 +644,8 @@ msgstr ""
msgid "Copy Raw Trace"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:104
#: lib/block_scout_web/templates/address_contract/index.html.eex:115
#: lib/block_scout_web/templates/address_contract/index.html.eex:102
#: lib/block_scout_web/templates/address_contract/index.html.eex:113
#, elixir-autogen, elixir-format
msgid "Copy Source Code"
msgstr ""
@ -703,7 +705,7 @@ msgstr ""
msgid "Create2"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:103
#: lib/block_scout_web/templates/address/overview.html.eex:102
#, elixir-autogen, elixir-format
msgid "Creator"
msgstr ""
@ -743,7 +745,7 @@ msgid "Date & time of transaction inclusion, including length of time for confir
msgstr ""
#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:52
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:132
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:131
#, elixir-autogen, elixir-format
msgid "Decimals"
msgstr ""
@ -769,12 +771,12 @@ msgstr ""
msgid "Decompiled code"
msgstr ""
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:19
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:17
#, elixir-autogen, elixir-format
msgid "Decompiled contract code"
msgstr ""
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:12
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:10
#, elixir-autogen, elixir-format
msgid "Decompiler version"
msgstr ""
@ -784,8 +786,8 @@ msgstr ""
msgid "Delegate Call"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:175
#: lib/block_scout_web/templates/address_contract/index.html.eex:183
#: lib/block_scout_web/templates/address_contract/index.html.eex:191
#, elixir-autogen, elixir-format
msgid "Deployed ByteCode"
msgstr ""
@ -798,7 +800,7 @@ msgstr ""
msgid "Description"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:31
#: lib/block_scout_web/templates/address/overview.html.eex:30
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:166
#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:127
#, elixir-autogen, elixir-format
@ -810,7 +812,7 @@ msgstr ""
msgid "Difficulty"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:147
#: lib/block_scout_web/templates/address_contract/index.html.eex:145
#, elixir-autogen, elixir-format
msgid "Displaying the init data provided of the creating transaction."
msgstr ""
@ -845,17 +847,17 @@ msgstr ""
msgid "EIP-1167"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:216
#: lib/block_scout_web/views/transaction_view.ex:215
#, elixir-autogen, elixir-format
msgid "ERC-1155 "
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:214
#: lib/block_scout_web/views/transaction_view.ex:213
#, elixir-autogen, elixir-format
msgid "ERC-20 "
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:215
#: lib/block_scout_web/views/transaction_view.ex:214
#, elixir-autogen, elixir-format
msgid "ERC-721 "
msgstr ""
@ -873,7 +875,7 @@ msgstr ""
msgid "ETH RPC API Documentation"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:78
#: lib/block_scout_web/templates/address_contract/index.html.eex:76
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:26
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:22
#, elixir-autogen, elixir-format
@ -926,17 +928,17 @@ msgstr ""
msgid "Error trying to fetch balances."
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:355
#: lib/block_scout_web/views/transaction_view.ex:354
#, elixir-autogen, elixir-format
msgid "Error: %{reason}"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:353
#: lib/block_scout_web/views/transaction_view.ex:352
#, elixir-autogen, elixir-format
msgid "Error: (Awaiting internal transactions for reason)"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:120
#: lib/block_scout_web/templates/address/overview.html.eex:119
#, elixir-autogen, elixir-format
msgid "Error: Could not determine contract creator."
msgstr ""
@ -946,8 +948,8 @@ msgstr ""
msgid "Eth RPC"
msgstr ""
#: lib/block_scout_web/templates/account/watchlist_address/edit.html.eex:37
#: lib/block_scout_web/templates/account/watchlist_address/new.html.eex:35
#: lib/block_scout_web/templates/account/watchlist_address/edit.html.eex:27
#: lib/block_scout_web/templates/account/watchlist_address/new.html.eex:25
#: lib/block_scout_web/templates/account/watchlist_address/row.html.eex:21
#: lib/block_scout_web/templates/address/_current_coin_balance.html.eex:11
#: lib/block_scout_web/templates/address/index.html.eex:5
@ -986,7 +988,7 @@ msgstr ""
msgid "Export Data"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:226
#: lib/block_scout_web/templates/address_contract/index.html.eex:212
#, elixir-autogen, elixir-format
msgid "External libraries"
msgstr ""
@ -1012,7 +1014,7 @@ msgstr ""
msgid "Fetching gas used..."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:113
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:112
#, elixir-autogen, elixir-format
msgid "Fetching holders..."
msgstr ""
@ -1143,7 +1145,7 @@ msgstr ""
msgid "Hex (Default)"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:109
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:108
#, elixir-autogen, elixir-format
msgid "Holders"
msgstr ""
@ -1220,11 +1222,11 @@ msgid "Internal Transaction"
msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:28
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:19
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:17
#: 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:361
#: lib/block_scout_web/views/transaction_view.ex:514
#: lib/block_scout_web/views/transaction_view.ex:513
#, elixir-autogen, elixir-format
msgid "Internal Transactions"
msgstr ""
@ -1296,7 +1298,7 @@ msgstr ""
msgid "List of token transferred in the transaction."
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:20
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:18
#, elixir-autogen, elixir-format
msgid "Loading chart..."
msgstr ""
@ -1307,10 +1309,10 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:133
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:49
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:45
#: lib/block_scout_web/templates/address_read_contract/index.html.eex:14
#: lib/block_scout_web/templates/address_read_proxy/index.html.eex:14
#: lib/block_scout_web/templates/address_write_contract/index.html.eex:14
#: lib/block_scout_web/templates/address_write_proxy/index.html.eex:14
#: lib/block_scout_web/templates/address_read_contract/index.html.eex:12
#: lib/block_scout_web/templates/address_read_proxy/index.html.eex:12
#: lib/block_scout_web/templates/address_write_contract/index.html.eex:12
#: lib/block_scout_web/templates/address_write_proxy/index.html.eex:12
#: lib/block_scout_web/templates/tokens/contract/index.html.eex:17
#, elixir-autogen, elixir-format
msgid "Loading..."
@ -1327,11 +1329,11 @@ msgid "Log Index"
msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:41
#: lib/block_scout_web/templates/address_logs/index.html.eex:12
#: lib/block_scout_web/templates/address_logs/index.html.eex:10
#: 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:372
#: lib/block_scout_web/views/transaction_view.ex:515
#: lib/block_scout_web/views/transaction_view.ex:514
#, elixir-autogen, elixir-format
msgid "Logs"
msgstr ""
@ -1343,7 +1345,7 @@ msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:52
#: lib/block_scout_web/templates/layout/app.html.eex:46
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:85
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:84
#: lib/block_scout_web/views/address_view.ex:142
#, elixir-autogen, elixir-format
msgid "Market Cap"
@ -1359,7 +1361,7 @@ msgstr ""
msgid "Max Priority Fee per Gas"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:321
#: lib/block_scout_web/views/transaction_view.ex:320
#, elixir-autogen, elixir-format
msgid "Max of"
msgstr ""
@ -1419,12 +1421,12 @@ msgstr ""
msgid "Module"
msgstr ""
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:14
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:12
#, elixir-autogen, elixir-format
msgid "More internal transactions have come in"
msgstr ""
#: lib/block_scout_web/templates/address_transaction/index.html.eex:48
#: lib/block_scout_web/templates/address_transaction/index.html.eex:46
#: lib/block_scout_web/templates/chain/show.html.eex:216
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:13
#: lib/block_scout_web/templates/transaction/index.html.eex:19
@ -1502,7 +1504,7 @@ msgstr ""
msgid "Not unique Token"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:108
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:107
#, elixir-autogen, elixir-format
msgid "Number of accounts holding the token"
msgstr ""
@ -1512,7 +1514,7 @@ msgstr ""
msgid "Number of blocks validated by this validator."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:131
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:130
#, elixir-autogen, elixir-format
msgid "Number of digits that come after the decimal place when displaying token value"
msgstr ""
@ -1522,7 +1524,7 @@ msgstr ""
msgid "Number of transactions related to this address."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:119
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:118
#, elixir-autogen, elixir-format
msgid "Number of transfers for the token"
msgstr ""
@ -1543,12 +1545,12 @@ msgstr ""
msgid "Only the first"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:63
#: lib/block_scout_web/templates/address_contract/index.html.eex:61
#, elixir-autogen, elixir-format
msgid "Optimization enabled"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:72
#: lib/block_scout_web/templates/address_contract/index.html.eex:70
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:58
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:54
#, elixir-autogen, elixir-format
@ -1628,12 +1630,12 @@ msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:41
#: lib/block_scout_web/templates/layout/app.html.eex:47
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:96
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:95
#, elixir-autogen, elixir-format
msgid "Price"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:95
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:94
#, elixir-autogen, elixir-format
msgid "Price per token on the exchanges"
msgstr ""
@ -1678,7 +1680,7 @@ msgstr ""
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:24
#: lib/block_scout_web/templates/transaction_raw_trace/index.html.eex:7
#: lib/block_scout_web/views/transaction_view.ex:516
#: lib/block_scout_web/views/transaction_view.ex:515
#, elixir-autogen, elixir-format
msgid "Raw Trace"
msgstr ""
@ -1751,7 +1753,7 @@ msgstr ""
msgid "Run"
msgstr ""
#: lib/block_scout_web/templates/address_logs/index.html.eex:18
#: lib/block_scout_web/templates/address_logs/index.html.eex:16
#: lib/block_scout_web/templates/layout/_search.html.eex:34
#, elixir-autogen, elixir-format
msgid "Search"
@ -1897,7 +1899,7 @@ msgid "Submit an Issue"
msgstr ""
#: lib/block_scout_web/templates/transaction/_emission_reward_tile.html.eex:8
#: lib/block_scout_web/views/transaction_view.ex:352
#: lib/block_scout_web/views/transaction_view.ex:351
#, elixir-autogen, elixir-format
msgid "Success"
msgstr ""
@ -1938,12 +1940,12 @@ msgstr ""
msgid "The hash of the block from which this block was generated."
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:75
#: lib/block_scout_web/templates/address/overview.html.eex:74
#, elixir-autogen, elixir-format
msgid "The name found in the source code of the Contract."
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:86
#: lib/block_scout_web/templates/address/overview.html.eex:85
#, elixir-autogen, elixir-format
msgid "The name of the validator."
msgstr ""
@ -1968,7 +1970,7 @@ msgstr ""
msgid "The status of the transaction: Confirmed or Unconfirmed."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:69
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:68
#, elixir-autogen, elixir-format
msgid "The total amount of tokens issued"
msgstr ""
@ -1978,7 +1980,7 @@ msgstr ""
msgid "The total gas amount used in the block and its percentage of gas filled in the block."
msgstr ""
#: lib/block_scout_web/templates/address_validation/index.html.eex:18
#: lib/block_scout_web/templates/address_validation/index.html.eex:16
#, elixir-autogen, elixir-format
msgid "There are no blocks validated by this address."
msgstr ""
@ -1993,7 +1995,7 @@ msgstr ""
msgid "There are no holders for this Token."
msgstr ""
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:56
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:54
#, elixir-autogen, elixir-format
msgid "There are no internal transactions for this address."
msgstr ""
@ -2003,7 +2005,7 @@ msgstr ""
msgid "There are no internal transactions for this transaction."
msgstr ""
#: lib/block_scout_web/templates/address_logs/index.html.eex:30
#: lib/block_scout_web/templates/address_logs/index.html.eex:28
#, elixir-autogen, elixir-format
msgid "There are no logs for this address."
msgstr ""
@ -2018,7 +2020,7 @@ msgstr ""
msgid "There are no pending transactions."
msgstr ""
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:55
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:53
#, elixir-autogen, elixir-format
msgid "There are no token transfers for this address."
msgstr ""
@ -2028,7 +2030,7 @@ msgstr ""
msgid "There are no token transfers for this transaction"
msgstr ""
#: lib/block_scout_web/templates/address_token/index.html.eex:67
#: lib/block_scout_web/templates/address_token/index.html.eex:65
#, elixir-autogen, elixir-format
msgid "There are no tokens for this address."
msgstr ""
@ -2038,7 +2040,7 @@ msgstr ""
msgid "There are no tokens."
msgstr ""
#: lib/block_scout_web/templates/address_transaction/index.html.eex:57
#: lib/block_scout_web/templates/address_transaction/index.html.eex:55
#, elixir-autogen, elixir-format
msgid "There are no transactions for this address."
msgstr ""
@ -2060,17 +2062,17 @@ msgstr ""
msgid "There are no transfers for this Token."
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:37
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:35
#, elixir-autogen, elixir-format
msgid "There is no coin history for this address."
msgstr ""
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:31
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:29
#, elixir-autogen, elixir-format
msgid "There is no decompilded contracts for this address."
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:23
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:21
#: lib/block_scout_web/templates/chain/show.html.eex:9
#, elixir-autogen, elixir-format
msgid "There was a problem loading the chart."
@ -2091,12 +2093,12 @@ msgstr ""
msgid "This block has not been processed yet."
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:43
#: lib/block_scout_web/templates/address_contract/index.html.eex:41
#, elixir-autogen, elixir-format
msgid "This contract has been partially verified via Sourcify."
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:47
#: lib/block_scout_web/templates/address_contract/index.html.eex:45
#, elixir-autogen, elixir-format
msgid "This contract has been verified via Sourcify."
msgstr ""
@ -2145,25 +2147,25 @@ msgstr ""
msgid "Toggle navigation"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:56
#: lib/block_scout_web/templates/address/overview.html.eex:55
#, elixir-autogen, elixir-format
msgid "Token"
msgstr ""
#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:3
#: lib/block_scout_web/views/transaction_view.ex:450
#: lib/block_scout_web/views/transaction_view.ex:449
#, elixir-autogen, elixir-format
msgid "Token Burning"
msgstr ""
#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:7
#: lib/block_scout_web/views/transaction_view.ex:451
#: lib/block_scout_web/views/transaction_view.ex:450
#, elixir-autogen, elixir-format
msgid "Token Creation"
msgstr ""
#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:10
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:35
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:34
#, elixir-autogen, elixir-format
msgid "Token Details"
msgstr ""
@ -2185,20 +2187,20 @@ msgid "Token ID"
msgstr ""
#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:5
#: lib/block_scout_web/views/transaction_view.ex:449
#: lib/block_scout_web/views/transaction_view.ex:448
#, elixir-autogen, elixir-format
msgid "Token Minting"
msgstr ""
#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:9
#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:11
#: lib/block_scout_web/views/transaction_view.ex:452
#: lib/block_scout_web/views/transaction_view.ex:451
#, elixir-autogen, elixir-format
msgid "Token Transfer"
msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:13
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:21
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:19
#: lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:3
#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:16
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:5
@ -2208,17 +2210,17 @@ msgstr ""
#: lib/block_scout_web/views/address_view.ex:363
#: lib/block_scout_web/views/tokens/instance/overview_view.ex:195
#: lib/block_scout_web/views/tokens/overview_view.ex:39
#: lib/block_scout_web/views/transaction_view.ex:513
#: lib/block_scout_web/views/transaction_view.ex:512
#, elixir-autogen, elixir-format
msgid "Token Transfers"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:55
#: lib/block_scout_web/templates/address/overview.html.eex:54
#, elixir-autogen, elixir-format
msgid "Token name and symbol."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:143
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:142
#, elixir-autogen, elixir-format
msgid "Token type"
msgstr ""
@ -2259,7 +2261,7 @@ msgstr ""
msgid "Top Accounts - %{subnetwork} Explorer"
msgstr ""
#: lib/block_scout_web/templates/address_logs/index.html.eex:16
#: lib/block_scout_web/templates/address_logs/index.html.eex:14
#, elixir-autogen, elixir-format
msgid "Topic"
msgstr ""
@ -2275,7 +2277,7 @@ msgstr ""
msgid "Total Difficulty"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:84
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:83
#, elixir-autogen, elixir-format
msgid "Total Supply * Price"
msgstr ""
@ -2295,7 +2297,7 @@ msgstr ""
msgid "Total gas limit provided by all transactions in the block."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:70
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:69
#, elixir-autogen, elixir-format
msgid "Total supply"
msgstr ""
@ -2311,7 +2313,7 @@ msgid "Total transactions"
msgstr ""
#: lib/block_scout_web/templates/address_logs/_logs.html.eex:19
#: lib/block_scout_web/views/transaction_view.ex:462
#: lib/block_scout_web/views/transaction_view.ex:461
#, elixir-autogen, elixir-format
msgid "Transaction"
msgstr ""
@ -2381,7 +2383,7 @@ msgstr ""
msgid "Transactions"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:102
#: lib/block_scout_web/templates/address/overview.html.eex:101
#, elixir-autogen, elixir-format
msgid "Transactions and address of creation."
msgstr ""
@ -2395,7 +2397,7 @@ msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:237
#: lib/block_scout_web/templates/address/overview.html.eex:245
#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:50
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:120
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:119
#, elixir-autogen, elixir-format
msgid "Transfers"
msgstr ""
@ -2422,7 +2424,7 @@ msgstr ""
msgid "Type"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:142
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:141
#, elixir-autogen, elixir-format
msgid "Type of the token standard"
msgstr ""
@ -2443,7 +2445,7 @@ msgstr ""
msgid "Uncles"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:343
#: lib/block_scout_web/views/transaction_view.ex:342
#, elixir-autogen, elixir-format
msgid "Unconfirmed"
msgstr ""
@ -2493,7 +2495,7 @@ msgstr ""
msgid "Validator Data"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:87
#: lib/block_scout_web/templates/address/overview.html.eex:86
#, elixir-autogen, elixir-format
msgid "Validator Name"
msgstr ""
@ -2508,17 +2510,15 @@ msgstr ""
msgid "Value sent in the native token (and USD) if applicable."
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:84
#: lib/block_scout_web/templates/address_contract/index.html.eex:82
#, elixir-autogen, elixir-format
msgid "Verified at"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:27
#: lib/block_scout_web/templates/address_contract/index.html.eex:29
#: lib/block_scout_web/templates/address_contract/index.html.eex:31
#: lib/block_scout_web/templates/address_contract/index.html.eex:162
#: lib/block_scout_web/templates/address_contract/index.html.eex:168
#: lib/block_scout_web/templates/address_contract/index.html.eex:199
#: lib/block_scout_web/templates/address_contract/index.html.eex:205
#: lib/block_scout_web/templates/address_contract/index.html.eex:161
#: lib/block_scout_web/templates/address_contract/index.html.eex:192
#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:14
#, elixir-autogen, elixir-format
msgid "Verify & Publish"
@ -2673,7 +2673,7 @@ msgstr ""
msgid "Yes"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:112
#: lib/block_scout_web/templates/address/overview.html.eex:111
#, elixir-autogen, elixir-format
msgid "at"
msgstr ""
@ -2693,7 +2693,7 @@ msgstr ""
msgid "burned from transactions included in the block (Base fee (per unit of gas) * Gas Used)."
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:29
#: lib/block_scout_web/templates/address_contract/index.html.eex:27
#, elixir-autogen, elixir-format
msgid "button"
msgstr ""

@ -63,7 +63,7 @@ msgstr ""
msgid "%{subnetwork} Explorer - BlockScout"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:351
#: lib/block_scout_web/views/transaction_view.ex:350
#, elixir-autogen, elixir-format
msgid "(Awaiting internal transactions for status)"
msgstr ""
@ -189,7 +189,7 @@ msgstr ""
msgid "All functions displayed below are from ABI of that contract. In order to verify current contract, proceed with"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:29
#: lib/block_scout_web/templates/address_contract/index.html.eex:27
#, elixir-autogen, elixir-format
msgid "All metadata displayed below is from that contract. In order to verify current contract, click"
msgstr ""
@ -241,7 +241,7 @@ msgstr ""
msgid "Balance"
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:16
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:14
#, elixir-autogen, elixir-format
msgid "Balances"
msgstr ""
@ -296,7 +296,7 @@ msgstr ""
msgid "Block Mined, awaiting import..."
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:35
#: lib/block_scout_web/views/transaction_view.ex:34
#, elixir-autogen, elixir-format
msgid "Block Pending"
msgstr ""
@ -441,12 +441,12 @@ msgstr ""
msgid "Compiler"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:67
#: lib/block_scout_web/templates/address_contract/index.html.eex:65
#, elixir-autogen, elixir-format
msgid "Compiler version"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:344
#: lib/block_scout_web/views/transaction_view.ex:343
#, elixir-autogen, elixir-format
msgid "Confirmed"
msgstr ""
@ -472,30 +472,30 @@ msgstr ""
msgid "Connection Lost"
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:14
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:12
#: lib/block_scout_web/templates/block/index.html.eex:5
#, elixir-autogen, elixir-format
msgid "Connection Lost, click to load newer blocks"
msgstr ""
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:17
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:15
#, elixir-autogen, elixir-format
msgid "Connection Lost, click to load newer internal transactions"
msgstr ""
#: lib/block_scout_web/templates/address_transaction/index.html.eex:13
#: lib/block_scout_web/templates/address_transaction/index.html.eex:11
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:16
#: lib/block_scout_web/templates/transaction/index.html.eex:22
#, elixir-autogen, elixir-format
msgid "Connection Lost, click to load newer transactions"
msgstr ""
#: lib/block_scout_web/templates/address_validation/index.html.eex:12
#: lib/block_scout_web/templates/address_validation/index.html.eex:10
#, elixir-autogen, elixir-format
msgid "Connection Lost, click to load newer validations"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:92
#: lib/block_scout_web/templates/address_contract/index.html.eex:90
#, elixir-autogen, elixir-format
msgid "Constructor Arguments"
msgstr ""
@ -506,7 +506,7 @@ msgstr ""
msgid "Contract"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:124
#: lib/block_scout_web/templates/address_contract/index.html.eex:122
#, elixir-autogen, elixir-format
msgid "Contract ABI"
msgstr ""
@ -524,18 +524,18 @@ msgstr ""
msgid "Contract Address Pending"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:459
#: lib/block_scout_web/views/transaction_view.ex:458
#, elixir-autogen, elixir-format
msgid "Contract Call"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:456
#: lib/block_scout_web/views/transaction_view.ex:455
#, elixir-autogen, elixir-format
msgid "Contract Creation"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:140
#: lib/block_scout_web/templates/address_contract/index.html.eex:155
#: lib/block_scout_web/templates/address_contract/index.html.eex:138
#: lib/block_scout_web/templates/address_contract/index.html.eex:153
#, elixir-autogen, elixir-format
msgid "Contract Creation Code"
msgstr ""
@ -546,29 +546,29 @@ msgstr ""
msgid "Contract Libraries"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:76
#: lib/block_scout_web/templates/address/overview.html.eex:75
#: lib/block_scout_web/templates/address_contract_verification_common_fields/_contract_name_field.html.eex:3
#, elixir-autogen, elixir-format
msgid "Contract Name"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:27
#: lib/block_scout_web/templates/address_contract/index.html.eex:25
#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:11
#, elixir-autogen, elixir-format
msgid "Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:59
#: lib/block_scout_web/templates/address_contract/index.html.eex:57
#, elixir-autogen, elixir-format
msgid "Contract name:"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:102
#: lib/block_scout_web/templates/address_contract/index.html.eex:100
#, elixir-autogen, elixir-format
msgid "Contract source code"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:146
#: lib/block_scout_web/templates/address_contract/index.html.eex:144
#, elixir-autogen, elixir-format
msgid "Contracts that self destruct in their constructors have no contract code published and cannot be verified."
msgstr ""
@ -578,35 +578,37 @@ msgstr ""
msgid "Contribute"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:126
#: lib/block_scout_web/templates/address_contract/index.html.eex:124
#, elixir-autogen, elixir-format
msgid "Copy ABI"
msgstr ""
#: lib/block_scout_web/templates/account/tag_address/row.html.eex:7
#: lib/block_scout_web/templates/account/tag_address/row.html.eex:7
#: lib/block_scout_web/templates/account/watchlist_address/row.html.eex:7
#: lib/block_scout_web/templates/address/overview.html.eex:38
#: lib/block_scout_web/templates/address/overview.html.eex:39
#: lib/block_scout_web/templates/address/overview.html.eex:40
#: lib/block_scout_web/templates/block/overview.html.eex:104
#: lib/block_scout_web/templates/block/overview.html.eex:105
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:43
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:44
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:45
#, elixir-autogen, elixir-format
msgid "Copy Address"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:142
#: lib/block_scout_web/templates/address_contract/index.html.eex:158
#: lib/block_scout_web/templates/address_contract/index.html.eex:140
#: lib/block_scout_web/templates/address_contract/index.html.eex:156
#, elixir-autogen, elixir-format
msgid "Copy Contract Creation Code"
msgstr ""
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:21
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:19
#, elixir-autogen, elixir-format
msgid "Copy Decompiled Contract Code"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:185
#: lib/block_scout_web/templates/address_contract/index.html.eex:195
#: lib/block_scout_web/templates/address_contract/index.html.eex:177
#: lib/block_scout_web/templates/address_contract/index.html.eex:187
#, elixir-autogen, elixir-format
msgid "Copy Deployed ByteCode"
msgstr ""
@ -642,8 +644,8 @@ msgstr ""
msgid "Copy Raw Trace"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:104
#: lib/block_scout_web/templates/address_contract/index.html.eex:115
#: lib/block_scout_web/templates/address_contract/index.html.eex:102
#: lib/block_scout_web/templates/address_contract/index.html.eex:113
#, elixir-autogen, elixir-format
msgid "Copy Source Code"
msgstr ""
@ -703,7 +705,7 @@ msgstr ""
msgid "Create2"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:103
#: lib/block_scout_web/templates/address/overview.html.eex:102
#, elixir-autogen, elixir-format
msgid "Creator"
msgstr ""
@ -743,7 +745,7 @@ msgid "Date & time of transaction inclusion, including length of time for confir
msgstr ""
#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:52
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:132
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:131
#, elixir-autogen, elixir-format
msgid "Decimals"
msgstr ""
@ -769,12 +771,12 @@ msgstr ""
msgid "Decompiled code"
msgstr ""
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:19
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:17
#, elixir-autogen, elixir-format
msgid "Decompiled contract code"
msgstr ""
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:12
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:10
#, elixir-autogen, elixir-format
msgid "Decompiler version"
msgstr ""
@ -784,8 +786,8 @@ msgstr ""
msgid "Delegate Call"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:175
#: lib/block_scout_web/templates/address_contract/index.html.eex:183
#: lib/block_scout_web/templates/address_contract/index.html.eex:191
#, elixir-autogen, elixir-format
msgid "Deployed ByteCode"
msgstr ""
@ -798,7 +800,7 @@ msgstr ""
msgid "Description"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:31
#: lib/block_scout_web/templates/address/overview.html.eex:30
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:166
#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:127
#, elixir-autogen, elixir-format
@ -810,7 +812,7 @@ msgstr ""
msgid "Difficulty"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:147
#: lib/block_scout_web/templates/address_contract/index.html.eex:145
#, elixir-autogen, elixir-format
msgid "Displaying the init data provided of the creating transaction."
msgstr ""
@ -845,17 +847,17 @@ msgstr ""
msgid "EIP-1167"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:216
#: lib/block_scout_web/views/transaction_view.ex:215
#, elixir-autogen, elixir-format
msgid "ERC-1155 "
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:214
#: lib/block_scout_web/views/transaction_view.ex:213
#, elixir-autogen, elixir-format
msgid "ERC-20 "
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:215
#: lib/block_scout_web/views/transaction_view.ex:214
#, elixir-autogen, elixir-format
msgid "ERC-721 "
msgstr ""
@ -873,7 +875,7 @@ msgstr ""
msgid "ETH RPC API Documentation"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:78
#: lib/block_scout_web/templates/address_contract/index.html.eex:76
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:26
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:22
#, elixir-autogen, elixir-format
@ -926,17 +928,17 @@ msgstr ""
msgid "Error trying to fetch balances."
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:355
#: lib/block_scout_web/views/transaction_view.ex:354
#, elixir-autogen, elixir-format
msgid "Error: %{reason}"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:353
#: lib/block_scout_web/views/transaction_view.ex:352
#, elixir-autogen, elixir-format
msgid "Error: (Awaiting internal transactions for reason)"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:120
#: lib/block_scout_web/templates/address/overview.html.eex:119
#, elixir-autogen, elixir-format
msgid "Error: Could not determine contract creator."
msgstr ""
@ -946,8 +948,8 @@ msgstr ""
msgid "Eth RPC"
msgstr ""
#: lib/block_scout_web/templates/account/watchlist_address/edit.html.eex:37
#: lib/block_scout_web/templates/account/watchlist_address/new.html.eex:35
#: lib/block_scout_web/templates/account/watchlist_address/edit.html.eex:27
#: lib/block_scout_web/templates/account/watchlist_address/new.html.eex:25
#: lib/block_scout_web/templates/account/watchlist_address/row.html.eex:21
#: lib/block_scout_web/templates/address/_current_coin_balance.html.eex:11
#: lib/block_scout_web/templates/address/index.html.eex:5
@ -986,7 +988,7 @@ msgstr ""
msgid "Export Data"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:226
#: lib/block_scout_web/templates/address_contract/index.html.eex:212
#, elixir-autogen, elixir-format
msgid "External libraries"
msgstr ""
@ -1012,7 +1014,7 @@ msgstr ""
msgid "Fetching gas used..."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:113
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:112
#, elixir-autogen, elixir-format
msgid "Fetching holders..."
msgstr ""
@ -1143,7 +1145,7 @@ msgstr ""
msgid "Hex (Default)"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:109
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:108
#, elixir-autogen, elixir-format
msgid "Holders"
msgstr ""
@ -1220,11 +1222,11 @@ msgid "Internal Transaction"
msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:28
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:19
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:17
#: 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:361
#: lib/block_scout_web/views/transaction_view.ex:514
#: lib/block_scout_web/views/transaction_view.ex:513
#, elixir-autogen, elixir-format
msgid "Internal Transactions"
msgstr ""
@ -1296,7 +1298,7 @@ msgstr ""
msgid "List of token transferred in the transaction."
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:20
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:18
#, elixir-autogen, elixir-format
msgid "Loading chart..."
msgstr ""
@ -1307,10 +1309,10 @@ msgstr ""
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:133
#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:49
#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:45
#: lib/block_scout_web/templates/address_read_contract/index.html.eex:14
#: lib/block_scout_web/templates/address_read_proxy/index.html.eex:14
#: lib/block_scout_web/templates/address_write_contract/index.html.eex:14
#: lib/block_scout_web/templates/address_write_proxy/index.html.eex:14
#: lib/block_scout_web/templates/address_read_contract/index.html.eex:12
#: lib/block_scout_web/templates/address_read_proxy/index.html.eex:12
#: lib/block_scout_web/templates/address_write_contract/index.html.eex:12
#: lib/block_scout_web/templates/address_write_proxy/index.html.eex:12
#: lib/block_scout_web/templates/tokens/contract/index.html.eex:17
#, elixir-autogen, elixir-format
msgid "Loading..."
@ -1327,11 +1329,11 @@ msgid "Log Index"
msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:41
#: lib/block_scout_web/templates/address_logs/index.html.eex:12
#: lib/block_scout_web/templates/address_logs/index.html.eex:10
#: 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:372
#: lib/block_scout_web/views/transaction_view.ex:515
#: lib/block_scout_web/views/transaction_view.ex:514
#, elixir-autogen, elixir-format
msgid "Logs"
msgstr ""
@ -1343,7 +1345,7 @@ msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:52
#: lib/block_scout_web/templates/layout/app.html.eex:46
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:85
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:84
#: lib/block_scout_web/views/address_view.ex:142
#, elixir-autogen, elixir-format
msgid "Market Cap"
@ -1359,7 +1361,7 @@ msgstr ""
msgid "Max Priority Fee per Gas"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:321
#: lib/block_scout_web/views/transaction_view.ex:320
#, elixir-autogen, elixir-format
msgid "Max of"
msgstr ""
@ -1419,12 +1421,12 @@ msgstr ""
msgid "Module"
msgstr ""
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:14
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:12
#, elixir-autogen, elixir-format
msgid "More internal transactions have come in"
msgstr ""
#: lib/block_scout_web/templates/address_transaction/index.html.eex:48
#: lib/block_scout_web/templates/address_transaction/index.html.eex:46
#: lib/block_scout_web/templates/chain/show.html.eex:216
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:13
#: lib/block_scout_web/templates/transaction/index.html.eex:19
@ -1502,7 +1504,7 @@ msgstr ""
msgid "Not unique Token"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:108
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:107
#, elixir-autogen, elixir-format
msgid "Number of accounts holding the token"
msgstr ""
@ -1512,7 +1514,7 @@ msgstr ""
msgid "Number of blocks validated by this validator."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:131
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:130
#, elixir-autogen, elixir-format
msgid "Number of digits that come after the decimal place when displaying token value"
msgstr ""
@ -1522,7 +1524,7 @@ msgstr ""
msgid "Number of transactions related to this address."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:119
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:118
#, elixir-autogen, elixir-format
msgid "Number of transfers for the token"
msgstr ""
@ -1543,12 +1545,12 @@ msgstr ""
msgid "Only the first"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:63
#: lib/block_scout_web/templates/address_contract/index.html.eex:61
#, elixir-autogen, elixir-format
msgid "Optimization enabled"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:72
#: lib/block_scout_web/templates/address_contract/index.html.eex:70
#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:58
#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:54
#, elixir-autogen, elixir-format
@ -1628,12 +1630,12 @@ msgstr ""
#: lib/block_scout_web/templates/chain/show.html.eex:41
#: lib/block_scout_web/templates/layout/app.html.eex:47
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:96
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:95
#, elixir-autogen, elixir-format
msgid "Price"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:95
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:94
#, elixir-autogen, elixir-format
msgid "Price per token on the exchanges"
msgstr ""
@ -1678,7 +1680,7 @@ msgstr ""
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:24
#: lib/block_scout_web/templates/transaction_raw_trace/index.html.eex:7
#: lib/block_scout_web/views/transaction_view.ex:516
#: lib/block_scout_web/views/transaction_view.ex:515
#, elixir-autogen, elixir-format
msgid "Raw Trace"
msgstr ""
@ -1751,7 +1753,7 @@ msgstr ""
msgid "Run"
msgstr ""
#: lib/block_scout_web/templates/address_logs/index.html.eex:18
#: lib/block_scout_web/templates/address_logs/index.html.eex:16
#: lib/block_scout_web/templates/layout/_search.html.eex:34
#, elixir-autogen, elixir-format
msgid "Search"
@ -1897,7 +1899,7 @@ msgid "Submit an Issue"
msgstr ""
#: lib/block_scout_web/templates/transaction/_emission_reward_tile.html.eex:8
#: lib/block_scout_web/views/transaction_view.ex:352
#: lib/block_scout_web/views/transaction_view.ex:351
#, elixir-autogen, elixir-format
msgid "Success"
msgstr ""
@ -1938,12 +1940,12 @@ msgstr ""
msgid "The hash of the block from which this block was generated."
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:75
#: lib/block_scout_web/templates/address/overview.html.eex:74
#, elixir-autogen, elixir-format
msgid "The name found in the source code of the Contract."
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:86
#: lib/block_scout_web/templates/address/overview.html.eex:85
#, elixir-autogen, elixir-format
msgid "The name of the validator."
msgstr ""
@ -1968,7 +1970,7 @@ msgstr ""
msgid "The status of the transaction: Confirmed or Unconfirmed."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:69
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:68
#, elixir-autogen, elixir-format
msgid "The total amount of tokens issued"
msgstr ""
@ -1978,7 +1980,7 @@ msgstr ""
msgid "The total gas amount used in the block and its percentage of gas filled in the block."
msgstr ""
#: lib/block_scout_web/templates/address_validation/index.html.eex:18
#: lib/block_scout_web/templates/address_validation/index.html.eex:16
#, elixir-autogen, elixir-format
msgid "There are no blocks validated by this address."
msgstr ""
@ -1993,7 +1995,7 @@ msgstr ""
msgid "There are no holders for this Token."
msgstr ""
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:56
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:54
#, elixir-autogen, elixir-format
msgid "There are no internal transactions for this address."
msgstr ""
@ -2003,7 +2005,7 @@ msgstr ""
msgid "There are no internal transactions for this transaction."
msgstr ""
#: lib/block_scout_web/templates/address_logs/index.html.eex:30
#: lib/block_scout_web/templates/address_logs/index.html.eex:28
#, elixir-autogen, elixir-format
msgid "There are no logs for this address."
msgstr ""
@ -2018,7 +2020,7 @@ msgstr ""
msgid "There are no pending transactions."
msgstr ""
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:55
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:53
#, elixir-autogen, elixir-format
msgid "There are no token transfers for this address."
msgstr ""
@ -2028,7 +2030,7 @@ msgstr ""
msgid "There are no token transfers for this transaction"
msgstr ""
#: lib/block_scout_web/templates/address_token/index.html.eex:67
#: lib/block_scout_web/templates/address_token/index.html.eex:65
#, elixir-autogen, elixir-format
msgid "There are no tokens for this address."
msgstr ""
@ -2038,7 +2040,7 @@ msgstr ""
msgid "There are no tokens."
msgstr ""
#: lib/block_scout_web/templates/address_transaction/index.html.eex:57
#: lib/block_scout_web/templates/address_transaction/index.html.eex:55
#, elixir-autogen, elixir-format
msgid "There are no transactions for this address."
msgstr ""
@ -2060,17 +2062,17 @@ msgstr ""
msgid "There are no transfers for this Token."
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:37
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:35
#, elixir-autogen, elixir-format
msgid "There is no coin history for this address."
msgstr ""
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:31
#: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:29
#, elixir-autogen, elixir-format
msgid "There is no decompilded contracts for this address."
msgstr ""
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:23
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:21
#: lib/block_scout_web/templates/chain/show.html.eex:9
#, elixir-autogen, elixir-format
msgid "There was a problem loading the chart."
@ -2091,12 +2093,12 @@ msgstr ""
msgid "This block has not been processed yet."
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:43
#: lib/block_scout_web/templates/address_contract/index.html.eex:41
#, elixir-autogen, elixir-format
msgid "This contract has been partially verified via Sourcify."
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:47
#: lib/block_scout_web/templates/address_contract/index.html.eex:45
#, elixir-autogen, elixir-format
msgid "This contract has been verified via Sourcify."
msgstr ""
@ -2145,25 +2147,25 @@ msgstr ""
msgid "Toggle navigation"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:56
#: lib/block_scout_web/templates/address/overview.html.eex:55
#, elixir-autogen, elixir-format
msgid "Token"
msgstr ""
#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:3
#: lib/block_scout_web/views/transaction_view.ex:450
#: lib/block_scout_web/views/transaction_view.ex:449
#, elixir-autogen, elixir-format
msgid "Token Burning"
msgstr ""
#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:7
#: lib/block_scout_web/views/transaction_view.ex:451
#: lib/block_scout_web/views/transaction_view.ex:450
#, elixir-autogen, elixir-format
msgid "Token Creation"
msgstr ""
#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:10
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:35
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:34
#, elixir-autogen, elixir-format
msgid "Token Details"
msgstr ""
@ -2185,20 +2187,20 @@ msgid "Token ID"
msgstr ""
#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:5
#: lib/block_scout_web/views/transaction_view.ex:449
#: lib/block_scout_web/views/transaction_view.ex:448
#, elixir-autogen, elixir-format
msgid "Token Minting"
msgstr ""
#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:9
#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:11
#: lib/block_scout_web/views/transaction_view.ex:452
#: lib/block_scout_web/views/transaction_view.ex:451
#, elixir-autogen, elixir-format
msgid "Token Transfer"
msgstr ""
#: lib/block_scout_web/templates/address/_tabs.html.eex:13
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:21
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:19
#: lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:3
#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:16
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:5
@ -2208,17 +2210,17 @@ msgstr ""
#: lib/block_scout_web/views/address_view.ex:363
#: lib/block_scout_web/views/tokens/instance/overview_view.ex:195
#: lib/block_scout_web/views/tokens/overview_view.ex:39
#: lib/block_scout_web/views/transaction_view.ex:513
#: lib/block_scout_web/views/transaction_view.ex:512
#, elixir-autogen, elixir-format
msgid "Token Transfers"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:55
#: lib/block_scout_web/templates/address/overview.html.eex:54
#, elixir-autogen, elixir-format
msgid "Token name and symbol."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:143
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:142
#, elixir-autogen, elixir-format
msgid "Token type"
msgstr ""
@ -2259,7 +2261,7 @@ msgstr ""
msgid "Top Accounts - %{subnetwork} Explorer"
msgstr ""
#: lib/block_scout_web/templates/address_logs/index.html.eex:16
#: lib/block_scout_web/templates/address_logs/index.html.eex:14
#, elixir-autogen, elixir-format
msgid "Topic"
msgstr ""
@ -2275,7 +2277,7 @@ msgstr ""
msgid "Total Difficulty"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:84
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:83
#, elixir-autogen, elixir-format
msgid "Total Supply * Price"
msgstr ""
@ -2295,7 +2297,7 @@ msgstr ""
msgid "Total gas limit provided by all transactions in the block."
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:70
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:69
#, elixir-autogen, elixir-format
msgid "Total supply"
msgstr ""
@ -2311,7 +2313,7 @@ msgid "Total transactions"
msgstr ""
#: lib/block_scout_web/templates/address_logs/_logs.html.eex:19
#: lib/block_scout_web/views/transaction_view.ex:462
#: lib/block_scout_web/views/transaction_view.ex:461
#, elixir-autogen, elixir-format
msgid "Transaction"
msgstr ""
@ -2381,7 +2383,7 @@ msgstr ""
msgid "Transactions"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:102
#: lib/block_scout_web/templates/address/overview.html.eex:101
#, elixir-autogen, elixir-format
msgid "Transactions and address of creation."
msgstr ""
@ -2395,7 +2397,7 @@ msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:237
#: lib/block_scout_web/templates/address/overview.html.eex:245
#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:50
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:120
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:119
#, elixir-autogen, elixir-format
msgid "Transfers"
msgstr ""
@ -2422,7 +2424,7 @@ msgstr ""
msgid "Type"
msgstr ""
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:142
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:141
#, elixir-autogen, elixir-format
msgid "Type of the token standard"
msgstr ""
@ -2443,7 +2445,7 @@ msgstr ""
msgid "Uncles"
msgstr ""
#: lib/block_scout_web/views/transaction_view.ex:343
#: lib/block_scout_web/views/transaction_view.ex:342
#, elixir-autogen, elixir-format
msgid "Unconfirmed"
msgstr ""
@ -2493,7 +2495,7 @@ msgstr ""
msgid "Validator Data"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:87
#: lib/block_scout_web/templates/address/overview.html.eex:86
#, elixir-autogen, elixir-format
msgid "Validator Name"
msgstr ""
@ -2508,17 +2510,15 @@ msgstr ""
msgid "Value sent in the native token (and USD) if applicable."
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:84
#: lib/block_scout_web/templates/address_contract/index.html.eex:82
#, elixir-autogen, elixir-format
msgid "Verified at"
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:27
#: lib/block_scout_web/templates/address_contract/index.html.eex:29
#: lib/block_scout_web/templates/address_contract/index.html.eex:31
#: lib/block_scout_web/templates/address_contract/index.html.eex:162
#: lib/block_scout_web/templates/address_contract/index.html.eex:168
#: lib/block_scout_web/templates/address_contract/index.html.eex:199
#: lib/block_scout_web/templates/address_contract/index.html.eex:205
#: lib/block_scout_web/templates/address_contract/index.html.eex:161
#: lib/block_scout_web/templates/address_contract/index.html.eex:192
#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:14
#, elixir-autogen, elixir-format
msgid "Verify & Publish"
@ -2673,7 +2673,7 @@ msgstr ""
msgid "Yes"
msgstr ""
#: lib/block_scout_web/templates/address/overview.html.eex:112
#: lib/block_scout_web/templates/address/overview.html.eex:111
#, elixir-autogen, elixir-format
msgid "at"
msgstr ""
@ -2693,7 +2693,7 @@ msgstr ""
msgid "burned from transactions included in the block (Base fee (per unit of gas) * Gas Used)."
msgstr ""
#: lib/block_scout_web/templates/address_contract/index.html.eex:29
#: lib/block_scout_web/templates/address_contract/index.html.eex:27
#, elixir-autogen, elixir-format
msgid "button"
msgstr ""

@ -5,12 +5,13 @@ defmodule Explorer.Accounts.Identity do
use Ecto.Schema
import Ecto.Changeset
alias Explorer.Accounts.Watchlist
alias Explorer.Accounts.{TagAddress, Watchlist}
schema "account_identities" do
field(:uid, :string)
field(:email, :string)
field(:name, :string)
has_many(:tag_addresses, TagAddress)
has_many(:watchlists, Watchlist)
timestamps()

@ -0,0 +1,32 @@
defmodule Explorer.Accounts.TagAddress do
@moduledoc """
Watchlist is root entity for WatchlistAddresses
"""
use Ecto.Schema
import Ecto.Changeset
alias Explorer.Accounts.Identity
alias Explorer.Chain.{Address, Hash}
schema "account_tag_addresses" do
field(:name, :string)
belongs_to(:identity, Identity)
belongs_to(:address, Address,
foreign_key: :address_hash,
references: :hash,
type: Hash.Address
)
timestamps()
end
@doc false
def changeset(tag, attrs) do
tag
|> cast(attrs, [:name, :identity_id, :address_hash])
|> validate_required([:name, :identity_id, :address_hash])
end
end

@ -30,6 +30,7 @@ defmodule Explorer.ExchangeRates.Token do
volume_24h_usd: Decimal.t()
}
@derive Jason.Encoder
@enforce_keys ~w(available_supply total_supply btc_value id last_updated market_cap_usd name symbol usd_value volume_24h_usd)a
defstruct ~w(available_supply total_supply btc_value id last_updated market_cap_usd name symbol usd_value volume_24h_usd)a

@ -7,7 +7,6 @@ defmodule Explorer.Tags.AddressToTag do
import Ecto.Changeset
alias Explorer.Accounts.WatchlistAddress
alias Explorer.{Chain, Repo}
alias Explorer.Chain.{Address, Hash}
alias Explorer.Tags.{AddressTag, AddressToTag}
@ -66,42 +65,6 @@ defmodule Explorer.Tags.AddressToTag do
|> Repo.all()
end
def get_tags_on_address(address_hash) when is_nil(address_hash), do: []
def get_tags_on_address(address_hash) do
query =
from(
tt in AddressTag,
left_join: att in AddressToTag,
on: tt.id == att.tag_id,
where: att.address_hash == ^address_hash,
where: tt.label != ^"validator",
select: tt
)
query
|> Repo.all()
end
def get_private_tags_on_address(address_hash, _current_user) when is_nil(address_hash), do: []
def get_private_tags_on_address(address_hash, current_user) do
if current_user do
query =
from(
wa in WatchlistAddress,
where: wa.address_hash == ^address_hash,
where: wa.watchlist_id == ^current_user.watchlist_id,
select: %{label: wa.name, display_name: wa.name}
)
query
|> Repo.all()
else
[]
end
end
def set_tag_to_addresses(tag_id, address_hash_string_list) do
current_address_hashes = get_address_hashes_mapped_to_tag(tag_id)

@ -0,0 +1,20 @@
defmodule Explorer.Repo.Migrations.CreateAccountTagAddresses do
use Ecto.Migration
def change do
create table(:account_tag_addresses) do
add(:name, :string)
add(:identity_id, references(:account_identities, on_delete: :delete_all))
add(
:address_hash,
references(:addresses, column: :hash, type: :bytea, on_delete: :delete_all)
)
timestamps()
end
create(index(:account_tag_addresses, [:identity_id]))
create(index(:account_tag_addresses, [:address_hash]))
end
end

@ -374,10 +374,10 @@ ifdef SENDGRID_API_KEY
BLOCKSCOUT_CONTAINER_PARAMS += -e 'SENDGRID_API_KEY=$(SENDGRID_API_KEY)'
endif
ifdef SENDGRID_SENDER
BLOCKSCOUT_CONTAINER_PARAMS += -e 'SENDGRID_API_KEY=$(SENDGRID_SENDER)'
BLOCKSCOUT_CONTAINER_PARAMS += -e 'SENDGRID_SENDER=$(SENDGRID_SENDER)'
endif
ifdef SENDGRID_TEMPLATE
BLOCKSCOUT_CONTAINER_PARAMS += -e 'SENDGRID_API_KEY=$(SENDGRID_TEMPLATE)'
BLOCKSCOUT_CONTAINER_PARAMS += -e 'SENDGRID_TEMPLATE=$(SENDGRID_TEMPLATE)'
endif
ifdef API_RATE_LIMIT

Loading…
Cancel
Save