public void complete(final MessageFrame frame, final MessageFrame childFrame) {
    frame.setState(MessageFrame.State.CODE_EXECUTING);

    final long outputOffset = outputDataOffset(frame);
    final long outputSize = outputDataLength(frame);
    final Bytes outputData = childFrame.getOutputData();

    if (outputSize > outputData.size()) {
      frame.expandMemory(outputOffset, outputSize);
      frame.writeMemory(outputOffset, outputData.size(), outputData, true);
    } else if (outputSize > 0) {
      frame.writeMemory(outputOffset, outputSize, outputData, true);
    }

    frame.setReturnData(outputData);
    frame.addLogs(childFrame.getLogs());
    frame.addSelfDestructs(childFrame.getSelfDestructs());
    frame.addCreates(childFrame.getCreates());

    final long gasRemaining = childFrame.getRemainingGas();
    frame.incrementRemainingGas(gasRemaining);

    frame.popStackItems(getStackItemsConsumed());
    Bytes resultItem;

    resultItem = getCallResultStackItem(childFrame);
    frame.pushStackItem(resultItem);

    final int currentPC = frame.getPC();
    frame.setPC(currentPC + 1);
  }
Complete.

@param frame the frame
@param childFrame the child frame
evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCallOperation.java