The _removeFromQueue is very gas greedy
The `_removeFromQueue` function is supposed to remove `_countToRemove` elements from the queue:\\n```\\nfunction \\_removeFromQueue(uint256 \\_countToRemove) internal {\\n  for (uint256 i = 0; i < \\_countToRemove; i++) {\\n    delete withdrawalsInfo[withdrawalQueue[i]];\\n  }   \\n\\n  if (\\_countToRemove == withdrawalQueue.length) {\\n    delete withdrawalQueue;\\n  } else {\\n    uint256 \\_remainingArrLength = withdrawalQueue.length.sub(\\_countToRemove);\\n    address[] memory \\_remainingArr = new address[](\\_remainingArrLength);\\n\\n    for (uint256 i = 0; i < \\_remainingArrLength; i++) {\\n      \\_remainingArr[i] = withdrawalQueue[i.add(\\_countToRemove)];\\n    }\\n\\n    withdrawalQueue = \\_remainingArr;\\n  }\\n}\\n```\\n\\nThis function uses too much gas, which makes it easier to make attacks on the system. Even if only one request is removed and executed, this function rewrites all the requests to the storage.
The data structure should be changed so this function shouldn't rewrite the requests that did not change. For example, it can be a mapping `(unit => address)` with 2 indexes `(start, end)` that are only increasing.
```\\nfunction \\_removeFromQueue(uint256 \\_countToRemove) internal {\\n  for (uint256 i = 0; i < \\_countToRemove; i++) {\\n    delete withdrawalsInfo[withdrawalQueue[i]];\\n  }   \\n\\n  if (\\_countToRemove == withdrawalQueue.length) {\\n    delete withdrawalQueue;\\n  } else {\\n    uint256 \\_remainingArrLength = withdrawalQueue.length.sub(\\_countToRemove);\\n    address[] memory \\_remainingArr = new address[](\\_remainingArrLength);\\n\\n    for (uint256 i = 0; i < \\_remainingArrLength; i++) {\\n      \\_remainingArr[i] = withdrawalQueue[i.add(\\_countToRemove)];\\n    }\\n\\n    withdrawalQueue = \\_remainingArr;\\n  }\\n}\\n```\\n