/-- The universal lift from a morphism `R →* T`, which maps elements of `S` to units of `T`,
to a morphism `R[S⁻¹] →* T`. -/
def universalMulHom : R[S⁻¹] →* T
    where
  -- Porting note: `simp only []` required for beta reductions
  toFun x :=
    x.liftExpand (fun r s => f r * ((fS s)⁻¹ : Units T)) fun r t s ht => by
      simp only []
      have : (fS ⟨s * t, ht⟩ : T) = fS s * f t := by
        simp only [← hf, MonoidHom.map_mul]
      conv_rhs =>
        rw [MonoidHom.map_mul, ← mul_one (f r), ← Units.val_one, ← mul_left_inv (fS s)]
        rw [Units.val_mul, ← mul_assoc, mul_assoc _ (fS s : T), ← this, mul_assoc]
      simp only [mul_one, Units.mul_inv]
  map_one' := by simp only []; rw [OreLocalization.one_def, liftExpand_of]; simp
  map_mul' x y := by
    

Proof state:
R : Type u_1
inst✝² : Monoid R
S : Submonoid R
inst✝¹ : OreSet S
T : Type u_2
inst✝ : Monoid T
f : R →* T
fS : ↥S →* Tˣ
hf : ∀ (s : ↥S), f ↑s = ↑(fS s)
x y : OreLocalization R S
⊢ OneHom.toFun
      {
        toFun := fun x =>
          liftExpand (fun r s => f r * ↑(fS s)⁻¹)
            (_ :
              ∀ (r t : R) (s : ↥S) (ht : ↑s * t ∈ S),
                (fun r s => f r * ↑(fS s)⁻¹) r s =
                  (fun r s => f r * ↑(fS s)⁻¹) (r * t) { val := ↑s * t, property := ht })
            x,
        map_one' :=
          (_ :
            (fun x =>
                  liftExpand (fun r s => f r * ↑(fS s)⁻¹)
                    (_ :
                      ∀ (r t : R) (s : ↥S) (ht : ↑s * t ∈ S),
                        (fun r s => f r * ↑(fS s)⁻¹) r s =
                          (fun r s => f r * ↑(fS s)⁻¹) (r * t) { val := ↑s * t, property := ht })
                    x)
                1 =
              1) }
      (x * y) =
    OneHom.toFun
        {
          toFun := fun x =>
            liftExpand (fun r s => f r * ↑(fS s)⁻¹)
              (_ :
                ∀ (r t : R) (s : ↥S) (ht : ↑s * t ∈ S),
                  (fun r s => f r * ↑(fS s)⁻¹) r s =
                    (fun r s => f r * ↑(fS s)⁻¹) (r * t) { val := ↑s * t, property := ht })
              x,
          map_one' :=
            (_ :
              (fun x =>
                    liftExpand (fun r s => f r * ↑(fS s)⁻¹)
                      (_ :
                        ∀ (r t : R) (s : ↥S) (ht : ↑s * t ∈ S),
                          (fun r s => f r * ↑(fS s)⁻¹) r s =
                            (fun r s => f r * ↑(fS s)⁻¹) (r * t) { val := ↑s * t, property := ht })
                      x)
                  1 =
                1) }
        x *
      OneHom.toFun
        {
          toFun := fun x =>
            liftExpand (fun r s => f r * ↑(fS s)⁻¹)
              (_ :
                ∀ (r t : R) (s : ↥S) (ht : ↑s * t ∈ S),
                  (fun r s => f r * ↑(fS s)⁻¹) r s =
                    (fun r s => f r * ↑(fS s)⁻¹) (r * t) { val := ↑s * t, property := ht })
              x,
          map_one' :=
            (_ :
              (fun x =>
                    liftExpand (fun r s => f r * ↑(fS s)⁻¹)
                      (_ :
                        ∀ (r t : R) (s : ↥S) (ht : ↑s * t ∈ S),
                          (fun r s => f r * ↑(fS s)⁻¹) r s =
                            (fun r s => f r * ↑(fS s)⁻¹) (r * t) { val := ↑s * t, property := ht })
                      x)
                  1 =
                1) }
        y

Next tactic:
simp only []