Attacker can DOS deposit transactions due to strict verifications
When users deposit funds to the Vault, it verifies that the proportion between the tokens inserted to the vault matches the current vault token balances.\\n```\\n      uint256[] memory balances = vlt.balances();\\n          //ensure deposits are in the same ratios as the vault's current balances\\n          require(functions.ratiosMatch(balances, amts), "ratios don't match");\\n```\\n\\nThe essential part of the check is below:\\n```\\n         for (uint256 i = 0; i < sourceRatios.length; i++) {\\n         // if (targetRatios[i] != (targetRatios[greatestIndex] * \\n                  sourceRatios[i]) / greatest) {\\n               if (targetRatios[i] != \\n         Arithmetic.overflowResistantFraction(targetRatios[greatestIndex], sourceRatios[i], greatest)) {\\n         return false;\\n            }\\n         }\\n```\\n\\nThe exact logic here is not important, but note that a small change in the balance of one of the vault tokens will affect the expected number of tokens that need to be inserted to maintain correct ratio. The exact amounts to be deposited are passed as targetRatios, and sourceRatios is the current balances. Therefore, an attacker can directly transfer a negligible amount of some vault token to the contract to make the amount the user specified in targetRatios not line up with the expected proportion. As a result, the deposit would revert. Essentially it is an abuse of the over-granular verification of ratios, leading to a DOS of any deposit in the mempool.
Loosen the restriction on deposit ratios. A DOS attack should cost an amount that the vault creditors would be happy to live with.
```\\n      uint256[] memory balances = vlt.balances();\\n          //ensure deposits are in the same ratios as the vault's current balances\\n          require(functions.ratiosMatch(balances, amts), "ratios don't match");\\n```\\n