# STEM - Break Down of components
Strategic Tokenized Engagement Model
System for Transparent and Efficient Management
Send Tacos Every Monday
Super Terrible Election Memes
intial imp
https://github.com/dekanbro/stem/tree/main/src
## Contest Contract (main)
vote struct
- bool released; // has released vote freeing vote points
- address voter; // msg.sender
- uint152 amount; // amount in vote
- uint32 votededAt; // timestamp
- uint48/bytes32 choiceId; // hash/CID/URI
- uint16 voteId; // uid
// use array so we can iterate through results
votes array
// so we can itterate for a specific voter
voterToVoteIds mapping
// keep track of votes spent and current open balance
voterCurrentBalance mapping
// is it worth storing all choice ids in a mapping?
// is it worth storing choice balances in a mapping?
// so we can itterate through votes on a choice
choiceToVoteIds mapping
choiceTotalBalance mapping
// functions
vote
release
// helper functions that interface with modules
// ...
// getters
getVotesForAddress
// sorting and suming could be $$
// maybe external
// ui considerations
getTotalVotesForChoice
getOrderedResults
### Modules
> a module is used to create flexible conditions around the main events of a contest. > Template/singletons should have a standard setUp interface.
- address template
- bytes initialConfig
> *Alternatly this could use contract inheritance for one offs instead of a factory pattern
needed interfaces
- points token contract (to get user balance)
- end condition contract (to get if contest is active)
- start condition (to get if contest is active)
- vote condition (to check if points holder can vote)
- execution condition (this could be an external extention)
**claim conditions: Points contract** return claim balance, isClaimed, claims mapping
- current ERC20 (staking,snapshot,delegation/checkpoint, hodl indurance, conviction?)
- custom erc20 (airdrop/merkle/offchain)
- points
- use token vote/delegation like comp/oz/baal erc20votes
**end condtions**
- timestamp
- threshold vote participation
- external condition (LP, token price oracle, ...)
- veto/cancel
**start condtions**
- timestamp
- threshold claim participation
- external condition (LP, token price oracle, ...)
**vote conditions**
- threshold
- hodl
**winner conditions**
// this actually would be handled in the execution module
### Extentions
extentions are external contracts that are dependent on the contest contract
examples:
- reward contract - execution based on winer conditions (end condition / total votes)
- voting yeild based on votedAt
- staking contract
- choice curation registry
## Choice Curation Registry Contract (options / content)
validChoice struct
- bytes32 hash/uri (CID, HASH)
- bytes data
allowlists
...
## Factory / higher order summoner
summons a contest factory with module configurations, module templates. Potential deploy extentions