Supply limitation misbehaviors
In `SWSupplyManager` contract, the `owner` can limit supply for any token ID by setting maxSupply:\\n```\\nfunction setMaxSupplies(uint256[] calldata \\_ids, uint256[] calldata \\_newMaxSupplies) external onlyOwner() {\\n  require(\\_ids.length == \\_newMaxSupplies.length, "SWSupplyManager#setMaxSupply: INVALID\\_ARRAYS\\_LENGTH");\\n\\n  // Can only \\*decrease\\* a max supply\\n  // Can't set max supply back to 0\\n  for (uint256 i = 0; i < \\_ids.length; i++ ) {\\n    if (maxSupply[\\_ids[i]] > 0) {\\n      require(\\n        0 < \\_newMaxSupplies[i] && \\_newMaxSupplies[i] < maxSupply[\\_ids[i]],\\n        "SWSupplyManager#setMaxSupply: INVALID\\_NEW\\_MAX\\_SUPPLY"\\n      );\\n    }\\n    maxSupply[\\_ids[i]] = \\_newMaxSupplies[i];\\n  }\\n\\n  emit MaxSuppliesChanged(\\_ids, \\_newMaxSupplies);\\n}\\n```\\n\\nThe problem is that you can set `maxSupply` that is lower than `currentSupply`, which would be an unexpected state to have.\\nAlso, if some tokens are burned, their `currentSupply` is not decreasing:\\n```\\nfunction burn(\\n  uint256 \\_id,\\n  uint256 \\_amount)\\n  external\\n{\\n  \\_burn(msg.sender, \\_id, \\_amount);\\n}\\n```\\n\\nThis unexpected behaviour may lead to burning all of the tokens without being able to mint more.
Properly track `currentSupply` by modifying it in `burn` function. Consider having a following restriction `require(_newMaxSupplies[i] > currentSupply[_ids[i]])` in `setMaxSupplies` function.
```\\nfunction setMaxSupplies(uint256[] calldata \\_ids, uint256[] calldata \\_newMaxSupplies) external onlyOwner() {\\n  require(\\_ids.length == \\_newMaxSupplies.length, "SWSupplyManager#setMaxSupply: INVALID\\_ARRAYS\\_LENGTH");\\n\\n  // Can only \\*decrease\\* a max supply\\n  // Can't set max supply back to 0\\n  for (uint256 i = 0; i < \\_ids.length; i++ ) {\\n    if (maxSupply[\\_ids[i]] > 0) {\\n      require(\\n        0 < \\_newMaxSupplies[i] && \\_newMaxSupplies[i] < maxSupply[\\_ids[i]],\\n        "SWSupplyManager#setMaxSupply: INVALID\\_NEW\\_MAX\\_SUPPLY"\\n      );\\n    }\\n    maxSupply[\\_ids[i]] = \\_newMaxSupplies[i];\\n  }\\n\\n  emit MaxSuppliesChanged(\\_ids, \\_newMaxSupplies);\\n}\\n```\\n