mMITOc
Collateral Vault with Variable Exchange Rate
ERC4626 Vault that accepts WMITO as collateral and issues mMITOc shares.


Basic Info
| Field | Value |
|---|---|
| Standard | ERC4626 |
| Underlying Asset | WMITO |
| Share Token | mMITOc |
| Withdrawal Wait | 7 days |
| Slashing Exposure | Yes |
Mechanism
Share Calculation
shares = assets × totalSupply / totalAssets
assets = shares × totalAssets / totalSupplytotalAssets reflects collateral value reported by Oracle. Decreases when slashing occurs.
Deposit
- User deposits WMITO
- Vault mints mMITOc at current exchange rate
- Vault delegates WMITO as collateral to validators
totalCollateralDepositedincreases
Slashing Detection
_syncCollateralWithOracle() function syncs with Oracle:
bookValue = validatorCollateral[validator] // Book value
oracleValue = COLLATERAL_ORACLE.getCollateralOwnership(...) // Oracle reported value
if (oracleValue < bookValue) {
// Slashing occurred
loss = bookValue - oracleValue
totalAssets -= loss
// Exchange rate drops
}Exchange Rate Change Example
Initial state:
├─ totalAssets: 1000 WMITO
├─ totalSupply: 1000 mMITOc
└─ Rate: 1 mMITOc = 1 WMITO
After 10% slashing:
├─ totalAssets: 900 WMITO (Oracle reported)
├─ totalSupply: 1000 mMITOc (unchanged)
└─ Rate: 1 mMITOc = 0.9 WMITOReward Distribution
Reward flow (mMITOc only):
Collateral Oracle → RewardRouter → gmMITO Vault
↓
"Dividend of provided collateral"RewardRoutercalculates dividend based on collateral provided- Receives collateral info feed from
Collateral Oracle - Rewards distributed as gmMITO
Rewards accumulated separately from share value:
struct RewardState {
uint256 rewardPerShareStored; // Accumulated rewards per share
mapping(address => uint256) userRewardPerSharePaid; // User's last settlement point
mapping(address => uint256) rewards; // User's unclaimed rewards
}Reward calculation:
earned = balanceOf(user) × (rewardPerShareStored - userRewardPerSharePaid[user])Withdrawal
- User requests withdrawal (mMITOc burned)
- WithdrawalNFT minted
- Wait 7 days
- After maturity, burn NFT and receive WMITO
struct WithdrawalState {
uint256 pendingWithdrawals; // Number of pending withdrawals
uint256 totalPendingWithdrawal; // Total pending withdrawal amount
Checkpoints.History exchangeRateHistory; // Exchange rate history (for slashing tracking)
}State Variables
struct CollateralData {
uint256 totalCollateralDeposited; // Total deposited collateral
mapping(address validator => uint256) validatorCollateral; // Collateral per validator
mapping(address validator => uint256) lastSyncedOracleValue; // Last Oracle value
}Integrated Contracts
| Contract | Purpose |
|---|---|
WMITO | Underlying asset |
GM_MITO | Reward token (gmMITO) |
COLLATERAL_ORACLE | Collateral state Oracle |
VALIDATOR_MANAGER | Validator management |
WITHDRAWAL_NFT | Withdrawal NFT |
REWARD_ROUTER | Reward distributor |