pub fn execute<Mode: ExecutionMode>(
    protocol_config: &ProtocolConfig,
    metrics: Arc<LimitsMetrics>,
    vm: &MoveVM,
    state_view: &mut dyn ExecutionState,
    tx_context: Rc<RefCell<TxContext>>,
    gas_charger: &mut GasCharger,
    pt: ProgrammableTransaction,
    trace_builder_opt: &mut Option<MoveTraceBuilder>,
) -> ResultWithTimings<Mode::ExecutionResults, ExecutionError>