Vulnerability: vault.claimReward() If have a market without reward token, it may cause all markets to be unable to retrieve rewards.
Severity: medium

Description:
In `vault.claimReward()`, it will loop through all `market` of `vault` to execute `claimReward()`, and transfer `rewards` to `factory().owner()`. If one of the markets does not have `rewards`, that is, `rewardToken` is not set, `Token18 reward = address(0)`. Currently, the loop does not make this judgment `reward != address(0)`, it will also execute `market.claimReward()`, and the entire method will `revert`. This leads to other markets with `rewards` also being unable to retrieve `rewards`.\\nThe current implementation of `vault.claimReward()` is as follows:\\n```\\n    function claimReward() external onlyOwner {\\n        for (uint256 marketId; marketId < totalMarkets; marketId++) {\\n            _registrations[marketId].read().market.claimReward();\\n            _registrations[marketId].read().market.reward().push(factory().owner());\\n        }\\n    }\\n```\\n\\nWe can see that the method loops through all the `market` and executes `market.claimReward()`, and `reward().push()`.\\nThe problem is, not every market has `rewards` tokens. market.sol's `rewards` are not forcibly set in `initialize()`. The market's `makerRewardRate.makerRewardRate` is also allowed to be 0.\\n```\\ncontract Market is IMarket, Instance, ReentrancyGuard {\\n    /// @dev The token that incentive rewards are paid in\\n  Token18 public reward;\\n\\n    function initialize(IMarket.MarketDefinition calldata definition_) external initializer(1) {\\n        __Instance__initialize();\\n        __ReentrancyGuard__initialize();\\n\\n        token = definition_.token;\\n        oracle = definition_.oracle;\\n        payoff = definition_.payoff;\\n    }\\n// rest of code\\n\\n\\nlibrary MarketParameterStorageLib {\\n// rest of code\\n    function validate(\\n        MarketParameter memory self,\\n        ProtocolParameter memory protocolParameter,\\n        Token18 reward\\n    ) public pure {\\n        if (self.settlementFee.gt(protocolParameter.maxFeeAbsolute)) revert MarketParameterStorageInvalidError();\\n\\n        if (self.fundingFee.max(self.interestFee).max(self.positionFee).gt(protocolParameter.maxCut))\\n            revert MarketParameterStorageInvalidError();\\n\\n        if (self.oracleFee.add(self.riskFee).gt(UFixed6Lib.ONE)) revert MarketParameterStorageInvalidError();\\n\\n        if (\\n          reward.isZero() &&\\n          (!self.makerRewardRate.isZero() || !self.longRewardRate.isZero() || !self.shortRewardRate.isZero())\\n        ) revert MarketParameterStorageInvalidError();\\n```\\n\\nThis means that `market.sol` can be without `rewards token`.\\nIf there is such a market, the current `vault.claimReward()` will `revert`, causing other markets with `rewards` to also be unable to retrieve `rewards`.

Impact:
If the `vault` contains markets without `rewards`, it will cause other markets with `rewards` to also be unable to retrieve `rewards`.

Recommended mitigation:
```\\n    function claimReward() external onlyOwner {\\n        for (uint256 marketId; marketId < totalMarkets; marketId// Add the line below\\n// Add the line below\\n) {\\n// Add the line below\\n           if (_registrations[marketId].read().market.reward().isZero()) continue;\\n            _registrations[marketId].read().market.claimReward();\\n            _registrations[marketId].read().market.reward().push(factory().owner());\\n        }\\n    }\\n```\\n