diff --git a/libevmasm/Assembly.cpp b/libevmasm/Assembly.cpp index ef6c0bec9cce..50ecaa6d12d1 100644 --- a/libevmasm/Assembly.cpp +++ b/libevmasm/Assembly.cpp @@ -589,7 +589,8 @@ std::pair, std::vector> Assembly::fromJSO Json const& _json, std::vector const& _sourceList, size_t _level, - std::optional _eofVersion + std::optional _eofVersion, + EVMVersion _evmVersion ) { solRequire(_json.is_object(), AssemblyImportException, "Supplied JSON is not an object."); @@ -620,7 +621,7 @@ std::pair, std::vector> Assembly::fromJSO "Member 'sourceList' may only be present in the root JSON object." ); - auto result = std::make_shared(EVMVersion{}, _level == 0 /* _creation */, _eofVersion, "" /* _name */); + auto result = std::make_shared(_evmVersion, _level == 0 /* _creation */, _eofVersion, "" /* _name */); std::vector parsedSourceList; if (_json.contains("sourceList")) { @@ -687,7 +688,13 @@ std::pair, std::vector> Assembly::fromJSO solThrow(AssemblyImportException, "The key '" + key + "' inside '.data' is out of the supported integer range."); } - auto [subAssembly, emptySourceList] = Assembly::fromJSON(value, _level == 0 ? parsedSourceList : _sourceList, _level + 1, _eofVersion); + auto [subAssembly, emptySourceList] = Assembly::fromJSON( + value, + _level == 0 ? parsedSourceList : _sourceList, + _level + 1, + _eofVersion, + _evmVersion + ); solAssert(subAssembly); solAssert(emptySourceList.empty()); solAssert(subAssemblies.count(index) == 0); diff --git a/libevmasm/Assembly.h b/libevmasm/Assembly.h index f931c438e38a..2b85fb99efe7 100644 --- a/libevmasm/Assembly.h +++ b/libevmasm/Assembly.h @@ -211,7 +211,8 @@ class Assembly Json const& _json, std::vector const& _sourceList = {}, size_t _level = 0, - std::optional _eofVersion = std::nullopt + std::optional _eofVersion = std::nullopt, + langutil::EVMVersion _evmVersion = {} ); /// Mark this assembly as invalid. Calling ``assemble`` on it will throw. diff --git a/libevmasm/EVMAssemblyStack.cpp b/libevmasm/EVMAssemblyStack.cpp index be9142a8a85c..f8d17e4e4dd9 100644 --- a/libevmasm/EVMAssemblyStack.cpp +++ b/libevmasm/EVMAssemblyStack.cpp @@ -45,7 +45,7 @@ void EVMAssemblyStack::analyze(std::string const& _sourceName, Json const& _asse { solAssert(!m_evmAssembly); m_name = _sourceName; - std::tie(m_evmAssembly, m_sourceList) = evmasm::Assembly::fromJSON(_assemblyJson, {}, 0, m_eofVersion); + std::tie(m_evmAssembly, m_sourceList) = evmasm::Assembly::fromJSON(_assemblyJson, {}, 0, m_eofVersion, m_evmVersion); solRequire(m_evmAssembly != nullptr, AssemblyImportException, "Could not create evm assembly object."); } diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/evm_version_push0_paris.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/evm_version_push0_paris.asmjson new file mode 100644 index 000000000000..6fda4f1bbbed --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/evm_version_push0_paris.asmjson @@ -0,0 +1,11 @@ +{ + ".code": [ + {"name": "PUSH", "value": "0"} + ] +} +// ==== +// EVMVersion: =paris +// outputs: Bytecode,Opcodes +// ---- +// Bytecode: 6000 +// Opcodes: PUSH1 0x0 diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/evm_version_push0_shanghai.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/evm_version_push0_shanghai.asmjson new file mode 100644 index 000000000000..caefe16d6c10 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/evm_version_push0_shanghai.asmjson @@ -0,0 +1,11 @@ +{ + ".code": [ + {"name": "PUSH", "value": "0"} + ] +} +// ==== +// EVMVersion: =shanghai +// outputs: Bytecode,Opcodes +// ---- +// Bytecode: 5f +// Opcodes: PUSH0