I just sent myself DB read and write ops (ecash in, ecash out) via nostr dm's and replayed them during sync. It was fun to watch, haven't progressed since then though.
A wallet basically only holds ecash.
It can have three states: unspent, pending (in a tx right now), and spent. Spent can be deleted. Token goes from unspent, to pending, to spent during a successful spend operation.
The DB operations are crud. If the state of a token could be "flipped" in the relay's db (so that the wallet can filter for the state), a fresh sync could be very painless.