Proof using map_congr.
move => H_net_eq net failed tr H_st.
have ->: net = snd (failed, net) by [].
remember step_ordered_failure_init as y in H_st.
move: Heqy.
induction H_st using refl_trans_1n_trace_n1_ind => /= H_init.
rewrite H_init /=.
exists [].
rewrite tot_s_init_handlers_eq.
exact: RT1nTBase.
concludes.
rewrite H_init {H_init x} in H_st1 H_st2.
case: x' H IHH_st1 H_st1 => failed' net'.
case: x'' H_st2 => failed'' net''.
rewrite /=.
move => H_step2 H IHH_step1 H_step1.
have [tr' H_star] := IHH_step1.
have H_st := step_ordered_failure_tot_one_mapped_simulation_1 H_net_eq H_step1 H.
case: H_st => H_st; first by rewrite -H_st; exists tr'.
have [tr'' H_st'] := H_st.
exists (tr' ++ tr'').
apply: (refl_trans_1n_trace_trans H_star).
have ->: tr'' = tr'' ++ [] by rewrite -app_nil_end.
apply RT1nTStep with (x' := (tot_s_map_data (onwState net'' me))) => //.
exact: RT1nTBase.
Qed.
Context {new_msg : NewMsgParams multi}.
Definition step_ordered_dynamic_failure_tot_s_net_handlers_eq :=
forall net failed tr src m ms d out st' ps out' st'',
step_ordered_dynamic_failure_star step_ordered_dynamic_failure_init (failed, net) tr ->
odnwPackets net src me = m :: ms ->
~ In me failed ->
odnwState net me = Some d ->
net_handlers me src m d = (out, st', ps) ->
input_handler (tot_s_map_msg me src m) (tot_s_map_data d) = (out', st'') ->
map tot_s_map_output out = out' /\ tot_s_map_data st' = st''.

(* Specifications: *)
Theorem step_ordered_dynamic_failure_tot_one_mapped_simulation_1 :
step_ordered_dynamic_failure_tot_s_net_handlers_eq ->
forall net net' failed failed' tr tr',
step_ordered_dynamic_failure_star step_ordered_dynamic_failure_init (failed, net) tr ->
step_ordered_dynamic_failure (failed, net) (failed', net') tr' ->
forall d, net.(odnwState) me = Some d ->
forall d', net'.(odnwState) me = Some d' ->
d = d' \/ exists tr'', @step_s _ single (tot_s_map_data d) (tot_s_map_data d') tr''.