mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
86 lines
2.3 KiB
C++
86 lines
2.3 KiB
C++
#include <test/tools/ossfuzz/abiV2FuzzerCommon.h>
|
|
|
|
#include <liblangutil/Exceptions.h>
|
|
#include <liblangutil/SourceReferenceFormatter.h>
|
|
|
|
using namespace solidity::test::abiv2fuzzer;
|
|
|
|
SolidityCompilationFramework::SolidityCompilationFramework(langutil::EVMVersion _evmVersion)
|
|
{
|
|
m_evmVersion = _evmVersion;
|
|
}
|
|
|
|
solidity::bytes SolidityCompilationFramework::compileContract(
|
|
std::string const& _sourceCode,
|
|
std::string const& _contractName,
|
|
std::map<std::string, solidity::util::h160> const& _libraryAddresses,
|
|
frontend::OptimiserSettings _optimization
|
|
)
|
|
{
|
|
std::string sourceCode = _sourceCode;
|
|
m_compiler.setSources({{"", sourceCode}});
|
|
m_compiler.setLibraries(_libraryAddresses);
|
|
m_compiler.setEVMVersion(m_evmVersion);
|
|
m_compiler.setOptimiserSettings(_optimization);
|
|
if (!m_compiler.compile())
|
|
{
|
|
langutil::SourceReferenceFormatter formatter(std::cerr, false, false);
|
|
|
|
for (auto const& error: m_compiler.errors())
|
|
formatter.printExceptionInformation(
|
|
*error,
|
|
formatter.formatErrorInformation(*error)
|
|
);
|
|
std::cerr << "Compiling contract failed" << std::endl;
|
|
}
|
|
evmasm::LinkerObject obj = m_compiler.object(
|
|
_contractName.empty() ?
|
|
m_compiler.lastContractName() :
|
|
_contractName
|
|
);
|
|
return obj.bytecode;
|
|
}
|
|
|
|
bool AbiV2Utility::isOutputExpected(
|
|
uint8_t const* _result,
|
|
size_t _length,
|
|
std::vector<uint8_t> const& _expectedOutput
|
|
)
|
|
{
|
|
if (_length != _expectedOutput.size())
|
|
return false;
|
|
|
|
return (memcmp(_result, _expectedOutput.data(), _length) == 0);
|
|
}
|
|
|
|
evmc_message AbiV2Utility::initializeMessage(bytes const& _input)
|
|
{
|
|
// Zero initialize all message fields
|
|
evmc_message msg = {};
|
|
// Gas available (value of type int64_t) is set to its maximum
|
|
// value.
|
|
msg.gas = std::numeric_limits<int64_t>::max();
|
|
msg.input_data = _input.data();
|
|
msg.input_size = _input.size();
|
|
return msg;
|
|
}
|
|
|
|
evmc::result AbiV2Utility::executeContract(
|
|
EVMHost& _hostContext,
|
|
bytes const& _functionHash,
|
|
evmc_address _deployedAddress
|
|
)
|
|
{
|
|
evmc_message message = initializeMessage(_functionHash);
|
|
message.destination = _deployedAddress;
|
|
message.kind = EVMC_CALL;
|
|
return _hostContext.call(message);
|
|
}
|
|
|
|
evmc::result AbiV2Utility::deployContract(EVMHost& _hostContext, bytes const& _code)
|
|
{
|
|
evmc_message message = initializeMessage(_code);
|
|
message.kind = EVMC_CREATE;
|
|
return _hostContext.call(message);
|
|
}
|