@@ -145,6 +145,11 @@ class Memory
145
145
void clear () noexcept { m_size = 0 ; }
146
146
};
147
147
148
+ struct TransactionInitcode
149
+ {
150
+ bytes_view code;
151
+ std::optional<bool > is_valid;
152
+ };
148
153
149
154
// / Generic execution state for generic instructions implementations.
150
155
// NOLINTNEXTLINE(clang-analyzer-optin.performance.Padding)
@@ -172,8 +177,7 @@ class ExecutionState
172
177
173
178
private:
174
179
evmc_tx_context m_tx = {};
175
- std::optional<std::unordered_map<evmc::bytes32, bytes_view>> m_initcodes;
176
- std::unordered_map<evmc::bytes32, bool > m_initcodes_validity;
180
+ std::optional<std::unordered_map<evmc::bytes32, TransactionInitcode>> m_initcodes;
177
181
178
182
public:
179
183
// / Pointer to code analysis.
@@ -217,7 +221,6 @@ class ExecutionState
217
221
deploy_container = {};
218
222
m_tx = {};
219
223
m_initcodes.reset ();
220
- m_initcodes_validity.clear ();
221
224
call_stack = {};
222
225
}
223
226
@@ -242,27 +245,34 @@ class ExecutionState
242
245
for (size_t i = 0 ; i < tx_context.initcodes_count ; ++i)
243
246
{
244
247
const auto & initcode = tx_context.initcodes [i];
245
- m_initcodes->insert ({initcode.hash , {initcode.code , initcode.code_size }});
248
+ m_initcodes->insert ({initcode.hash ,
249
+ {.code = {initcode.code , initcode.code_size }, .is_valid = std::nullopt}});
246
250
}
247
251
}
248
252
249
253
const auto it = m_initcodes->find (hash);
250
- return it != m_initcodes->end () ? it->second : bytes_view{};
254
+ return it != m_initcodes->end () ? it->second . code : bytes_view{};
251
255
}
252
256
253
257
// / Get validity of initcode from transaction initcodes by its hash.
254
258
// /
255
259
// / Returns std::nullopt if no such initcode was validated yet.
256
260
[[nodiscard]] std::optional<bool > get_initcode_validity (const evmc_bytes32& hash) noexcept
257
261
{
258
- const auto it = m_initcodes_validity.find (hash);
259
- return (it != m_initcodes_validity.end () ? std::optional{it->second } : std::nullopt);
262
+ if (!m_initcodes.has_value ())
263
+ return std::nullopt;
264
+
265
+ const auto it = m_initcodes->find (hash);
266
+ return (it != m_initcodes->end () ? it->second .is_valid : std::nullopt);
260
267
}
261
268
262
269
// / Set validity of initcode from transaction initcodes.
263
270
void set_initcode_validity (const evmc_bytes32& hash, bool is_valid)
264
271
{
265
- m_initcodes_validity[hash] = is_valid;
272
+ if (!m_initcodes.has_value ())
273
+ return ;
274
+
275
+ (*m_initcodes)[hash].is_valid = is_valid;
266
276
}
267
277
};
268
278
} // namespace evmone
0 commit comments