--- tags: v3 --- # Baal UX Worksession Notes (WIP) Notes from the Baal UX worksession: overview and Baal lifecycle ## Overview - Baal docs from end of July -- need updates - Baal is a mix a Minion (Moloch v2) and a token contract - Lots of flexibility from this - There is a new *delegation* feature - **Shamans** are also new -- these are essentially superpowered Minions - Retains core functionality of Rage Quit, Sponsorship, Guild Kick - Talking about adding spam prevention - Can do proposals to change voting periods and token transferability - Token starts as non-transferable -- is this set at summoning? - Have to launch through Baal -- though there was some discussion about *bring your own token* but didn't make sense for v3 - What do the tokens represent? - Tokens *are shares* -- instead of integer shares, they're accounted in the storage in same way that ERC20 are (and are visible down to 18 decimal) - We can pick and choose what Baal features we want to support and can gradually integrate more over time - Proposals are much more flexible now -- - There is an *everything propsal* now which uses multi-class to do what we want (as opposed to different proposal types) - This could introduce complexity at the subgraph level, but we have more control on the frontend - We could say that a member proposal is a certain set of calls (can define them in this way) since they'd be the same every time - Can add as many functions as they want -- folks can keep tacking on - `multiSend` array -- need to iterate through this and look for relevant function signatures - Subgraph and data model: - Many of same *entities* -- DAO, proposal, vote, member -- pretty similar and can likely be shaped similar to how we have v2 - What about tokens and internal balances for members? - There's no longer a whitelist proposal -- there is whitelisting as an action proposal that calls `baal` and does a `setGuildTokens` - Token effectively needs to be whitelisted in order for it *to be Ragequittable* - Purpose of setting guild tokens is to calcuate Rage Quit - Anyone can send tokens to the Baal, but they're only Ragequittable if they're whitelisted - Internal balances are gone -- this could be an issue -- need to specify which tokens want to be Ragequittable - Rage Quit sends immediately, so do funding proposals ### Shaman - **Yeeter Shaman** - When someone sends x amount of ETH, it automatically assigns a certain set of shares/loot to that person - Bypasses the proposal, instead relies on Shaman's internal logic - Sending ETH/tokens -> assigns set of shares/loot - Yeeter Shaman contract can be set up in a way to have logic: if hits goal -> shares/loot, if not hit goal -> return ETH - The Shaman can only adjust `message.senders` loot and shares right now -- could we make this more flexible? - Need to whitelist each Shaman - Shaman factory -- need a flow to connect Shaman with a DAO - Some Shamans could be *Boosts* -- devs can build Shamans for DAOs and provide to others via Boosts - Shaman requirement exposes an `interface` called `memberAction` that determines how a person's loot or shares should be adjusted (down and up) ## Baal Lifecycle ### Summoning - **Summon deployment config**: - Set voting periods, transferability of loot and shares (these are separate configs -- transferability set separately), initial guild tokens, minimal and maximal voting period, grace period, loot paused, shares paused (look at `Baal.test.ts`) - voting periods can be adjusted at the proposal layer, but a later proposal can change the bounds of these periods - at summon, all summoners delegate to themselves - in Subgraph, may want to start tracking shares and loot as own entity if potentially transferable - At summoning DAO, could choose from previously whitelisted set of Shamans or alternatively could have 1 main Shaman with customizable parameters - Summon Baal and Shaman for different flavors - Can we have a Singleton Shaman? ### Members & Delegation - Can summon with multi-shareholders and multi-lootholders - *Transferable* shares can be sent outside of app (just like other tokens) - Delegates are now different -- similar to Compound way - Unsure if restricted to existing Members or anybody, but in Compound Governor can delegate to anyone (regardless of their holdings) - NFT: For a token to show up, Member has to call `claim` - Each Member claims NFT version of their shares/loot - If Ragequitting, their NFT zeroes out: zero shares and zero loot - If 0 loot and 0 shares it gives an empty token (could potentially make it a husk of an NFT or fail) ### Proposals - Proposals are all *multi-send* encoded -- can *chain together* many things - Can set `votingPeriod`, `proposalData`, `expiration`, `details` - `expiration`: at what block timestamp should this proposal no longer be executable - Do we want this to be hardcoded or should users set it? - If set to 0 there is no expiration on proposal - If sitting it won't block future proposals -- we may need to do some more investigation into why people will care about this setting - `details`: metadata that gets emitted -- don't need to store in the proposal but can still be emitted - Frontend can read via the Subgraph - Challenge: Subgraph parsing the actual `calldata` -- Subgraph can call view functions on contracts - Function that can parse arbitrary call data (similar to Gnosis `MultiSend.sol`) - Subgraph can call the view function with the proposal data from the actual proposal and receive back the parsed information and handle in a legible way in the Subgraph (which avoids having to decode on the frontend) - Benefit is greater gas efficiency in the proposals since we only need to store hash of the neessary information - ### Questions and Thoughts - Ability to change token name and symbol at a later point? - If we're bundling economic and governance rights into one thing it should likely be transferable - Is delegation restricted to existing shareholders in the Baal? - Removing proposal details (only having the hash) from the proposal will save on gas