Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EIP-1967 contract proxy pattern detection fix #3888

Merged
merged 1 commit into from
May 4, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .dialyzer-ignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ lib/indexer/fetcher/token_total_supply_on_demand.ex:16
lib/explorer/exchange_rates/source.ex:110
lib/explorer/exchange_rates/source.ex:113
lib/explorer/smart_contract/verifier.ex:89
lib/block_scout_web/templates/address_contract/index.html.eex:149
lib/block_scout_web/templates/address_contract/index.html.eex:151
lib/explorer/staking/stake_snapshotting.ex:15: Function do_snapshotting/7 has no local return
lib/explorer/staking/stake_snapshotting.ex:147
lib/explorer/third_party_integrations/sourcify.ex:65
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
### Features

### Fixes
- [#3888](https://github.com/blockscout/blockscout/pull/3888) - EIP-1967 contract proxy pattern detection fix

### Chore
- [#3870](https://github.com/blockscout/blockscout/pull/3870) - Manage token balance on-demand fetcher threshold via env var
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ defmodule BlockScoutWeb.SmartContractController do
with true <- ajax?(conn),
{:ok, address_hash} <- Chain.string_to_address_hash(params["id"]),
{:ok, address} <- Chain.find_contract_address(address_hash, address_options, true) do
contract_type = if Chain.proxy_contract?(address.smart_contract.abi), do: :proxy, else: :regular
contract_type = if Chain.proxy_contract?(address.hash, address.smart_contract.abi), do: :proxy, else: :regular

outputs =
Reader.query_function(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@
class: "card-tab #{tab_status("read-contract", @conn.request_path)}")
%>
<% end %>
<%= if smart_contract_is_proxy?(@address) do %>
<%= if @is_proxy do %>
<%= link(
gettext("Read Proxy"),
to: AccessHelpers.get_path(@conn, :address_read_proxy_path, :index, @address.hash),
Expand All @@ -97,7 +97,7 @@
class: "card-tab #{tab_status("write-contract", @conn.request_path)}")
%>
<% end %>
<%= if smart_contract_with_write_functions?(@address) && smart_contract_is_proxy?(@address) do %>
<%= if smart_contract_with_write_functions?(@address) && @is_proxy do %>
<%= link(
gettext("Write Proxy"),
to: AccessHelpers.get_path(@conn, :address_write_proxy_path, :index, @address.hash),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
<section class="container" data-page="coin-balance-history">
<script defer src="<%= static_path(@conn, "/js/chart-loader.js") %>"></script>

<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<section>
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<div class="card-body" data-async-listing="<%= @current_path %>">
<div data-selector="channel-disconnected-message" style="display:none;">
<div data-selector="reload-button" class="alert alert-danger" style="padding: 0.75rem 0rem; cursor: pointer;">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
<% additional_sources = if smart_contract_verified, do: @address.smart_contract_additional_sources, else: additional_sources_from_twin %>

<section class="container">
<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<div class="card-body">
<%= unless smart_contract_verified do %>
<%= if minimal_proxy_template do %>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<section class="container">
<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<% contract = last_decompiled_contract_version(@address.decompiled_smart_contracts) %>
<%= if contract do %>
<div class="card-body">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
<section class="container">
<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<section data-page="address-internal-transactions">
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<div class="card-body" data-async-load data-async-listing="<%= @current_path %>">
<div data-selector="channel-batching-message" style="display: none;">
<div data-selector="reload-button" class="alert alert-info">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
<section class="container">
<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>
<section data-page="address-logs">
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>

<div class="card-body" data-async-load data-async-listing="<%= @current_path %>">
<h2 class="card-title"><%= gettext "Logs" %></h2>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
<section class="container">

<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<!-- loaded via AJAX -->
<div class="card-body" data-smart-contract-functions data-hash="<%= to_string(@address.hash) %>" data-type="<%= @type %>" data-action="<%= @action %>" data-url="<%= smart_contract_path(@conn, :index) %>">
<div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
<section class="container">

<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<!-- loaded via AJAX -->
<div class="card-body" data-smart-contract-functions data-hash="<%= to_string(@address.hash) %>" data-type="<%= @type %>" data-action="<%= @action %>" data-url="<%= smart_contract_path(@conn, :index) %>">
<div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
<section class="container">
<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<section>
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<div class="card-body" data-async-load data-async-listing="<%= @current_path %>">
<h2 class="card-title list-title-description"><%= gettext "Tokens" %></h2>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
<section class="container">
<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<section data-page="address-token-transfers">
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<div data-async-load data-async-listing="<%= @current_path %>" class="card-body">

<%= if assigns[:token] do %>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
<section class="container">

<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<section data-page="address-transactions">
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<div class="card-body" data-async-listing="<%= @current_path %>">
<div data-selector="channel-disconnected-message" style="display: none;">
<div data-selector="reload-button" class="alert alert-danger">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
<section class="container">
<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<section data-page="blocks-validated">
<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<div data-async-listing="<%= @current_path %>" class="card-body">
<div data-selector="channel-disconnected-message" style="display: none;">
<div data-selector="reload-button" class="alert alert-danger">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
<section class="container">

<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<!-- loaded via AJAX -->
<div class="card-body" data-smart-contract-functions data-hash="<%= to_string(@address.hash) %>" data-type="<%= @type %>" data-action="<%= @action %>" data-url="<%= smart_contract_path(@conn, :index) %>">
<div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
<section class="container">

<%= render BlockScoutWeb.AddressView, "overview.html", assigns %>
<% is_proxy = BlockScoutWeb.AddressView.smart_contract_is_proxy?(@address) %>

<%= 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 %>

<div class="card">
<%= render BlockScoutWeb.AddressView, "_tabs.html", assigns %>
<%= render BlockScoutWeb.AddressView, "_tabs.html", address: @address, is_proxy: is_proxy, conn: @conn %>
<!-- loaded via AJAX -->
<div class="card-body" data-smart-contract-functions data-hash="<%= to_string(@address.hash) %>" data-type="<%= @type %>" data-action="<%= @action %>" data-url="<%= smart_contract_path(@conn, :index) %>">
<div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ defmodule BlockScoutWeb.AddressView do
def smart_contract_with_read_only_functions?(%Address{smart_contract: nil}), do: false

def smart_contract_is_proxy?(%Address{smart_contract: %SmartContract{}} = address) do
Chain.proxy_contract?(address.smart_contract.abi)
Chain.proxy_contract?(address.hash, address.smart_contract.abi)
end

def smart_contract_is_proxy?(%Address{smart_contract: nil}), do: false
Expand Down
Loading