35
35
namespace solidity ::test
36
36
{
37
37
using Address = util::h160;
38
+ using StorageMap = std::map<evmc::bytes32, evmc::storage_value>;
38
39
39
40
class EVMHost : public evmc ::MockedHost
40
41
{
41
42
public:
42
- using MockedHost::get_code_size;
43
+ // Verbatim features of MockedHost.
44
+ using MockedHost::account_exists;
45
+ using MockedHost::get_storage;
46
+ using MockedHost::set_storage;
43
47
using MockedHost::get_balance;
48
+ using MockedHost::get_code_size;
49
+ using MockedHost::get_code_hash;
50
+ using MockedHost::copy_code;
51
+ using MockedHost::get_tx_context;
52
+ using MockedHost::emit_log;
53
+ using MockedHost::access_account;
54
+ using MockedHost::access_storage;
55
+
56
+ // Modified features of MockedHost.
57
+ void selfdestruct (evmc::address const & _addr, evmc::address const & _beneficiary) noexcept final ;
58
+ evmc::result call (evmc_message const & _message) noexcept final ;
59
+ evmc::bytes32 get_block_hash (int64_t number) const noexcept final ;
60
+
61
+ // Solidity testing specific features.
44
62
45
63
// / Tries to dynamically load an evmc vm supporting evm1 or ewasm and caches the loaded VM.
46
64
// / @returns vmc::VM(nullptr) on failure.
@@ -55,9 +73,10 @@ class EVMHost: public evmc::MockedHost
55
73
56
74
explicit EVMHost (langutil::EVMVersion _evmVersion, evmc::VM& _vm);
57
75
76
+ // / Reset entire state (including accounts).
58
77
void reset ();
59
- // / Clears EIP-2929 account and storage access indicator
60
- void resetWarmAccess ();
78
+
79
+ // / Start new block.
61
80
void newBlock ()
62
81
{
63
82
tx_context.block_number ++;
@@ -67,35 +86,21 @@ class EVMHost: public evmc::MockedHost
67
86
}
68
87
69
88
// / @returns contents of storage at @param _addr.
70
- std::map<evmc::bytes32, evmc::storage_value> const & get_address_storage (evmc::address const & _addr);
71
-
72
- bool account_exists (evmc::address const & _addr) const noexcept final
73
- {
74
- return evmc::MockedHost::account_exists (_addr);
75
- }
76
-
77
- void selfdestruct (evmc::address const & _addr, evmc::address const & _beneficiary) noexcept final ;
78
-
79
- evmc::result call (evmc_message const & _message) noexcept final ;
80
-
81
- evmc::bytes32 get_block_hash (int64_t number) const noexcept final ;
89
+ StorageMap const & get_address_storage (evmc::address const & _addr);
82
90
83
91
static Address convertFromEVMC (evmc::address const & _addr);
84
92
static evmc::address convertToEVMC (Address const & _addr);
85
93
static util::h256 convertFromEVMC (evmc::bytes32 const & _data);
86
94
static evmc::bytes32 convertToEVMC (util::h256 const & _data);
87
-
88
- // / @returns true, if the evmc VM has the given capability.
89
- bool hasCapability (evmc_capabilities capability) const noexcept
90
- {
91
- return m_vm.has_capability (capability);
92
- }
93
-
94
95
private:
95
96
evmc::address m_currentAddress = {};
96
97
98
+ // / Transfer value between accounts. Checks for sufficient balance.
97
99
void transfer (evmc::MockedAccount& _sender, evmc::MockedAccount& _recipient, u256 const & _value) noexcept ;
98
100
101
+ // / Clears EIP-2929 account and storage access indicator
102
+ void resetWarmAccess ();
103
+
99
104
// / Records calls made via @param _message.
100
105
void recordCalls (evmc_message const & _message) noexcept ;
101
106
@@ -113,9 +118,9 @@ class EVMHost: public evmc::MockedHost
113
118
static evmc::result resultWithGas (evmc_message const & _message, bytes const & _data) noexcept ;
114
119
115
120
evmc::VM& m_vm;
116
- // EVM version requested by the testing tool
121
+ // / EVM version requested by the testing tool
117
122
langutil::EVMVersion m_evmVersion;
118
- // EVM version requested from EVMC (matches the above)
123
+ // / EVM version requested from EVMC (matches the above)
119
124
evmc_revision m_evmRevision;
120
125
};
121
126
0 commit comments