EVM to other contract calls
How contract calls happen from the EVM side in AppLayer.
For calls from the EVM to another contract, the ContractHost::call()
function plays a crucial role. It is tasked with creating and handling calls to other contracts, encapsulating the complexity of contract interaction within a simple interface:
evmc::Result call(const evmc_message& msg) noexcept final;
This function is designed to handle both C++ and EVM contract calls, as shown below:
evmc::Result ContractHost::call(const evmc_message& msg) noexcept {
evmc::Result result;
const bool isContractCall = isCall(msg);
if (isContractCall) {
this->traceCallStarted(msg);
}
switch (this->decodeContractCallType(msg))
{
case ContractType::CREATE: {
result = this->callEVMCreate(msg);
break;
}
case ContractType::CREATE2: {
result = this->callEVMCreate2(msg);
break;
}
case ContractType::PRECOMPILED: {
result = this->processBDKPrecompile(msg);
break;
}
case ContractType::CPP: {
result = this->callCPPContract(msg);
break;
}
default:
result = this->callEVMContract(msg);
break;
}
if (isContractCall) {
this->traceCallFinished(result.raw());
}
return result;
}
Last updated