@@ -170,14 +170,18 @@ void EVMHost::reset()
170
170
}
171
171
}
172
172
173
- void EVMHost::resetWarmAccess ()
173
+ void EVMHost::newTransactionFrame ()
174
174
{
175
175
// Clear EIP-2929 account access indicator
176
176
recorded_account_accesses.clear ();
177
177
// Clear EIP-2929 storage access indicator
178
178
for (auto & [address, account]: accounts)
179
179
for (auto & [slot, value]: account.storage )
180
180
value.access_status = EVMC_ACCESS_COLD;
181
+ // Process selfdestruct list
182
+ for (auto & [address, _]: recorded_selfdestructs)
183
+ accounts.erase (address);
184
+ recorded_selfdestructs.clear ();
181
185
}
182
186
183
187
void EVMHost::transfer (evmc::MockedAccount& _sender, evmc::MockedAccount& _recipient, u256 const & _value) noexcept
@@ -190,12 +194,11 @@ void EVMHost::transfer(evmc::MockedAccount& _sender, evmc::MockedAccount& _recip
190
194
void EVMHost::selfdestruct (const evmc::address& _addr, const evmc::address& _beneficiary) noexcept
191
195
{
192
196
// TODO actual selfdestruct is even more complicated.
193
- // TODO reuse MockedHost::selfdestruct.
194
197
195
198
transfer (accounts[_addr], accounts[_beneficiary], convertFromEVMC (accounts[_addr].balance ));
196
- accounts. erase (_addr);
197
- // Record self destructs
198
- recorded_selfdestructs. push_back ({ _addr, _beneficiary} );
199
+
200
+ // Record self destructs. Clearing will be done in newTransactionFrame().
201
+ MockedHost::selfdestruct ( _addr, _beneficiary);
199
202
}
200
203
201
204
void EVMHost::recordCalls (evmc_message const & _message) noexcept
0 commit comments