function deposit(
uint128 vaultId,
uint128 assets,
uint128 minShares,
bytes memory referralCode,
bool isCustomReferralCode
)
external
{
if (assets == 0) revert Errors.ZeroInput("assets");
MarketMakingEngineConfiguration.Data storage marketMakingEngineConfiguration =
MarketMakingEngineConfiguration.load();
address whitelistCache = marketMakingEngineConfiguration.whitelist;
if (whitelistCache != address(0)) {
if (!Whitelist(whitelistCache).verifyIfUserIsAllowed(msg.sender)) {
revert Errors.UserIsNotAllowed(msg.sender);
}
}
Vault.Data storage vault = Vault.loadLive(vaultId);
if (!vault.collateral.isEnabled) revert Errors.VaultDoesNotExist(vaultId);
DepositContext memory ctx;
ctx.vaultAsset = vault.collateral.asset;
uint256[] memory vaultsIds = new uint256[]();
vaultsIds[0] = uint256(vaultId);
Vault.recalculateVaultsCreditCapacity(vaultsIds);
ctx.referralModule = IReferral(marketMakingEngineConfiguration.referralModule);
if (referralCode.length != 0) {
ctx.referralModule.registerReferral(
abi.encode(msg.sender), msg.sender, referralCode, isCustomReferralCode
);
}
ctx.vaultAssetDecimals = vault.collateral.decimals;
ctx.assetsX18 = Math.convertTokenAmountToUd60x18(ctx.vaultAssetDecimals, assets);
ctx.vaultDepositFee = ud60x18(vault.depositFee);
if (ctx.vaultDepositFee.isZero()) {
ctx.assetsMinusFees = assets;
} else {
ctx.assetFeesX18 = ctx.assetsX18.mul(ctx.vaultDepositFee);
ctx.assetFees = Math.convertUd60x18ToTokenAmount(ctx.vaultAssetDecimals, ctx.assetFeesX18);
if (ctx.assetFees == 0) revert Errors.ZeroFeeNotAllowed();
ctx.assetsMinusFees = assets - ctx.assetFees;
if (ctx.assetsMinusFees == 0) revert Errors.DepositTooSmall();
}
IERC20(ctx.vaultAsset).safeTransferFrom(msg.sender, address(this), ctx.assetsMinusFees);
if (ctx.assetFees > 0) {
IERC20(ctx.vaultAsset).safeTransferFrom(
msg.sender, marketMakingEngineConfiguration.vaultDepositAndRedeemFeeRecipient, ctx.assetFees
);
}
address indexTokenCache = vault.indexToken;
IERC20(ctx.vaultAsset).approve(indexTokenCache, ctx.assetsMinusFees);
ctx.shares = IERC4626(indexTokenCache).deposit(ctx.assetsMinusFees, msg.sender);
if (ctx.shares < minShares) revert Errors.SlippageCheckFailed(minShares, ctx.shares);
if (ctx.shares == 0) revert Errors.DepositMustReceiveShares();
emit LogDeposit(vaultId, msg.sender, ctx.assetsMinusFees);
}
In the deposit function a user can inflate his shares by being the first depositor to the vault. He will recieve large shares for small amount of deposited asset.
Future users receive significantly fewer shares for their deposits, making the vault unattractive for additional investors.