mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Update EVMHost to match EVMC10 changes
This commit is contained in:
@@ -83,31 +83,32 @@ evmc_message EvmoneUtility::initializeMessage(bytes const& _input)
|
||||
return msg;
|
||||
}
|
||||
|
||||
evmc::result EvmoneUtility::executeContract(
|
||||
evmc::Result EvmoneUtility::executeContract(
|
||||
bytes const& _functionHash,
|
||||
evmc_address _deployedAddress
|
||||
)
|
||||
{
|
||||
evmc_message message = initializeMessage(_functionHash);
|
||||
message.destination = _deployedAddress;
|
||||
message.recipient = _deployedAddress;
|
||||
message.code_address = _deployedAddress;
|
||||
message.kind = EVMC_CALL;
|
||||
return m_evmHost.call(message);
|
||||
}
|
||||
|
||||
evmc::result EvmoneUtility::deployContract(bytes const& _code)
|
||||
evmc::Result EvmoneUtility::deployContract(bytes const& _code)
|
||||
{
|
||||
evmc_message message = initializeMessage(_code);
|
||||
message.kind = EVMC_CREATE;
|
||||
return m_evmHost.call(message);
|
||||
}
|
||||
|
||||
evmc::result EvmoneUtility::deployAndExecute(
|
||||
evmc::Result EvmoneUtility::deployAndExecute(
|
||||
bytes const& _byteCode,
|
||||
string const& _hexEncodedInput
|
||||
)
|
||||
{
|
||||
// Deploy contract and signal failure if deploy failed
|
||||
evmc::result createResult = deployContract(_byteCode);
|
||||
evmc::Result createResult = deployContract(_byteCode);
|
||||
solAssert(
|
||||
createResult.status_code == EVMC_SUCCESS,
|
||||
"SolidityEvmoneInterface: Contract creation failed"
|
||||
@@ -115,7 +116,7 @@ evmc::result EvmoneUtility::deployAndExecute(
|
||||
|
||||
// Execute test function and signal failure if EVM reverted or
|
||||
// did not return expected output on successful execution.
|
||||
evmc::result callResult = executeContract(
|
||||
evmc::Result callResult = executeContract(
|
||||
util::fromHex(_hexEncodedInput),
|
||||
createResult.create_address
|
||||
);
|
||||
@@ -128,7 +129,7 @@ evmc::result EvmoneUtility::deployAndExecute(
|
||||
return callResult;
|
||||
}
|
||||
|
||||
evmc::result EvmoneUtility::compileDeployAndExecute(string _fuzzIsabelle)
|
||||
evmc::Result EvmoneUtility::compileDeployAndExecute(string _fuzzIsabelle)
|
||||
{
|
||||
map<string, h160> libraryAddressMap;
|
||||
// Stage 1: Compile and deploy library if present.
|
||||
@@ -139,7 +140,7 @@ evmc::result EvmoneUtility::compileDeployAndExecute(string _fuzzIsabelle)
|
||||
solAssert(compilationOutput.has_value(), "Compiling library failed");
|
||||
CompilerOutput cOutput = compilationOutput.value();
|
||||
// Deploy contract and signal failure if deploy failed
|
||||
evmc::result createResult = deployContract(cOutput.byteCode);
|
||||
evmc::Result createResult = deployContract(cOutput.byteCode);
|
||||
solAssert(
|
||||
createResult.status_code == EVMC_SUCCESS,
|
||||
"SolidityEvmoneInterface: Library deployment failed"
|
||||
|
||||
@@ -122,7 +122,7 @@ public:
|
||||
/// and executing test configuration.
|
||||
/// @param _isabelleData contains encoding data to be passed to the
|
||||
/// isabelle test entry point.
|
||||
evmc::result compileDeployAndExecute(std::string _isabelleData = {});
|
||||
evmc::Result compileDeployAndExecute(std::string _isabelleData = {});
|
||||
/// Compares the contents of the memory address pointed to
|
||||
/// by `_result` of `_length` bytes to u256 zero.
|
||||
/// @returns true if `_result` is zero, false
|
||||
@@ -138,17 +138,17 @@ private:
|
||||
/// @returns the result of the execution of the function whose
|
||||
/// keccak256 hash is @param _functionHash that is deployed at
|
||||
/// @param _deployedAddress in @param _hostContext.
|
||||
evmc::result executeContract(
|
||||
evmc::Result executeContract(
|
||||
bytes const& _functionHash,
|
||||
evmc_address _deployedAddress
|
||||
);
|
||||
/// @returns the result of deployment of @param _code on @param _hostContext.
|
||||
evmc::result deployContract(bytes const& _code);
|
||||
evmc::Result deployContract(bytes const& _code);
|
||||
/// Deploys and executes EVM byte code in @param _byteCode on
|
||||
/// EVM Host referenced by @param _hostContext. Input passed
|
||||
/// to execution context is @param _hexEncodedInput.
|
||||
/// @returns result returning by @param _hostContext.
|
||||
evmc::result deployAndExecute(
|
||||
evmc::Result deployAndExecute(
|
||||
bytes const& _byteCode,
|
||||
std::string const& _hexEncodedInput
|
||||
);
|
||||
|
||||
@@ -87,11 +87,11 @@ DEFINE_PROTO_FUZZER(Program const& _input)
|
||||
return;
|
||||
}
|
||||
|
||||
evmc::result deployResult = YulEvmoneUtility{}.deployCode(unoptimisedByteCode, hostContext);
|
||||
evmc::Result deployResult = YulEvmoneUtility{}.deployCode(unoptimisedByteCode, hostContext);
|
||||
if (deployResult.status_code != EVMC_SUCCESS)
|
||||
return;
|
||||
auto callMessage = YulEvmoneUtility{}.callMessage(deployResult.create_address);
|
||||
evmc::result callResult = hostContext.call(callMessage);
|
||||
evmc::Result callResult = hostContext.call(callMessage);
|
||||
// If the fuzzer synthesized input does not contain the revert opcode which
|
||||
// we lazily check by string find, the EVM call should not revert.
|
||||
bool noRevertInSource = yul_source.find("revert") == string::npos;
|
||||
@@ -132,13 +132,13 @@ DEFINE_PROTO_FUZZER(Program const& _input)
|
||||
|
||||
// Reset host before running optimised code.
|
||||
hostContext.reset();
|
||||
evmc::result deployResultOpt = YulEvmoneUtility{}.deployCode(optimisedByteCode, hostContext);
|
||||
evmc::Result deployResultOpt = YulEvmoneUtility{}.deployCode(optimisedByteCode, hostContext);
|
||||
solAssert(
|
||||
deployResultOpt.status_code == EVMC_SUCCESS,
|
||||
"Evmone: Optimized contract creation failed"
|
||||
);
|
||||
auto callMessageOpt = YulEvmoneUtility{}.callMessage(deployResultOpt.create_address);
|
||||
evmc::result callResultOpt = hostContext.call(callMessageOpt);
|
||||
evmc::Result callResultOpt = hostContext.call(callMessageOpt);
|
||||
if (noRevertInSource)
|
||||
solAssert(
|
||||
callResultOpt.status_code != EVMC_REVERT,
|
||||
|
||||
@@ -38,7 +38,7 @@ bytes YulAssembler::assemble()
|
||||
return m_stack.assemble(YulStack::Machine::EVM).bytecode->bytecode;
|
||||
}
|
||||
|
||||
evmc::result YulEvmoneUtility::deployCode(bytes const& _input, EVMHost& _host)
|
||||
evmc::Result YulEvmoneUtility::deployCode(bytes const& _input, EVMHost& _host)
|
||||
{
|
||||
// Zero initialize all message fields
|
||||
evmc_message msg = {};
|
||||
@@ -74,7 +74,8 @@ evmc_message YulEvmoneUtility::callMessage(evmc_address _address)
|
||||
{
|
||||
evmc_message call = {};
|
||||
call.gas = std::numeric_limits<int64_t>::max();
|
||||
call.destination = _address;
|
||||
call.recipient = _address;
|
||||
call.code_address = _address;
|
||||
call.kind = EVMC_CALL;
|
||||
return call;
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ private:
|
||||
struct YulEvmoneUtility
|
||||
{
|
||||
/// @returns the result of deploying bytecode @param _input on @param _host.
|
||||
static evmc::result deployCode(solidity::bytes const& _input, EVMHost& _host);
|
||||
static evmc::Result deployCode(solidity::bytes const& _input, EVMHost& _host);
|
||||
/// @returns call message to be sent to @param _address.
|
||||
static evmc_message callMessage(evmc_address _address);
|
||||
/// @returns true if call result indicates a serious error, false otherwise.
|
||||
|
||||
Reference in New Issue
Block a user