message: feat/simulate message
  * add function
  * cleaning
  * fix revert prefixing and add test revertmsg
  * write SM
  * debug: progress
  * Remove unnecessary logs
  * Fix typo
  Typo
  * Update contracts/optimistic-ethereum/OVM/execution/OVM_ExecutionManager.sol
diff: @@ -1805,4 +1805,38 @@ contract OVM_ExecutionManager is iOVM_ExecutionManager, Lib_AddressResolver {
  messageRecord.nuisanceGasLeft = 0;
  messageRecord.revertFlag = RevertFlag.DID_NOT_REVERT;
  }
  +
  + /*****************************
  + * L2-only Helper Functions *
  + *****************************/
  +
  + /**
  + * Unreachable helper function for simulating eth_calls with an OVM message context.
  + * This function will throw an exception in all cases other than when used as a custom entrypoint in L2 Geth to simulate eth_call.
  + * @param _transaction the message transaction to simulate.
  + * @param _from the OVM account the simulated call should be from.
  + */
  + function simulateMessage(
  + Lib_OVMCodec.Transaction memory _transaction,
  + address _from,
  + iOVM_StateManager _ovmStateManager
  + )
  + external
  + returns (
  + bool,
  + bytes memory
  + )
  + {
  + // Prevent this call from having any effect unless in a custom-set VM frame
  + require(msg.sender == address(0));
  +
  + ovmStateManager = _ovmStateManager;
  + _initContext(_transaction);
  +
  + messageRecord.nuisanceGasLeft = uint(-1);
  + messageContext.ovmADDRESS = _transaction.entrypoint;
  + messageContext.ovmCALLER = _from;
  +
  + return _transaction.entrypoint.call{gas: _transaction.gasLimit}(_transaction.data);
  + }
  }
  