Public vault : Initial depositor can manipulate the price per share value and future depositors are forced to deposit huge value in vault.
Most of the share based vault implementation will face this issue. The vault is based on the ERC4626 where the shares are calculated based on the deposit value. By depositing large amount as initial deposit, initial depositor can influence the future depositors value.\\nBy depositing large amount as initial deposit, first depositor can take advantage over other depositors.\\nI am sharing reference for this type of issue that already reported and acknowledged. This explain how the share price could be manipulated to large value.\\nERC4626 implementation function mint(uint256 shares, address receiver) public virtual returns (uint256 assets) { assets = previewMint(shares); // No need to check for rounding error, previewMint rounds up.\\n```\\n    // Need to transfer before minting or ERC777s could reenter.\\n    asset.safeTransferFrom(msg.sender, address(this), assets);\\n\\n    _mint(receiver, shares);\\n\\n    emit Deposit(msg.sender, receiver, assets, shares);\\n\\n    afterDeposit(assets, shares);\\n}\\n\\n  function previewMint(uint256 shares) public view virtual returns (uint256) {\\n    uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.\\n\\n    return supply == 0 ? shares : shares.mulDivUp(totalAssets(), supply);\\n}\\n```\\n
Consider requiring a minimal amount of share tokens to be minted for the first minter, and send a portion of the initial mints as a reserve to the DAO/ burn so that the price per share can be more resistant to manipulation.
Future depositors are forced for huge value of asset to deposit. It is not practically possible for all the users. This could directly affect on the attrition of users towards this system.
```\\n    // Need to transfer before minting or ERC777s could reenter.\\n    asset.safeTransferFrom(msg.sender, address(this), assets);\\n\\n    _mint(receiver, shares);\\n\\n    emit Deposit(msg.sender, receiver, assets, shares);\\n\\n    afterDeposit(assets, shares);\\n}\\n\\n  function previewMint(uint256 shares) public view virtual returns (uint256) {\\n    uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.\\n\\n    return supply == 0 ? shares : shares.mulDivUp(totalAssets(), supply);\\n}\\n```\\n