Fee Wrapper
What is a Fee Wrapper?
A Fee Wrapper is a Vault V2 configured in a specific, constrained mode that enables distribution channels to add a fee layer on top of an existing Morpho Vault V2.
- Main Morpho Vault V2: Handles actual capital allocation to Morpho Markets (V1, V2, future versions). This is where yield is generated.
- Fee Wrapper: A lightweight Vault V2 that deposits into the main Morpho Vault V2, with the sole purpose of adding a fee layer per customer/distributor.

Key Properties
| Property | Description |
|---|---|
| ERC-4626 Mostly Compliant | Mostly compliant, with shares remaining fully ERC-20. See Vault V2 principles |
| Immutably Bound | Bound to a single Morpho Vault V2 at deployment. Can not be changed |
| Fee Flexibility | Owner can configure performance fees (up to 50%) and management fees (up to 5%) |
| Simplified Configuration | Risk management functions are abdicated, making operation simpler |
| Shared Liquidity | Users share the liquidity of the underlying Morpho Vault V2 |
Architecture
A Fee Wrapper is deployed with a carefully designed split between immutable, defaulted, and configurable parameters.
Fixed at deployment (addAdapter / removeAdapter abdicated):
- The single adapter pointing to the underlying Morpho Vault V2
- The adapter registry lock (no new adapters can ever be added)
- Absolute and relative caps set to maximum values
- Max rate set to maximum
- Force-deallocate penalty set to 2% (MAX_FORCE_DEALLOCATE_PENALTY)
- Liquidity adapter set to the single Morpho Vault V2 adapter
- All roles (Curator, Allocator, Sentinel) default to the owner
- Owner address
- Vault name and symbol
- Performance fee (up to 50%) and management fee (up to 5%)
- Fee recipient address
- Gate abdication mode (
abdicateNonCriticalGates)
Gates & Non-Custodiality
Gates control who can interact with the vault. Each gate is a contract slot that, when set, enforces on-chain rules on a specific action. A Fee Wrapper has four gates:
| Gate | Action it governs | Critical? |
|---|---|---|
| receiveAssetsGate | Who can deposit assets | Yes - can lock funds |
| receiveSharesGate | Who can receive shares | Yes - can lock funds |
| sendSharesGate | Who can send/transfer shares | Yes - can lock funds |
| sendAssetsGate | Who can be a withdrawal recipient | No - cannot lock funds |
The three critical gates can prevent users from accessing their own funds if misconfigured. The fourth gate (sendAssetsGate) only restricts who can receive withdrawn assets and cannot lock funds.
By default all four gates are set to address(0) (permissionless): anyone can deposit, withdraw, and transfer shares freely.
Non-custodial (recommended for DeFi)
Permanently abdicate the three critical gate setters at deployment. This locks them to address(0) forever - no one can ever restrict user access to funds. This action is irreversible.
The non-critical sendAssetsGate remains configurable so the curator can still set withdrawal-recipient rules post-deployment if needed, without affecting fund safety.
Compliance-ready (KYC/AML)
Keep all gate setters configurable and set gate contracts post-deployment to enforce on-chain rules (e.g., KYC whitelists). The curator can set or change gate contracts at any time via timelocked actions.
This enables compliance-ready distribution but makes the vault partially custodial, because the critical gates could restrict certain users from accessing their funds.
For more details on gates, see the Gates concept page and the Abdicate Gates tutorial.
Use Cases
- B2B Distribution: Distributors can deploy one Fee Wrapper per customer, each with custom fee configurations
- Revenue Sharing: Split native yield between the distribution channel and end users (e.g., 50/50 split via fee configuration)
- White-Label Products: Distributor can offer Morpho yield under their own brand with their own fee structure
Yield and Rewards
Native Yield (Inside ERC-4626 Flow)Native yield comes from interest paid by borrowers on underlying Morpho Markets. It accrues automatically to shares over time, requiring no separate claim - shares simply appreciate in value. Users withdraw the same token they deposited (e.g., USDC) plus accrued interest. Performance and management fees are applied to this yield.
External Rewards (Outside ERC-4626 Flow)External rewards (e.g., MORPHO tokens) come from incentives provided by Morpho governance, market creators, or token issuers, and are distributed via Merkl (updated every 8 hours). These rewards require a separate claim action through Merkl and are automatically forwarded to end depositors by default. It is possible to implement custom distribution. For specific reward routing (e.g., distributor claims rewards instead of users), coordinate with the Merkl team for address remapping configuration.
Deployment
Fee Wrapper Demo App
The simplest way to deploy a Fee Wrapper is through the Fee Wrapper Demo App, which provides a UI to:
- Deploy a new Fee Wrapper
- Check if a Fee Wrapper is properly configured
- Update fees on an existing Fee Wrapper
- View the full yield breakdown for a fee wrapper address
Find the factory addresses in the addresses section.
Programmatic Deployment
For programmatic deployments, the FeeWrapperDeployer periphery contract handles all configuration steps in a single transaction.
Function Signature
The createFeeWrapper function takes three parameters:
| Parameter | Type | Description |
|---|---|---|
morphoVaultV2Factory | address | The VaultV2Factory address |
morphoVaultV1AdapterFactory | address | The MorphoVaultV1AdapterFactory address |
config | FeeWrapperConfig | The fee wrapper configuration (see below) |
FeeWrapperConfig Fields
| Field | Type | Description |
|---|---|---|
owner | address | Final owner. MUST be a safe wallet (multisig, etc.) |
salt | bytes32 | CREATE2 salt for deterministic deployment |
childVault | address | The underlying Morpho Vault V2 to wrap. MUST be a Morpho Vault V2 |
name | string | ERC-20 name for the fee wrapper token. Recommended for API indexing and display |
symbol | string | ERC-20 symbol for the fee wrapper token. Recommended for API indexing and display |
performanceFee | uint256 | Performance fee in WAD (e.g. 0.1e18 = 10%). Set to 0 to skip |
managementFee | uint256 | Management fee in WAD/second. Set to 0 to skip |
feeRecipient | address | Address receiving fees. Required if either fee > 0. See Fees |
abdicateNonCriticalGates | bool | If true, abdicate the 3 critical gate setters for non-custodial guarantees. See Gates |
Deployment Phases
The deployer executes the following steps atomically in a single transaction:
- Create vault - deploys a new Vault V2 with the deployer as temporary owner
- Adapter setup - creates the MorphoVaultV1Adapter, adds it, then permanently abdicates addAdapter and removeAdapter
- Allocator setup - grants allocator role to deployer (temporary, removed at step 10) and owner
- Caps configuration - sets absolute cap to max and relative cap to 100%
- Allocator configuration - sets liquidity adapter and max rate (200% APR)
- Penalty configuration - sets force-deallocate penalty to 2%
- Optional fees - sets fee recipients then fees (performance and/or management)
- Optional gate abdication - permanently abdicates the 3 critical gate setters for non-custodial guarantees
- Token metadata - sets name and symbol if provided
- Ownership transfer - removes deployer privileges, sets sentinel/curator/owner to the final owner
Integration Guide
Query the Morpho API to compute post-fee APY. No on-chain reads needed - all data comes from the API.
1. Query the Morpho API
Endpoint: POST https://api.morpho.org/graphql
Use the fee wrapper address directly (not the underlying Morpho Vault V2 address) along with the chainID.
query FeeWrapperAPY {
feeWrapper: vaultV2ByAddress(
address: "0x2861ABE7AB28484Fb8375def4A7eb56C8F53fE8F"
chainId: 8453
) {
avgNetApy
avgNetApyExcludingRewards
performanceFee
managementFee
name
symbol
rewards {
supplyApr
asset { address, symbol }
}
adapters {
items {
type
address
... on MorphoVaultV2Adapter {
innerVault {
address
name
avgNetApyExcludingRewards
performanceFee
managementFee
rewards {
supplyApr
asset { address, symbol }
}
}
}
}
}
}
}2. Read Net APY
The API response includes pre-computed net APY values that account for the full fee chain (inner vault fees + wrapper fees + rewards):
avgNetApy- 6h rolling average net APY, including rewards. This is the recommended value for most integrations.avgNetApyExcludingRewards- Same as above but excluding reward incentives.
These values are ready to use directly - no manual computation needed.
If rewards are redirected via Merkl address remapping,
avgNetApyExcludingRewardsis the correct value to display (end users do not receive the rewards).
3. Advanced: Manual APY Breakdown (Optional)
For newly deployed fee wrappers, avgNetApy may be zero or noisy until sufficient history accumulates. The manual computation below uses innerVault.avgNetApyExcludingRewards for consistent results in those cases, and is also useful when a granular per-layer fee breakdown is needed.
// innerVault.avgNetApyExcludingRewards already includes inner vault fee deductions
adapterYield = innerVault.avgNetApyExcludingRewards
wrapperPerfFeeDeduction = max(adapterYield, 0) * feeWrapper.performanceFee
nativeYield = adapterYield - wrapperPerfFeeDeduction - feeWrapper.managementFee
rewardsApr = sum(innerVault.rewards[].supplyApr)
netApy = nativeYield + rewardsAprNote:
avgNetApyExcludingRewardsis the 6h rolling average net yield after the inner vault's own performance and management fees, but excluding reward incentives. Rewards are sourced from the inner vault (innerVault.rewards[]) and distributed via Merkl based on the inner vault's market positions.
More Fee Wrapper API data can be found here.
Roles & Auth Model
All roles default to the owner at deployment:
| Role | Default | Description |
|---|---|---|
| Owner | deployer | Top-level permissions. No timelock on ownership actions. |
| Curator | owner | Risk manager. Most actions are timelocked. |
| Allocator | owner | Portfolio manager. No timelock on allocation actions. |
| Sentinel | owner | Safety role. Can revoke pending actions and reduce risk. |
- Owner-level: Transfer ownership, set roles - no timelock
- Curator-level: Change fees, fee recipients, caps - timelocked
- Allocator-level: Allocate/deallocate to the adapter - no timelock
Security Considerations
What the Owner CAN Do:- Change performance fees (up to 50%, timelocked)
- Change management fees (up to 5%, timelocked)
- Change fee recipients (timelocked)
- Add/remove allocators (timelocked)
- Change the underlying vault (abdicated)
- Add new adapters (abdicated)
- Remove the existing adapter (abdicated)
- Access user funds directly
- Prevent users from exiting (via forceDeallocate)
