Nice, it is much better organized that way. I would just like to clarify my understanding of these specific asserts.
From the diff:
// Txid and Wtxid are distinct types and cannot be compared with each other
static_assert(!std::equality_comparable_with<TxidView, WtxidView>);
static_assert(!std::equality_comparable_with<Txid, Wtxid>);
My understanding is that the comment implies these assertions guarantee both that Txid and Wtxid are distinct types and that no cross-type comparison expressions are valid. However, std::equality_comparable_with would remain false even if all cross-type == and != expressions became valid, as long as the types still lacked a common reference type. Is the purpose of this section simply to verify that Txid and Wtxid do not model std::equality_comparable_with, or is it to also enforce the stronger condition that no cross-type comparisons are possible?
If the objective is to verify the stronger condition, I suppose the asserts would look similar to this:
template <typename T, typename U>
concept HasAnyEqualityComparison =
requires(const T& t, const U& u) { t == u; } ||
requires(const T& t, const U& u) { u == t; } ||
requires(const T& t, const U& u) { t != u; } ||
requires(const T& t, const U& u) { u != t; };
static_assert(!std::same_as<TxidView, WtxidView>);
static_assert(!std::same_as<Txid, Wtxid>);
static_assert(!HasAnyEqualityComparison<TxidView, WtxidView>);
static_assert(!HasAnyEqualityComparison<Txid, Wtxid>);
I might be reading too much into it, though.