Expect mature clients to abstract this complexity down to 2 (maker/taker).
Then, drive the protocol sequence and optional features based on declarative options and terms set by the maker, using logical defaults if not over-ridden by the maker.
Takers simply let makers compete, and don't have much wiggle room to negotiate. Makers can optionally list choices or flexibility in their terms.
An idea for this...
Split this protocol into 4 roles, then design accordingly, such that the maker declares two things.
4 Roles4 Roles
Expect mature clients to abstract this complexity down to 2 (maker/taker).
Then, drive the protocol sequence and optional features based on declarative options and terms set by the maker, using logical defaults if not over-ridden by the maker.
Takers simply let makers compete, and don't have much wiggle room to negotiate. Makers can optionally list choices or flexibility in their terms.