On-chain, Eq is a marker: the compiler always lowers === and Eq-based operations (List.contains, List.distinct, Option.contains, ...) to structural equality of the arguments' runtime representation — the instance body is never called. For that to be sound, every Eq instance must implement structural equality (eq(a, b) iff a.toData == b.toData). The compiler plugin therefore rejects hand-written instances in on-chain code: use Eq.derived, or Eq.structural to assert that a function is structural equality.
Conjunction of two Eq instances. Produces a potentially non-structural instance, so not available in on-chain code: on-chain equality is always structural (see Eq).
Conjunction of two Eq instances. Produces a potentially non-structural instance, so not available in on-chain code: on-chain equality is always structural (see Eq).
Refine equality by a projection. Produces a potentially non-structural instance, so not available in on-chain code: on-chain equality is always structural (see Eq).
Refine equality by a projection. Produces a potentially non-structural instance, so not available in on-chain code: on-chain equality is always structural (see Eq).