---
# System prepended metadata

title: 'Educational Meme Token Launcher :: Implementation Notes'
tags: [' product', ' Product']

---

# Educational Meme Token Launcher :: Implementation Notes

## Contracts

WIP PR
- https://github.com/dh-edu-token-defi/hos/pull/2

### Standardized Shaman interfaces

> Base interface

**IShaman**
    └── IERC165
    
> Base Shaman flavour interfaces

**IShaman**
├── IAdminShaman
├── IManagerShaman
└── IGovernorShaman
    
> Base Shaman contract

**ShamanBase**
├── IShaman
├── ContextUpgradeable
├── ReentrancyGuardUpgradeable
└── ERC165Upgradeable

**AdminShaman**
├── IAdminShaman
└── ShamanBase
**ManagerShaman**
├── IManagerShaman
└── ShamanBase
**GovernorShaman**
├── IGovernorShaman
└── ShamanBase
**ZodiacModuleShaman**
├── ZodiacModule
|--------    └── Module (Zodiac)
└── ShamanBase

### Yeet24ShamanModule updates

**Yeet24ShamanModule**
├── IYeet24Shaman
├── ZodiacModuleShaman
├── AdminShaman
└── ManagerShaman

- Contract **MUST** be added as both Shaman and Safe module
- Shaman **MUST** have *admin* and *manager* privileges
- `execute` function can be called when the following conditions apply:
    - it has not been executed already (`executed` flag)
    - `block.timestamp >= expiration`
    - `yeethBalance >= threshold`
- Actions performed within the `execute` function:
    - Using manager privileges, it calls `_baal.mintShares` to double the amount of dao shares. New shares are sent to the shaman.
    - Using admin privileges, it calls `_baal.setAdminConfig` to turn dao shares/loot transferrable.
    - Using zodiacModule privileges, it submits the following multisend instructions to the dao vault:
        - call WETH9 to wrap `yeethBalance`
        - Trasfer wrapped `yeethBalance` to the shaman
        - call `Yeet24ShamanModule.createPoolAndMintPosition`
- Contract events
    - event **Setup**(address indexed baal, address indexed vault, uint256 threshold, uint256 expiration, uint256 poolFee);
    - event **Executed**(address indexed token, uint256 tokenSupply, uint256 ethSupply);
    - event **UniswapPositionCreated***(address indexed pool, uint256 indexed tokenId, uint160 sqrtPriceX96, uint128 liquidity, uint256 amount0, uint256 amount1);
- `createPoolAndMintPosition` (callable only by the dao vault) is in charge of initializing the Uni3 pool and minting a new position with collected ETH and token shares.

### HOS Summoner updates

- Update saltNonce generation for shaman deployments

```
bytes32 salt = keccak256(
    abi.encodePacked(
        baalAddress,
        i,
        shamanTemplates[i],
        shamanPermissions[i],
        keccak256(initShamanDeployParams[i]),
        saltNonce
    )
);
```
- Use new standard shaman interface
- Other minor code cleaning/refactoring


### TODOs

- Better logic on handling allowedlist shaman templates in HOS summoner
---
- better requirements
- naming convention on HOS referrer and some extra events


## data indexing
// todo 
- [x] add referrer event to dao/yeeter for UI filtering
  - https://github.com/yeet-haus/subgraph/tree/sk/meme-yeeter


test end point
https://api.studio.thegraph.com/query/73494/yeeter-sepolia/0.0.3


example query
```gql
{
  yeeters(first: 500, 
  where:{dao_:{referrer:"DHYeet24ShamanSummoner"}}) {
    id
    dao {
      referrer
    }
  }
}
```

current referrers:
DHYeet24ShamanSummoner
YeeterShamanDaoSummoner

## ui
// general
- default/selected chain handling for explore
    - currently hard coded on DEFAULT_CHAIN_ID all over the place

// landing
- pagination on yeeter lists

/ hooks
- [x] useYeeters
    - update to filter on referrer
    - sort in the hook (active, closed, coming soon)
- [x] useYeeter
    - [x] get some dao details here
    - [x] state helpers (status, time left)
    - [ ] can we show FEE SPLITS - *stretch*
        - add rpc calls
        - feeAmounts + feeRecipients
        - is array so need to call in loop until returns 0 - maybe it's own hook
    - [x] get balance from safe / and perc to goal
        - need safe address on yeeter or dao in yeeter subgraph
        - maybe calc percentage to goal (change from balance to safe balance)
- [x] useYeets
    - for the latest in the ticker
- [x] useLatestYeets
    - unscoped to dao for ticker
- [ ] useMarketMaker
    - [x] identify shaman address
    - data transform (can execute,uniswap url) - what else do we need?
- [x] useMyYeeters
    - for the toggle
    - need to query down to yeets or on yeets
- [ ] need a quick way to tell if the user can exit
    - does iuseMyYeeters do this? chekc

- [ ] latest rage quits
    - how to scope to this type of dao?

- other hook items:
- [ ] can we get the dao/token name easier - need the extra query in the hook
        - maybe get the loot token address/name


# ui components

Disclaimer modal
- track id user has accepted - local storage
- content around education only
- open on any page visit

What is this? modal
- [x] add from button on homepage
- [ ] todo: better content

Yeet list
- [x] horizontal scroll/layout
- [ ] motion - not defined but some autscroll possible with package
        - https://github.com/YIZHUANG/react-multi-carousel
- [ ] toggle to 'mine only'
- [ ] might need to poll to update quicker if/when there is usage

Marquee 
- [x] https://github.com/justin-chu/react-fast-marquee
- [ ] rage quit hook
- [ ] get token name in hooks


Yeet card
- [x] layout and basic data display
- [ ] state indicators
    - new
    - ending soon
    - coming soon
- [ ] switch dao name to loot token name (in query/hooks 1st)
- [ ] better image formatting - maybe circle? handle different dimensions
- actions
    - view details
    - yeet - link to detail page or open form in a modal
    - swap - if executed link to pool
    - exit - link to detail or open form in modal

Yeet detail display
- layout and data display
- states
    - fail, upcoming, success, active

Yeet button
- opens yeet form in modal
- migrate legos from yeeter app

Exit button
- RQ tx
- default to native tokens and 100%

Execute LP
- New Execute tx on marketmaker
- need logic to be enabled if after yeet period and goal reached

Swap button
- external link
- assemble in useMarketMaker hook

Yeets list and card
- useYeets - all scoped to a yeeter
- display messages and address and what they sent?
- look at yeeter app - might be able to copy over

Share button
- copies url to clipboard?
- look into yeet frames on base?

Forms in modals
- migrate legos from yeeter app
- can we use better markdown field from din


## Documentation
TBD

## Token mech ideas

### 
yeet fees go into a shared pool that rewards successful yeets. 
- would compound as more yeets are attempted and some fail. 
- create incentive for pre sale participants
- creates volatility with new pool
- could be used to incentives first successfull yeets with garunteed max reward (if pool is bootstrapped with some funds)

example: 10% fee on yeet
- 9% to shared reward pool (more of a yeet deposit)
- 1% to yeeter/ph dev

on success (meets threshold in time window)
- claim reward before execute on transfer % to safe (min 9%, max ??)
- execute then creates a pool with more native funds

will need a new contract/module that tallies rewards for claims. this could be on a meme DAO as well
    

## Resources

wires
https://www.figma.com/design/gyvEAkOsFyhMx7MWzmxKxh/Untitled?node-id=16%3A12&t=xs8QbHFr2EDVgRLL-1

repo
https://github.com/dh-edu-token-defi


