15#include <evmc/evmc.hpp>
16#include <evmc/hex.hpp>
19 #define interface __STRUCT__
22#include <spdlog/spdlog.h>
23#include <absl/container/flat_hash_map.h>
39 std::vector<std::uint8_t>
code;
40 absl::flat_hash_map<evmc::bytes32, evmc::bytes32>
storage;
54 spdlog::error(std::format(
"add_account: Account {} already exists", addr));
61 void set_balance(
const evmc::address& addr, std::uint64_t x)
noexcept
65 spdlog::error(std::format(
"set_balance : Account {} does not exist", addr));
70 acc.
balance = evmc::uint256be{};
71 for (std::size_t i = 0; i <
sizeof(x); ++i)
72 acc.
balance.bytes[
sizeof(acc.
balance) - 1 - i] =
static_cast<uint8_t
>(x >> (8 * i));
75 bool account_exists(
const evmc::address& addr)
const noexcept override;
77 evmc::bytes32
get_storage(
const evmc::address& addr,
const evmc::bytes32& key)
const noexcept override;
79 evmc_storage_status
set_storage(
const evmc::address& address,
const evmc::bytes32& key,
const evmc::bytes32& value)
noexcept override;
81 evmc::uint256be
get_balance(
const evmc::address& addr)
const noexcept override;
83 std::size_t
get_code_size(
const evmc::address& addr)
const noexcept override;
85 evmc::bytes32
get_code_hash(
const evmc::address& addr)
const noexcept override;
87 std::size_t
copy_code(
const evmc::address& addr,
88 std::size_t code_offset,
89 std::uint8_t* buffer_data,
90 std::size_t buffer_size)
const noexcept override;
92 bool selfdestruct(
const evmc::address& addr,
const evmc::address& beneficiary)
noexcept override;
94 evmc::Result
call(
const evmc_message& msg)
noexcept override;
98 evmc::bytes32
get_block_hash(int64_t block_number) const noexcept override;
99 void emit_log(const evmc::address& addr,
100 const std::uint8_t* data,
102 const evmc::bytes32 topics[],
103 size_t num_topics) noexcept override;
105 evmc_access_status
access_account(const evmc::address& addr) noexcept override;
107 evmc_access_status
access_storage(const evmc::address& addr, const evmc::bytes32& key) noexcept override;
110 const evmc::bytes32& key) const noexcept override;
113 const evmc::bytes32& key,
114 const evmc::bytes32& value) noexcept override;
117 std::
string to_key(const evmc::address& addr) const;
121 evmc_address
derive_create2_address(const evmc::address& sender, const evmc::bytes32& salt, const std::vector<std::uint8_t>& code);
123 void deploy_contract(evmc::address addr, std::vector<std::uint8_t>&& code, evmc_uint256be value, evmc::address creator, std::uint64_t nonce);
127 evmc_revision _revision;
129 absl::flat_hash_map<std::
string, Account> _accounts;
130 absl::flat_hash_map<evmc::address, std::uint64_t> _create_nonce;
132 std::stack<evmc::address> _sender_stack;
135 template <typename H>
138 return H::combine(std::move(h), addr.bytes);
Definition evm_storage.hpp:34
void set_balance(const evmc::address &addr, std::uint64_t x) noexcept
Definition evm_storage.hpp:61
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:317
evmc::bytes32 get_block_hash(int64_t block_number) const noexcept override
Definition evm_storage.cpp:262
void set_transient_storage(const evmc::address &addr, const evmc::bytes32 &key, const evmc::bytes32 &value) noexcept override
Definition evm_storage.cpp:474
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:523
evmc_storage_status set_storage(const evmc::address &address, const evmc::bytes32 &key, const evmc::bytes32 &value) noexcept override
Definition evm_storage.cpp:28
evmc::uint256be get_balance(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:34
evmc::bytes32 get_transient_storage(const evmc::address &addr, const evmc::bytes32 &key) const noexcept override
Definition evm_storage.cpp:465
evmc_tx_context get_tx_context() const noexcept override
Definition evm_storage.cpp:224
evmc_address derive_create2_address(const evmc::address &sender, const evmc::bytes32 &salt, const std::vector< std::uint8_t > &code)
Definition evm_storage.cpp:502
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:63
evmc::Result call(const evmc_message &msg) noexcept override
Definition evm_storage.cpp:93
bool selfdestruct(const evmc::address &addr, const evmc::address &beneficiary) noexcept override
Definition evm_storage.cpp:80
evmc_access_status access_account(const evmc::address &addr) noexcept override
Definition evm_storage.cpp:451
evmc_access_status access_storage(const evmc::address &addr, const evmc::bytes32 &key) noexcept override
Definition evm_storage.cpp:458
evmc_address derive_create_address(const evmc::address &sender, std::uint64_t nonce)
Definition evm_storage.cpp:488
bool account_exists(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:12
bool add_account(const evmc::address &addr)
Definition evm_storage.hpp:50
std::string to_key(const evmc::address &addr) const
Definition evm_storage.cpp:483
evmc::bytes32 get_code_hash(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:49
evmc::bytes32 get_storage(const evmc::address &addr, const evmc::bytes32 &key) const noexcept override
Definition evm_storage.cpp:17
std::size_t get_code_size(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:44
const std::uint64_t DEFAULT_GAS_LIMIT
Definition evm_storage.hpp:31
H AbslHashValue(H h, const evmc::address &addr)
Definition evm_storage.hpp:136
Definition evm_storage.hpp:37
uint64_t timestamp
Definition evm_storage.hpp:45
evmc::address creator
Definition evm_storage.hpp:43
std::vector< std::uint8_t > code
Definition evm_storage.hpp:39
uint64_t nonce
Definition evm_storage.hpp:44
evmc_uint256be balance
Definition evm_storage.hpp:38
absl::flat_hash_map< evmc::bytes32, evmc::bytes32 > storage
Definition evm_storage.hpp:40