Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: shutdown metavaults contracts #119

Open
wants to merge 2 commits into
base: feat/v0.0.6
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion contracts/vault/LightAbstractVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ abstract contract LightAbstractVault is IERC4626Vault, InitializableToken, Vault
* @return maxAssets The maximum amount of underlying assets the caller can deposit.
*/
function maxDeposit(address caller) external view override returns (uint256 maxAssets) {
maxAssets = _maxDeposit(caller);
}

function _maxDeposit(
address /** caller */
) internal view virtual returns (uint256 maxAssets) {
if (paused()) {
return 0;
}
Expand All @@ -63,10 +69,13 @@ abstract contract LightAbstractVault is IERC4626Vault, InitializableToken, Vault
* @return maxShares The maximum amount of vault shares the caller can mint.
*/
function maxMint(address caller) external view override returns (uint256 maxShares) {
maxShares = _maxMint(caller);
}

function _maxMint(address) internal view virtual returns (uint256 maxShares) {
if (paused()) {
return 0;
}

maxShares = type(uint256).max;
}

Expand Down
43 changes: 34 additions & 9 deletions contracts/vault/liquidity/convex/Convex3CrvLiquidatorVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,10 @@ contract Convex3CrvLiquidatorVault is
// Get vault's asset (3Crv) balance after adding token to Curve's 3Pool.
assets_ = _asset.balanceOf(address(this));
// Add asset (3Crv) to metapool with slippage protection.
uint256 metapoolTokens = ICurveMetapool(metapool).add_liquidity([0, assets_], minMetapoolTokens);
uint256 metapoolTokens = ICurveMetapool(metapool).add_liquidity(
[0, assets_],
minMetapoolTokens
);

// Calculate share value of the new assets before depositing the metapool tokens to the Convex pool.
shares_ = _getSharesFromMetapoolTokens(
Expand Down Expand Up @@ -304,7 +307,7 @@ contract Convex3CrvLiquidatorVault is
override(AbstractVault, Convex3CrvAbstractVault)
returns (uint256 shares)
{
shares = Convex3CrvAbstractVault._previewDeposit(assets);
// return 0
}

/// @dev use Convex3CrvAbstractVault implementation.
Expand All @@ -315,7 +318,7 @@ contract Convex3CrvLiquidatorVault is
override(AbstractVault, Convex3CrvAbstractVault)
returns (uint256 assets)
{
assets = Convex3CrvAbstractVault._previewMint(shares);
// return 0
}

/// @dev use Convex3CrvAbstractVault implementation.
Expand Down Expand Up @@ -345,23 +348,45 @@ contract Convex3CrvLiquidatorVault is
****************************************/

/// @dev use Convex3CrvAbstractVault implementation.
function _deposit(uint256 assets, address receiver)
function _deposit(
uint256, /** assets */
address /** receiver */
)
internal
virtual
override(AbstractVault, Convex3CrvAbstractVault)
returns (uint256 shares)
returns (
uint256 /** shares */
)
{
shares = Convex3CrvAbstractVault._deposit(assets, receiver);
revert("Vault shutdown");
}

function _maxDeposit(
address /** caller */
) internal view virtual override returns (uint256 maxAssets) {
// return 0
}

/// @dev use Convex3CrvAbstractVault implementation.
function _mint(uint256 shares, address receiver)
function _mint(
uint256, /** shares */
address /** receiver */
)
internal
virtual
override(AbstractVault, Convex3CrvAbstractVault)
returns (uint256 assets)
returns (
uint256 /** assets*/
)
{
assets = Convex3CrvAbstractVault._mint(shares, receiver);
revert("Vault shutdown");
}

function _maxMint(
address /** caller */
) internal view virtual override returns (uint256 maxShares) {
// return 0
}

/// @dev use Convex3CrvAbstractVault implementation.
Expand Down
50 changes: 39 additions & 11 deletions contracts/vault/liquidity/curve/Curve3CrvAbstractMetaVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ abstract contract Curve3CrvAbstractMetaVault is AbstractSlippage, LightAbstractV
* Meta Vault shares -> Meta Vault assets (3Crv) -> vault assets (DAI, USDC or USDT)
* @return totalManagedAssets Amount of assets managed by the vault.
*/
function totalAssets() public view override returns (uint256 totalManagedAssets) {
function totalAssets() public view virtual override returns (uint256 totalManagedAssets) {
// Get the amount of underying meta vault shares held by this vault.
uint256 totalMetaVaultShares = metaVault.balanceOf(address(this));
if (totalMetaVaultShares > 0) {
Expand Down Expand Up @@ -191,6 +191,10 @@ abstract contract Curve3CrvAbstractMetaVault is AbstractSlippage, LightAbstractV
override
returns (uint256 shares)
{
shares = _previewDeposit(assets);
}

function _previewDeposit(uint256 assets) internal view virtual returns (uint256 shares) {
if (assets > 0) {
// Calculate Meta Vault assets (3Crv) for this vault's asset (DAI, USDC, USDT)
(uint256 threeCrvTokens, , ) = Curve3PoolCalculatorLibrary.calcDeposit(
Expand Down Expand Up @@ -232,6 +236,10 @@ abstract contract Curve3CrvAbstractMetaVault is AbstractSlippage, LightAbstractV
whenNotPaused
returns (uint256 assets)
{
assets = _mint(shares, receiver);
}

function _mint(uint256 shares, address receiver) internal virtual returns (uint256 assets) {
// Get the total underlying Meta Vault shares held by this vault.
uint256 totalMetaVaultShares = metaVault.balanceOf(address(this));
// Convert this vault's required shares to required underlying meta vault shares.
Expand Down Expand Up @@ -282,6 +290,10 @@ abstract contract Curve3CrvAbstractMetaVault is AbstractSlippage, LightAbstractV
* @dev Vault shares -> Meta Vault shares -> Meta Vault assets (3Crv) -> vault assets (eg DAI)
*/
function previewMint(uint256 shares) external view virtual override returns (uint256 assets) {
assets = _previewMint(shares);
}

function _previewMint(uint256 shares) internal view virtual returns (uint256 assets) {
if (shares > 0) {
// Get the total underlying Meta Vault shares held by this vault.
uint256 totalMetaVaultShares = metaVault.balanceOf(address(this));
Expand Down Expand Up @@ -321,6 +333,14 @@ abstract contract Curve3CrvAbstractMetaVault is AbstractSlippage, LightAbstractV
address receiver,
address owner
) external virtual override whenNotPaused returns (uint256 shares) {
shares = _withdraw(assets, receiver, owner);
}

function _withdraw(
uint256 assets,
address receiver,
address owner
) internal virtual returns (uint256 shares) {
if (assets > 0) {
// Get the total underlying Meta Vault shares held by this vault.
uint256 totalMetaVaultSharesBefore = metaVault.balanceOf(address(this));
Expand Down Expand Up @@ -399,6 +419,10 @@ abstract contract Curve3CrvAbstractMetaVault is AbstractSlippage, LightAbstractV
override
returns (uint256 shares)
{
shares = _previewWithdraw(assets);
}

function _previewWithdraw(uint256 assets) internal view virtual returns (uint256 shares) {
if (assets > 0) {
// Calculate 3Pool LP tokens (3Crv) for this vault's asset (DAI, USDC or USDT).
(uint256 threeCrvTokens, , ) = Curve3PoolCalculatorLibrary.calcWithdraw(
Expand Down Expand Up @@ -742,14 +766,7 @@ abstract contract Curve3CrvAbstractMetaVault is AbstractSlippage, LightAbstractV
/***************************************
Emergency Functions
****************************************/

/**
* @notice Governor liquidates all the vault's assets and send to the governor.
* Only to be used in an emergency. eg whitehat protection against a hack.
* @param minAssets Minimum amount of asset tokens to receive from removing liquidity from the Curve 3Pool.
* This provides sandwich attack protection.
*/
function liquidateVault(uint256 minAssets) external onlyGovernor {
function _liquidateVault(uint256 minAssets, bool transferToGovernor) internal {
uint256 totalMetaVaultShares = metaVault.balanceOf(address(this));

metaVault.redeem(totalMetaVaultShares, address(this), address(this));
Expand All @@ -759,8 +776,19 @@ abstract contract Curve3CrvAbstractMetaVault is AbstractSlippage, LightAbstractV
int128(uint128(assetPoolIndex)),
minAssets
);
if (transferToGovernor) {
_asset.safeTransfer(_governor(), _asset.balanceOf(address(this)));
}
}

_asset.safeTransfer(_governor(), _asset.balanceOf(address(this)));
/**
* @notice Governor liquidates all the vault's assets and send to the governor.
* Only to be used in an emergency. eg whitehat protection against a hack.
* @param minAssets Minimum amount of asset tokens to receive from removing liquidity from the Curve 3Pool.
* This provides sandwich attack protection.
*/
function liquidateVault(uint256 minAssets) external virtual onlyGovernor {
_liquidateVault(minAssets, true);
}

/***************************************
Expand All @@ -769,7 +797,7 @@ abstract contract Curve3CrvAbstractMetaVault is AbstractSlippage, LightAbstractV

/// @notice Approves Curve's 3Pool contract to transfer assets (DAI, USDC or USDT) from this vault.
/// Also approves the underlying Meta Vault to transfer 3Crv from this vault.
function resetAllowances() external onlyGovernor {
function resetAllowances() external virtual onlyGovernor {
_resetAllowances();
}

Expand Down
Loading