diff --git a/liblangutil/EVMVersion.h b/liblangutil/EVMVersion.h index d36633845..cada617fe 100644 --- a/liblangutil/EVMVersion.h +++ b/liblangutil/EVMVersion.h @@ -57,10 +57,11 @@ public: static EVMVersion berlin() { return {Version::Berlin}; } static EVMVersion london() { return {Version::London}; } static EVMVersion paris() { return {Version::Paris}; } + static EVMVersion shanghai() { return {Version::Shanghai}; } static std::optional fromString(std::string const& _version) { - for (auto const& v: {homestead(), tangerineWhistle(), spuriousDragon(), byzantium(), constantinople(), petersburg(), istanbul(), berlin(), london(), paris()}) + for (auto const& v: {homestead(), tangerineWhistle(), spuriousDragon(), byzantium(), constantinople(), petersburg(), istanbul(), berlin(), london(), paris(), shanghai()}) if (_version == v.name()) return v; return std::nullopt; @@ -83,6 +84,7 @@ public: case Version::Berlin: return "berlin"; case Version::London: return "london"; case Version::Paris: return "paris"; + case Version::Shanghai: return "shanghai"; } return "INVALID"; } @@ -104,7 +106,7 @@ public: bool canOverchargeGasForCall() const { return *this >= tangerineWhistle(); } private: - enum class Version { Homestead, TangerineWhistle, SpuriousDragon, Byzantium, Constantinople, Petersburg, Istanbul, Berlin, London, Paris }; + enum class Version { Homestead, TangerineWhistle, SpuriousDragon, Byzantium, Constantinople, Petersburg, Istanbul, Berlin, London, Paris, Shanghai }; EVMVersion(Version _version): m_version(_version) {} diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index 37ceca1d4..e4fa79611 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -590,7 +590,7 @@ General Information)").c_str(), g_strEVMVersion.c_str(), po::value()->value_name("version")->default_value(EVMVersion{}.name()), "Select desired EVM version. Either homestead, tangerineWhistle, spuriousDragon, " - "byzantium, constantinople, petersburg, istanbul, berlin, london or paris." + "byzantium, constantinople, petersburg, istanbul, berlin, london, paris or shanghai." ) ; if (!_forHelp) // Note: We intentionally keep this undocumented for now. diff --git a/test/EVMHost.cpp b/test/EVMHost.cpp index 222b4e443..d6cc311a0 100644 --- a/test/EVMHost.cpp +++ b/test/EVMHost.cpp @@ -124,6 +124,8 @@ EVMHost::EVMHost(langutil::EVMVersion _evmVersion, evmc::VM& _vm): m_evmRevision = EVMC_LONDON; else if (_evmVersion == langutil::EVMVersion::paris()) m_evmRevision = EVMC_PARIS; + else if (_evmVersion == langutil::EVMVersion::shanghai()) + m_evmRevision = EVMC_SHANGHAI; else assertThrow(false, Exception, "Unsupported EVM version"); diff --git a/test/libsolidity/StandardCompiler.cpp b/test/libsolidity/StandardCompiler.cpp index 61b28b11e..02552ee9b 100644 --- a/test/libsolidity/StandardCompiler.cpp +++ b/test/libsolidity/StandardCompiler.cpp @@ -1084,6 +1084,8 @@ BOOST_AUTO_TEST_CASE(evm_version) BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].asString().find("\"evmVersion\":\"london\"") != string::npos); result = compile(inputForVersion("\"evmVersion\": \"paris\",")); BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].asString().find("\"evmVersion\":\"paris\"") != string::npos); + result = compile(inputForVersion("\"evmVersion\": \"shanghai\",")); + BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].asString().find("\"evmVersion\":\"shanghai\"") != string::npos); // test default result = compile(inputForVersion("")); BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].asString().find("\"evmVersion\":\"london\"") != string::npos);