diff --git a/CHANGELOG.md b/CHANGELOG.md index a4950cab46..4ef164d824 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - [#3145](https://github.com/poanetwork/blockscout/pull/3145) - Pending txs per address API endpoint ### Fixes +- [#3202](https://github.com/poanetwork/blockscout/pull/3202) - Fix contracts verification with experimental features enabled - [#3201](https://github.com/poanetwork/blockscout/pull/3201) - Connect to Metamask button - [#3192](https://github.com/poanetwork/blockscout/pull/3192) - Dropdown menu doesn't open at "not found" page - [#3190](https://github.com/poanetwork/blockscout/pull/3190) - Contract log/method decoded view improvements: eliminate horizontal scroll, remove excess borders, whitespaces diff --git a/apps/explorer/lib/explorer/smart_contract/verifier.ex b/apps/explorer/lib/explorer/smart_contract/verifier.ex index ecb32fd588..6092a39c87 100644 --- a/apps/explorer/lib/explorer/smart_contract/verifier.ex +++ b/apps/explorer/lib/explorer/smart_contract/verifier.ex @@ -15,8 +15,10 @@ defmodule Explorer.SmartContract.Verifier do @metadata_hash_prefix_0_4_23 "a165627a7a72305820" @metadata_hash_prefix_0_5_10 "a265627a7a72305820" @metadata_hash_prefix_0_5_11 "a265627a7a72315820" + @metadata_hash_prefix_0_5_16 "a365627a7a72315820" @metadata_hash_prefix_0_6_0 "a264697066735822" + @experimental "6c6578706572696d656e74616cf5" @metadata_hash_common_suffix "64736f6c63" def evaluate_authenticity(_, %{"name" => ""}), do: {:error, :name} @@ -230,6 +232,20 @@ defmodule Explorer.SmartContract.Verifier do @metadata_hash_prefix_0_5_11 <> <> <> + @experimental <> + @metadata_hash_common_suffix <> + "43" <> <> <> "0032" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_11 <> + <> <> + @metadata_hash_common_suffix <> + "7826" <> <> <> "0057" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_11 <> + <> <> + @experimental <> @metadata_hash_common_suffix <> "7826" <> <> <> "0057" <> _constructor_arguments -> do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) @@ -242,6 +258,20 @@ defmodule Explorer.SmartContract.Verifier do @metadata_hash_prefix_0_5_11 <> <> <> + @experimental <> + @metadata_hash_common_suffix <> + "7827" <> <> <> "0057" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_11 <> + <> <> + @metadata_hash_common_suffix <> + "7828" <> <> <> "0058" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_11 <> + <> <> + @experimental <> @metadata_hash_common_suffix <> "7828" <> <> <> "0058" <> _constructor_arguments -> do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) @@ -252,6 +282,78 @@ defmodule Explorer.SmartContract.Verifier do "7829" <> <> <> "0059" <> _constructor_arguments -> do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + @metadata_hash_prefix_0_5_11 <> + <> <> + @experimental <> + @metadata_hash_common_suffix <> + "7829" <> <> <> "0059" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_16 <> + <> <> + @metadata_hash_common_suffix <> + "43" <> <> <> "0032" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_16 <> + <> <> + @experimental <> + @metadata_hash_common_suffix <> + "43" <> <> <> "0040" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_16 <> + <> <> + @metadata_hash_common_suffix <> + "7826" <> <> <> "0057" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_16 <> + <> <> + @experimental <> + @metadata_hash_common_suffix <> + "7826" <> <> <> "0057" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_16 <> + <> <> + @metadata_hash_common_suffix <> + "7827" <> <> <> "0057" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_16 <> + <> <> + @experimental <> + @metadata_hash_common_suffix <> + "7827" <> <> <> "0057" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_16 <> + <> <> + @metadata_hash_common_suffix <> + "7828" <> <> <> "0058" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_16 <> + <> <> + @experimental <> + @metadata_hash_common_suffix <> + "7828" <> <> <> "0058" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_16 <> + <> <> + @metadata_hash_common_suffix <> + "7829" <> <> <> "0059" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + + @metadata_hash_prefix_0_5_16 <> + <> <> + @experimental <> + @metadata_hash_common_suffix <> + "7829" <> <> <> "0059" <> _constructor_arguments -> + do_extract_bytecode_and_metadata_hash_output(metadata_hash, extracted, compiler_version) + # Solidity >= 0.6.0 https://github.com/ethereum/solidity/blob/develop/Changelog.md#060-2019-12-17 # https://github.com/ethereum/solidity/blob/26b700771e9cc9c956f0503a05de69a1be427963/docs/metadata.rst#encoding-of-the-metadata-hash-in-the-bytecode # IPFS is used instead of Swarm diff --git a/apps/explorer/lib/explorer/smart_contract/verifier/constructor_arguments.ex b/apps/explorer/lib/explorer/smart_contract/verifier/constructor_arguments.ex index 8edc758693..9bdaed7206 100644 --- a/apps/explorer/lib/explorer/smart_contract/verifier/constructor_arguments.ex +++ b/apps/explorer/lib/explorer/smart_contract/verifier/constructor_arguments.ex @@ -9,8 +9,10 @@ defmodule Explorer.SmartContract.Verifier.ConstructorArguments do @metadata_hash_prefix_0_4_23 "a165627a7a72305820" @metadata_hash_prefix_0_5_10 "a265627a7a72305820" @metadata_hash_prefix_0_5_11 "a265627a7a72315820" + @metadata_hash_prefix_0_5_16 "a365627a7a72315820" @metadata_hash_prefix_0_6_0 "a264697066735822" + @experimental "6c6578706572696d656e74616cf5" @metadata_hash_common_suffix "64736f6c63" def verify(address_hash, contract_code, arguments_data, contract_source_code, contract_name) do @@ -120,6 +122,18 @@ defmodule Explorer.SmartContract.Verifier.ConstructorArguments do @metadata_hash_prefix_0_5_11 ) + @metadata_hash_prefix_0_5_11 <> + <<_::binary-size(64)>> <> + @experimental <> + @metadata_hash_common_suffix <> "43" <> <<_::binary-size(6)>> <> "0032" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @experimental <> @metadata_hash_prefix_0_5_11 + ) + @metadata_hash_prefix_0_5_11 <> <<_::binary-size(64)>> <> @metadata_hash_common_suffix <> "7826" <> <<_::binary-size(76)>> <> "0057" <> constructor_arguments -> @@ -131,6 +145,18 @@ defmodule Explorer.SmartContract.Verifier.ConstructorArguments do @metadata_hash_prefix_0_5_11 ) + @metadata_hash_prefix_0_5_11 <> + <<_::binary-size(64)>> <> + @experimental <> + @metadata_hash_common_suffix <> "7826" <> <<_::binary-size(76)>> <> "0057" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @experimental <> @metadata_hash_prefix_0_5_11 + ) + @metadata_hash_prefix_0_5_11 <> <<_::binary-size(64)>> <> @metadata_hash_common_suffix <> "7827" <> <<_::binary-size(78)>> <> "0057" <> constructor_arguments -> @@ -142,6 +168,18 @@ defmodule Explorer.SmartContract.Verifier.ConstructorArguments do @metadata_hash_prefix_0_5_11 ) + @metadata_hash_prefix_0_5_11 <> + <<_::binary-size(64)>> <> + @experimental <> + @metadata_hash_common_suffix <> "7827" <> <<_::binary-size(78)>> <> "0057" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @experimental <> @metadata_hash_prefix_0_5_11 + ) + @metadata_hash_prefix_0_5_11 <> <<_::binary-size(64)>> <> @metadata_hash_common_suffix <> "7828" <> <<_::binary-size(80)>> <> "0058" <> constructor_arguments -> @@ -153,6 +191,18 @@ defmodule Explorer.SmartContract.Verifier.ConstructorArguments do @metadata_hash_prefix_0_5_11 ) + @metadata_hash_prefix_0_5_11 <> + <<_::binary-size(64)>> <> + @experimental <> + @metadata_hash_common_suffix <> "7828" <> <<_::binary-size(80)>> <> "0058" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @experimental <> @metadata_hash_prefix_0_5_11 + ) + @metadata_hash_prefix_0_5_11 <> <<_::binary-size(64)>> <> @metadata_hash_common_suffix <> "7829" <> <<_::binary-size(82)>> <> "0059" <> constructor_arguments -> @@ -164,6 +214,134 @@ defmodule Explorer.SmartContract.Verifier.ConstructorArguments do @metadata_hash_prefix_0_5_11 ) + @metadata_hash_prefix_0_5_11 <> + <<_::binary-size(64)>> <> + @experimental <> + @metadata_hash_common_suffix <> "7829" <> <<_::binary-size(82)>> <> "0059" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @experimental <> @metadata_hash_prefix_0_5_11 + ) + + # ABIEncoder V2 + @metadata_hash_prefix_0_5_16 <> + <<_::binary-size(64)>> <> + @metadata_hash_common_suffix <> "43" <> <<_::binary-size(6)>> <> "0032" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @metadata_hash_prefix_0_5_16 + ) + + @metadata_hash_prefix_0_5_16 <> + <<_::binary-size(64)>> <> + @experimental <> + @metadata_hash_common_suffix <> "43" <> <<_::binary-size(6)>> <> "0032" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @experimental <> @metadata_hash_prefix_0_5_16 + ) + + @metadata_hash_prefix_0_5_16 <> + <<_::binary-size(64)>> <> + @metadata_hash_common_suffix <> "7826" <> <<_::binary-size(76)>> <> "0057" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @metadata_hash_prefix_0_5_16 + ) + + @metadata_hash_prefix_0_5_16 <> + <<_::binary-size(64)>> <> + @experimental <> + @metadata_hash_common_suffix <> "7826" <> <<_::binary-size(76)>> <> "0057" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @experimental <> @metadata_hash_prefix_0_5_16 + ) + + @metadata_hash_prefix_0_5_16 <> + <<_::binary-size(64)>> <> + @metadata_hash_common_suffix <> "7827" <> <<_::binary-size(78)>> <> "0057" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @metadata_hash_prefix_0_5_16 + ) + + @metadata_hash_prefix_0_5_16 <> + <<_::binary-size(64)>> <> + @experimental <> + @metadata_hash_common_suffix <> "7827" <> <<_::binary-size(78)>> <> "0057" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @experimental <> @metadata_hash_prefix_0_5_16 + ) + + @metadata_hash_prefix_0_5_16 <> + <<_::binary-size(64)>> <> + @metadata_hash_common_suffix <> "7828" <> <<_::binary-size(80)>> <> "0058" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @metadata_hash_prefix_0_5_16 + ) + + @metadata_hash_prefix_0_5_16 <> + <<_::binary-size(64)>> <> + @experimental <> + @metadata_hash_common_suffix <> "7828" <> <<_::binary-size(80)>> <> "0058" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @experimental <> @metadata_hash_prefix_0_5_16 + ) + + @metadata_hash_prefix_0_5_16 <> + <<_::binary-size(64)>> <> + @metadata_hash_common_suffix <> "7829" <> <<_::binary-size(82)>> <> "0059" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @metadata_hash_prefix_0_5_16 + ) + + @metadata_hash_prefix_0_5_16 <> + <<_::binary-size(64)>> <> + @experimental <> + @metadata_hash_common_suffix <> "7829" <> <<_::binary-size(82)>> <> "0059" <> constructor_arguments -> + split_constructor_arguments_and_extract_check_func( + constructor_arguments, + check_func, + contract_source_code, + contract_name, + @experimental <> @metadata_hash_prefix_0_5_16 + ) + # Solidity >= 0.6.0 https://github.com/ethereum/solidity/blob/develop/Changelog.md#060-2019-12-17 # https://github.com/ethereum/solidity/blob/26b700771e9cc9c956f0503a05de69a1be427963/docs/metadata.rst#encoding-of-the-metadata-hash-in-the-bytecode # IPFS is used instead of Swarm