private MessageFrame createMessageFrame(
      final Address callAddress,
      final WorldUpdater worldUpdater,
      final ProcessableBlockHeader blockHeader,
      final BlockHashLookup blockHashLookup,
      final Bytes inputData) {

    final Optional<Account> maybeContract = Optional.ofNullable(worldUpdater.get(callAddress));
    final AbstractMessageProcessor processor =
        mainnetTransactionProcessor.getMessageProcessor(MessageFrame.Type.MESSAGE_CALL);

    return MessageFrame.builder()
        .maxStackSize(DEFAULT_MAX_STACK_SIZE)
        .worldUpdater(worldUpdater)
        .initialGas(SYSTEM_CALL_GAS_LIMIT)
        .originator(SYSTEM_ADDRESS)
        .gasPrice(Wei.ZERO)
        .blobGasPrice(Wei.ZERO)
        .value(Wei.ZERO)
        .apparentValue(Wei.ZERO)
        .blockValues(blockHeader)
        .completer(__ -> {})
        .miningBeneficiary(Address.ZERO) // Confirm this
        .type(MessageFrame.Type.MESSAGE_CALL)
        .address(callAddress)
        .contract(callAddress)
        .inputData(inputData)
        .sender(SYSTEM_ADDRESS)
        .blockHashLookup(blockHashLookup)
        .code(
            maybeContract
                .map(c -> processor.getCodeFromEVM(c.getCodeHash(), c.getCode()))
                .orElse(CodeV0.EMPTY_CODE))
        .build();
  }
Processes a system call.

@param callAddress The address to call.
@param context The system call context. The input data to the system call.
@param inputData The input data to the system call.
@return The output of the system call.
ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java