Prevent creating an investor record associated with no address
`InvestorBasedRateLimiter::initializeInvestorStateDefault` is supposed to associate a newly created investor with one or more addresses but the `for` loop which does this can be bypassed by calling the function with an empty array:\\n```\\nfunction initializeInvestorStateDefault(\\n    address[] memory addresses\\n    ) external onlyRole(CONFIGURER_ROLE) {\\n    _initializeInvestorState(\\n      addresses,\\n      defaultMintLimit,\\n      defaultRedemptionLimit,\\n      defaultMintLimitDuration,\\n      defaultRedemptionLimitDuration\\n    );\\n}\\n\\nfunction _initializeInvestorState(\\n    address[] memory addresses,\\n    uint256 mintLimit,\\n    uint256 redemptionLimit,\\n    uint256 mintLimitDuration,\\n    uint256 redemptionLimitDuration\\n    ) internal {\\n    uint256 investorId = ++investorIdCounter;\\n\\n    // @audit this `for` loop can by bypassed by calling\\n    // `initializeInvestorStateDefault` with an empty array\\n    for (uint256 i = 0; i < addresses.length; ++i) {\\n      // Safety check to ensure the address is not already associated with an investor\\n      // before associating it with a new investor\\n      if (addressToInvestorId[addresses[i]] != 0) {\\n        revert AddressAlreadyAssociated();\\n      }\\n      _setAddressToInvestorId(addresses[i], investorId);\\n    }\\n\\n    investorIdToMintState[investorId] = RateLimit({\\n      currentAmount: 0,\\n      limit: mintLimit,\\n      lastResetTime: block.timestamp,\\n      limitDuration: mintLimitDuration\\n    });\\n    investorIdToRedemptionState[investorId] = RateLimit({\\n      currentAmount: 0,\\n      limit: redemptionLimit,\\n      lastResetTime: block.timestamp,\\n      limitDuration: redemptionLimitDuration\\n    });\\n}\\n```\\n
In `_initializeInvestorState` revert if the input address array is empty:\\n```\\nuint256 addressesLength = addresses.length;\\n\\nif(addressesLength == 0) revert EmptyAddressArray();\\n```\\n
An investor record can be created without any associated address. This breaks the following invariant of the `InvestorBasedRateLimiter` contract:\\nwhen a new `investorId` is created, it should be associated with one or more valid addresses\\nProof of Concept: Add this drop-in PoC to forge-tests/ousg/InvestorBasedRateLimiter/setters.t.sol:\\n```\\nfunction test_initializeInvestor_NoAddress() public {\\n    // no investor created\\n    assertEq(0, rateLimiter.investorIdCounter());\\n\\n    // empty input array will bypass the `for` loop that is supposed\\n    // to associate addresses to the newly created investor\\n    address[] memory addresses;\\n\\n    vm.prank(guardian);\\n    rateLimiter.initializeInvestorStateDefault(addresses);\\n\\n    // one investor created\\n    assertEq(1, rateLimiter.investorIdCounter());\\n\\n    // not associated with any addresses\\n    assertEq(0, rateLimiter.investorAddressCount(1));\\n}\\n```\\n\\nRun with: `forge test --match-test test_initializeInvestor_NoAddress`
```\\nfunction initializeInvestorStateDefault(\\n    address[] memory addresses\\n    ) external onlyRole(CONFIGURER_ROLE) {\\n    _initializeInvestorState(\\n      addresses,\\n      defaultMintLimit,\\n      defaultRedemptionLimit,\\n      defaultMintLimitDuration,\\n      defaultRedemptionLimitDuration\\n    );\\n}\\n\\nfunction _initializeInvestorState(\\n    address[] memory addresses,\\n    uint256 mintLimit,\\n    uint256 redemptionLimit,\\n    uint256 mintLimitDuration,\\n    uint256 redemptionLimitDuration\\n    ) internal {\\n    uint256 investorId = ++investorIdCounter;\\n\\n    // @audit this `for` loop can by bypassed by calling\\n    // `initializeInvestorStateDefault` with an empty array\\n    for (uint256 i = 0; i < addresses.length; ++i) {\\n      // Safety check to ensure the address is not already associated with an investor\\n      // before associating it with a new investor\\n      if (addressToInvestorId[addresses[i]] != 0) {\\n        revert AddressAlreadyAssociated();\\n      }\\n      _setAddressToInvestorId(addresses[i], investorId);\\n    }\\n\\n    investorIdToMintState[investorId] = RateLimit({\\n      currentAmount: 0,\\n      limit: mintLimit,\\n      lastResetTime: block.timestamp,\\n      limitDuration: mintLimitDuration\\n    });\\n    investorIdToRedemptionState[investorId] = RateLimit({\\n      currentAmount: 0,\\n      limit: redemptionLimit,\\n      lastResetTime: block.timestamp,\\n      limitDuration: redemptionLimitDuration\\n    });\\n}\\n```\\n