15#include <evmc/evmc.hpp>
16#include <evmc/hex.hpp>
19 #define interface __STRUCT__
24#include <spdlog/spdlog.h>
25#include <absl/container/flat_hash_map.h>
42 std::vector<std::uint8_t>
code;
43 absl::flat_hash_map<evmc::bytes32, evmc::bytes32>
storage;
57 spdlog::error(std::format(
"add_account: Account {} already exists", addr));
64 void set_balance(
const evmc::address& addr, std::uint64_t x)
noexcept
68 spdlog::error(std::format(
"set_balance : Account {} does not exist", addr));
73 acc.
balance = evmc::uint256be{};
74 for (std::size_t i = 0; i <
sizeof(x); ++i)
75 acc.
balance.bytes[
sizeof(acc.
balance) - 1 - i] =
static_cast<uint8_t
>(x >> (8 * i));
78 bool account_exists(
const evmc::address& addr)
const noexcept override;
80 evmc::bytes32
get_storage(
const evmc::address& addr,
const evmc::bytes32& key)
const noexcept override;
82 evmc_storage_status
set_storage(
const evmc::address& address,
const evmc::bytes32& key,
const evmc::bytes32& value)
noexcept override;
84 evmc::uint256be
get_balance(
const evmc::address& addr)
const noexcept override;
86 std::size_t
get_code_size(
const evmc::address& addr)
const noexcept override;
88 evmc::bytes32
get_code_hash(
const evmc::address& addr)
const noexcept override;
90 std::size_t
copy_code(
const evmc::address& addr,
91 std::size_t code_offset,
92 std::uint8_t* buffer_data,
93 std::size_t buffer_size)
const noexcept override;
95 bool selfdestruct(
const evmc::address& addr,
const evmc::address& beneficiary)
noexcept override;
97 evmc::Result
call(
const evmc_message& msg)
noexcept override;
101 evmc::bytes32
get_block_hash(int64_t block_number) const noexcept override;
102 void emit_log(const evmc::address& addr,
103 const std::uint8_t* data,
105 const evmc::bytes32 topics[],
106 size_t num_topics) noexcept override;
108 evmc_access_status
access_account(const evmc::address& addr) noexcept override;
110 evmc_access_status
access_storage(const evmc::address& addr, const evmc::bytes32& key) noexcept override;
113 const evmc::bytes32& key) const noexcept override;
116 const evmc::bytes32& key,
117 const evmc::bytes32& value) noexcept override;
120 std::
string to_key(const evmc::address& addr) const;
124 evmc_address
derive_create2_address(const evmc::address& sender, const evmc::bytes32& salt, const std::vector<std::uint8_t>& code);
126 void deploy_contract(evmc::address addr, std::vector<std::uint8_t>&& code, evmc_uint256be value, evmc::address creator, std::uint64_t nonce);
130 evmc_revision _revision;
132 absl::flat_hash_map<std::
string, Account> _accounts;
133 absl::flat_hash_map<evmc::address, std::uint64_t> _create_nonce;
135 std::stack<evmc::address> _sender_stack;
138 template <typename H>
141 return H::combine(std::move(h), addr.bytes);
Definition evm_storage.hpp:37
void set_balance(const evmc::address &addr, std::uint64_t x) noexcept
Definition evm_storage.hpp:64
void emit_log(const evmc::address &addr, const std::uint8_t *data, size_t data_size, const evmc::bytes32 topics[], size_t num_topics) noexcept override
Definition evm_storage.cpp:248
evmc::bytes32 get_block_hash(int64_t block_number) const noexcept override
Definition evm_storage.cpp:227
void set_transient_storage(const evmc::address &addr, const evmc::bytes32 &key, const evmc::bytes32 &value) noexcept override
Definition evm_storage.cpp:300
void deploy_contract(evmc::address addr, std::vector< std::uint8_t > &&code, evmc_uint256be value, evmc::address creator, std::uint64_t nonce)
Definition evm_storage.cpp:349
evmc_storage_status set_storage(const evmc::address &address, const evmc::bytes32 &key, const evmc::bytes32 &value) noexcept override
Definition evm_storage.cpp:27
evmc::uint256be get_balance(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:33
evmc::bytes32 get_transient_storage(const evmc::address &addr, const evmc::bytes32 &key) const noexcept override
Definition evm_storage.cpp:291
evmc_tx_context get_tx_context() const noexcept override
Definition evm_storage.cpp:189
evmc_address derive_create2_address(const evmc::address &sender, const evmc::bytes32 &salt, const std::vector< std::uint8_t > &code)
Definition evm_storage.cpp:328
std::size_t copy_code(const evmc::address &addr, std::size_t code_offset, std::uint8_t *buffer_data, std::size_t buffer_size) const noexcept override
Definition evm_storage.cpp:62
evmc::Result call(const evmc_message &msg) noexcept override
Definition evm_storage.cpp:92
bool selfdestruct(const evmc::address &addr, const evmc::address &beneficiary) noexcept override
Definition evm_storage.cpp:79
evmc_access_status access_account(const evmc::address &addr) noexcept override
Definition evm_storage.cpp:277
evmc_access_status access_storage(const evmc::address &addr, const evmc::bytes32 &key) noexcept override
Definition evm_storage.cpp:284
evmc_address derive_create_address(const evmc::address &sender, std::uint64_t nonce)
Definition evm_storage.cpp:314
bool account_exists(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:11
bool add_account(const evmc::address &addr)
Definition evm_storage.hpp:53
std::string to_key(const evmc::address &addr) const
Definition evm_storage.cpp:309
evmc::bytes32 get_code_hash(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:48
evmc::bytes32 get_storage(const evmc::address &addr, const evmc::bytes32 &key) const noexcept override
Definition evm_storage.cpp:16
std::size_t get_code_size(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:43
const std::uint64_t DEFAULT_GAS_LIMIT
Definition evm_storage.hpp:34
H AbslHashValue(H h, const evmc::address &addr)
Definition evm_storage.hpp:139
Definition evm_storage.hpp:40
uint64_t timestamp
Definition evm_storage.hpp:48
evmc::address creator
Definition evm_storage.hpp:46
std::vector< std::uint8_t > code
Definition evm_storage.hpp:42
uint64_t nonce
Definition evm_storage.hpp:47
evmc_uint256be balance
Definition evm_storage.hpp:41
absl::flat_hash_map< evmc::bytes32, evmc::bytes32 > storage
Definition evm_storage.hpp:43