Thanks for the explanation of how collateral works! Since you're wrapping it up, here's some trivial stuff:
I noticed in processmessage() for "dsa", there's a version check:
pfrom->nVersion != darkSendPool.MIN_PEER_PROTO_VERSION
with a constant that is a bit confusingly named, maybe it should be named PEER_PROTO_VERSION since it must be an exact match
I get confused easy!
Also, there are a lot of logprintf messages in RegisterAsMasterNode() that don't have newlines, and the port check in there does exit() instead of what seems like it should be doing is returning.
There's a typo in the logmessage in main.cpp near line 4098 ( transactione )
<edit>
after 1 DS round, my clients get stuck in state 7, so doautomaticdenominate aborts. in CDarkSendPool::Check() where it's supposed to reset after 10 seconds, the state check passes, but not enough time has passed. This check seems to be done only once, so the reset doesn't happen. this could be due to my odd configuration: I have a masternode and 3 clients that I'm forcing to connect to my masternode, all on the same machine. If i restart the clients they work again for 1 round, also works if I just put a sleep for 10sec after checking only for state and not time.