main
branch contains the straight forward solution using markel trees.
A hacky solution can be found in the customToken
branch where instead of merkel trees the contract uses the customToken balance to keep track of eligible addresses and their message status.