FraxConvex Vaults
Depositing into Frax Convex Vault is different from other Vaults because it operates with locking cycles of 7 days.
Last updated
Depositing into Frax Convex Vault is different from other Vaults because it operates with locking cycles of 7 days.
Last updated
```solidity
/// @notice Puts a withdrawal request to be satisfied after the next farming cycle
/// @dev Called by withdraw() and redeem()
function _withdraw(
address caller,
address receiver,
address owner,
uint256 assets,
uint256 shares
) internal virtual override {
_distributeReward(_msgSender());
if (caller != owner) {
_spendAllowance(owner, caller, shares);
}
require(
userWithdrawals[owner].withdrawalRequested + assets <=
previewRedeem(maxRedeem(owner))
);
if (userWithdrawals[owner].withdrawalRequested == 0) {
withdrawalqueue.push(owner);
userWithdrawals[owner].id = withdrawalqueue.length; // will alsways be > 0
}
userWithdrawals[owner].withdrawalRequested += assets;
emit Withdraw(caller, receiver, owner, assets, shares); //should we keep event here?
}
``````solidity
/// @notice Claims the unlocked funds previously requested for withdrawal
/// @dev Unwraps claimed lp tokens, exchanges them to the exit token and sends to the user
/// @param exitToken the token to be transferred to the user
/// @param receiver Recipient of the tokens
function claim(address exitToken, address receiver)
external
virtual
returns (uint256 amount)
{
amount = userWithdrawals[receiver].withdrawalAvailable;
if (amount > 0) {
totalRequestedWithdrawals -= amount;
delete userWithdrawals[receiver];
IConvexWrapper(stakingToken).withdrawAndUnwrap(amount);
if (exitToken != asset()) {
IERC20MetadataUpgradeable(asset()).safeIncreaseAllowance(
address(EXCHANGE),
amount
);
amount = EXCHANGE.exchange(asset(), exitToken, amount, 0);
}
IERC20MetadataUpgradeable(exitToken).safeTransfer(receiver, amount);
}
}
``` /// @notice Allows users to claim their rewards in an ERC20 supported by the Alluo exchange
/// @dev Withdraws all reward tokens from the alluo pool and sends it to the user after exchanging it.
/// @return rewardTokens value of total reward tokens in exitTokens
function claimRewards(address exitToken)
external
returns (uint256 rewardTokens)
{
_distributeReward(_msgSender());
rewardTokens = rewards[_msgSender()];
if (rewardTokens > 0) {
rewards[_msgSender()] = 0;
IAlluoPool(alluoPool).withdraw(rewardTokens);
if (exitToken != address(rewardToken)) {
rewardToken.safeIncreaseAllowance(
address(EXCHANGE),
rewardTokens
);
rewardTokens = EXCHANGE.exchange(
address(rewardToken),
exitToken,
rewardTokens,
0
);
}
IERC20MetadataUpgradeable(exitToken).safeTransfer(
_msgSender(),
rewardTokens
);
}
}