```\n  function redeemFutureEpoch(\n    uint256 shares,\n    address receiver,\n    address owner,\n    uint64 epoch\n  ) public virtual returns (uint256 assets) {\n    // check to ensure that the requested epoch is not the current epoch or in the past\n    require(epoch >= currentEpoch, "Exit epoch too low");\n\n\n    require(msg.sender == owner, "Only the owner can redeem");\n    // check for rounding error since we round down in previewRedeem.\n\n\n    ERC20(address(this)).safeTransferFrom(owner, address(this), shares);\n\n\n    // Deploy WithdrawProxy if no WithdrawProxy exists for the specified epoch\n    _deployWithdrawProxyIfNotDeployed(epoch);\n\n\n    emit Withdraw(msg.sender, receiver, owner, assets, shares);\n\n\n    // WithdrawProxy shares are minted 1:1 with PublicVault shares\n    WithdrawProxy(withdrawProxies[epoch]).mint(receiver, shares); // was withdrawProxies[withdrawEpoch]\n  }\n```\n