FundRateArbitrage is vulnerable to inflation attacks
When index is calculated, it is figured by dividing the net value of the contract (including USDC held) by the current supply of earnUSDC. Through deposit and donation this ratio can be inflated. Then when others deposit, their deposit can be taken almost completely via rounding.\\nFundingRateArbitrage.sol#L98-L104\\n```\\nfunction getIndex() public view returns (uint256) {\\n    if (totalEarnUSDCBalance == 0) {\\n        return 1e18;\\n    } else {\\n        return SignedDecimalMath.decimalDiv(getNetValue(), totalEarnUSDCBalance);\\n    }\\n}\\n```\\n\\nIndex is calculated is by dividing the net value of the contract (including USDC held) by the current supply of totalEarnUSDCBalance. This can be inflated via donation. Assume the user deposits 1 share then donates 100,000e6 USDC. The exchange ratio is now 100,000e18 which causes issues during deposits.\\nFundingRateArbitrage.sol#L258-L275\\n```\\nfunction deposit(uint256 amount) external {\\n    require(amount != 0, "deposit amount is zero");\\n    uint256 feeAmount = amount.decimalMul(depositFeeRate);\\n    if (feeAmount > 0) {\\n        amount -= feeAmount;\\n        IERC20(usdc).transferFrom(msg.sender, owner(), feeAmount);\\n    }\\n    uint256 earnUSDCAmount = amount.decimalDiv(getIndex());\\n    IERC20(usdc).transferFrom(msg.sender, address(this), amount);\\n    JOJODealer(jojoDealer).deposit(0, amount, msg.sender);\\n    earnUSDCBalance[msg.sender] += earnUSDCAmount;\\n    jusdOutside[msg.sender] += amount;\\n    totalEarnUSDCBalance += earnUSDCAmount;\\n    require(getNetValue() <= maxNetValue, "net value exceed limitation");\\n    uint256 quota = maxUsdcQuota[msg.sender] == 0 ? defaultUsdcQuota : maxUsdcQuota[msg.sender];\\n    require(earnUSDCBalance[msg.sender].decimalMul(getIndex()) <= quota, "usdc amount bigger than quota");\\n    emit DepositToHedging(msg.sender, amount, feeAmount, earnUSDCAmount);\\n}\\n```\\n\\nNotice earnUSDCAmount is amount / index. With the inflated index that would mean that any deposit under 100,000e6 will get zero shares, making it exactly like the standard ERC4626 inflation attack.
Use a virtual offset as suggested by OZ for their ERC4626 contracts
Subsequent user deposits can be stolen
```\\nfunction getIndex() public view returns (uint256) {\\n    if (totalEarnUSDCBalance == 0) {\\n        return 1e18;\\n    } else {\\n        return SignedDecimalMath.decimalDiv(getNetValue(), totalEarnUSDCBalance);\\n    }\\n}\\n```\\n