# Curator Studio: Yield Redirector Strategy <div style="font-size:24px;margin-bottom:16px;"> A principal-preserving vault that routes DeFi yield to a designated recipient. </div> ## Purpose Curator Studio enables curators to redirect yield from ERC-4626 vaults toward a recipient of choice while preserving the original principal. Instead of compounding yield for depositors, all excess yield is sent directly to a beneficiary, enabling transparent funding of initiatives or protocols. This design is minimal, modular, and composable, compatible with existing ERC-4626 vaults such as **Morpho, Euler 4626 wrappers,** and **Yearn**. ## Concept Overview ``` Capital Provider │ 1. Deposit Assets ▼ YieldRedirector4626 (Wrapper) │ 2. Routes Assets ▼ Source Vault (ERC-4626) │ 3. Generates Yield │ ▼ [Yield Harvest] ──> Recipient / Strategy ``` Key points: * Deposits represent principal only. * Yield is not reflected in share price. * Yield is redirected entirely to a recipient. ## Key Components ### 1. Source Vault (ERC-4626) * Standard ERC-4626 vault holding principal and generating yield. * Could be **Morpho, Euler 4626, Yearn**, or any fully ERC-4626-compliant vault. * `convertToAssets()` reflects current total value including yield. ### 2. Yield Redirector (YieldRedirector4626) * Wraps the source vault with an ERC-4626 interface. * Tracks **deposited principal**. * Harvests yield to a **single recipient**. * Shares represent claims on principal only. ## Contract ```solidity contract YieldRedirector4626 is ERC4626, Ownable { using SafeERC20 for IERC20; event Harvest(uint256 amount, address recipient); IERC4626 public immutable sourceVault; address public yieldRecipient; uint256 public principal; constructor( IERC4626 sourceVault_, address yieldRecipient_ ) ERC4626(IERC20(sourceVault_.asset())) ERC20( string(abi.encodePacked("YieldRedirector ", sourceVault_.name())), string(abi.encodePacked("yR-", sourceVault_.symbol())) ) Ownable(msg.sender) { require(yieldRecipient_ != address(0), "Invalid recipient"); sourceVault = sourceVault_; yieldRecipient = yieldRecipient_; IERC20(asset()).approve(address(sourceVault_), type(uint256).max); } function totalAssets() public view override returns (uint256) { return principal; } function surplus() public view returns (uint256) { uint256 total = sourceVault.convertToAssets(sourceVault.balanceOf(address(this))); return total > principal ? total - principal : 0; } function harvest() external { uint256 amount = surplus(); require(amount > 0, "No yield available"); sourceVault.withdraw(amount, yieldRecipient, address(this)); IStrategy(yieldRecipient).distribute(asset()); // Immediately distribute yield to the recipients emit Harvest(amount, yieldRecipient); } function _deposit( address caller, address receiver, uint256 assets, uint256 shares ) internal override { IERC20(asset()).safeTransferFrom(caller, address(this), assets); sourceVault.deposit(assets, address(this)); principal += assets; _mint(receiver, shares); emit Deposit(caller, receiver, assets, shares); } function _withdraw( address caller, address receiver, address owner, uint256 assets, uint256 shares ) internal override { if (caller != owner) { _spendAllowance(owner, caller, shares); } principal -= assets; _burn(owner, shares); sourceVault.withdraw(assets, address(this), address(this)); IERC20(asset()).safeTransfer(receiver, assets); emit Withdraw(caller, receiver, owner, assets, shares); } function setYieldRecipient(address newRecipient) external onlyOwner { require(newRecipient != address(0), "Invalid recipient"); yieldRecipient = newRecipient; } } ``` ## How It Works 1. **Deposit Principal**: Users deposit into the redirector. The principal is sent to the source vault. 2. **Track Principal**: Shares represent **only the original deposit**. 3. **Accrue Yield**: Source vault generates yield over time. 4. **Harvest Yield**: Calling `harvest()` withdraws all surplus yield and sends it to the configured `yieldRecipient`. 5. **Principal Preservation**: Deposited principal remains fully intact; only surplus yield is redirected. ## Vault Compatibility * **Morpho ERC-4626 wrappers** – fully supported * **Euler 4626 vaults** – fully supported * **Yearn ERC-4626-compatible vaults** – fully supported > Must be ERC-4626-compliant, non-rebasing, and fully capitalizing yield. Only supports vaults where yield is realized via asset appreciation (auto-compounding). External reward tokens are not harvested.