Skip to main content

Quick reference for admins, curators, allocators, and sentinels operating an MYT vault.


Contract Structure and Roles

There are four contract layers:

  • MYT Vault (Morpho V2) — holds funds, enforces caps, manages roles
  • Curator Contract — manages strategy registration and cap configuration (one per chain, shared by both MYTs)
  • Allocator Contract — moves funds between the vault and strategy adapters (one per MYT)
  • MYT Strategy — individual yield strategy adapters (one per yield source per MYT)

Each layer has its own role system. Holding a role on one contract does not grant access on another.

Addresses Summary

AddressRoles Held
DAO MultisigMYT Owner · MYT Sentinel · Curator Admin · Curator Operator · Allocator Admin · Allocator Operator · Strategy Owner
Alchemix AssociationMYT Sentinel
EOAMYT Sentinel

Note: The DAO Multisig is not set as a direct Allocator on either MYT vault. Allocator-level MYT functions like setMaxRate() must be called via the Allocator Contract's proxy mechanism (see Proxy Forwarding).


Allocation Flow

Strategy Route Examples

Each strategy configures which allocation and deallocation paths it supports. Using an unsupported route will revert.

Strategyallocate()allocateWithSwap()deallocate()deallocateWithSwap()deallocateWithUnwrapAndSwap()
wstETHYesYesNoYesNo
sfrxETHYesYesNoNoYes

Check the documentation for which direct / swap paths are enabled for this strategy before executing.


Allocate Reference: Amount Encodings

TokenDecimalsExample (1 unit)
USDC61_000_000
wETH181_000_000_000_000_000_000
Relative Cap (100%)181e18

All amounts are uint256.


Liquidity Adapter

The liquidity adapter is the default strategy the vault uses to service user deposits and withdrawals. It is set via setLiquidityAdapterAndData() (Allocator-level, via proxy).

Critical: The liquidity adapter must be a strategy that supports direct (non-swap) deposit and withdrawal paths. Swap-only strategies (e.g., sfrxETH) cannot be set as the liquidity adapter, because user withdraw()/redeem() calls do not pass swap calldata. If no strategy on a given chain supports direct paths, leave the liquidity adapter unset — the vault will operate with idle assets only.


Deallocation Flow


Constructing 0x txData

For swap-based allocation and deallocation, you need to pass txData — encoded calldata from the 0x Swap API.

  1. Call the 0x API with: sellToken, buyToken, sellAmount, and taker = strategy contract address (not the allocator or multisig)
  2. The API returns encoded calldata — pass this directly as txData
  3. Quotes are time-sensitive — fetch and submit in the same session
  4. For deallocateWithUnwrapAndSwap(): the swap is for the intermediate token (e.g., frxETH → WETH), not the held token (sfrxETH). Set minIntermediateOut to match the quote's sellAmount.

The Alchemix Admin UI should be used to construct txData when available.

For a detailed walkthrough of the unwrap+swap path, see the deallocateWithUnwrapAndSwap guide.


Proxy Forwarding

The Curator and Allocator contracts inherit from PermissionedProxy, which allows the admin to forward arbitrary calls to the MYT vault via proxy(). This is needed for MYT functions that are not natively wrapped by the utility contracts.

Allocator proxy candidates:

Curator proxy: Any Morpho V2 curator function not already wrapped by the AlchemistCurator contract can be forwarded via proxy() after whitelisting.

Example: calling setMaxRate() via proxy

// Step 1: Whitelist the setMaxRate selector on the proxy
allocator.setPermittedCall(0xa69fc423, true); // 0xa69fc423 = setMaxRate(uint256) selector

// Step 2: Forward the call to the vault
allocator.proxy(abi.encodeWithSelector(bytes4(0xa69fc423), newMaxRate));

Only the admin on the Allocator/Curator contract can call setPermittedCall() and proxy().


Troubleshooting: "I can't call this function"

Error / SymptomLikely CauseFix
Reverts with "PD" on Allocator ContractCaller is not admin or operator on the Allocator ContractAllocator Admin calls setOperator(yourAddress, true)
Reverts with "PD" on Curator ContractCaller is not admin or operator on the Curator ContractCurator Admin calls setOperator(yourAddress, true)
EffectiveCap revert on allocationAllocation would exceed absolute, relative, or risk capRaise caps via Curator Contract admin functions, or reduce allocation amount
StrategyAllocationPaused on allocateStrategy killSwitch is enabledStrategy Owner calls setKillSwitch(false) on the MYT Strategy contract
ActionNotSupported on allocate/deallocateUsing a route not configured for this strategyCheck the documentation for which direct / swap paths are enabled for this strategy
Can't call setMaxRate() on MYTNot a native Allocator Contract functionUse proxy forwarding: whitelist the selector, then call proxy() (see above)
Can't call setCurator() or setIsSentinel()Caller is not the MYT OwnerMust be called by the DAO Multisig as MYT Owner directly on the MYT
Timelocked function won't executesubmit() was not called firstCall the corresponding submit* function first, then the execution function