Attacker can make a signer gate creation fail
DAOs can deploy a HSG using `deployHatsSignerGateAndSafe()` or deployMultiHatsSignerGateAndSafe().The parameters are encoded and passed to moduleProxyFactory.deployModule():\\n```\\n    bytes memory initializeParams = abi.encode(_ownerHatId, _signersHatId, _safe, hatsAddress, _minThreshold, \\n    _targetThreshold, _maxSigners, version );\\n        hsg = moduleProxyFactory.deployModule(hatsSignerGateSingleton, abi.encodeWithSignature("setUp(bytes)", \\n    initializeParams), _saltNonce );\\n```\\n\\nThis function will call createProxy():\\n```\\n    proxy = createProxy( masterCopy, keccak256(abi.encodePacked(keccak256(initializer), saltNonce)) );\\n```\\n\\nThe second parameter is the generated salt, which is created from the initializer and passed saltNonce. Finally `createProxy()` will use CREATE2 to create the contract:\\n```\\n        function createProxy(address target, bytes32 salt)  internal  returns (address result)\\n        {\\n            if (address(target) == address(0)) revert ZeroAddress(target);\\n            if (address(target).code.length == 0) revert \\n        TargetHasNoCode(target);\\n                bytes memory deployment = abi.encodePacked(\\n                  hex"602d8060093d393df3363d3d373d3d3d363d73", target, hex"5af43d82803e903d91602b57fd5bf3" );\\n            // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                     result := create2(0, add(deployment, 0x20), \\n        mload(deployment), salt)\\n              }\\n                  if (result == address(0)) revert TakenAddress(result);\\n             }\\n```\\n\\nAn issue could be that an attacker can frontrun the creation TX with their own creation request, with the same parameters. This would create the exact address created by the CREATE2 call, since the parameters and therefore the final salt will be the same. When the victim's transaction would be executed, the address is non-empty so the EVM would reject its creation. This would result in a bad UX for a user, who thinks the creation did not succeed. The result contract would still be usable, but would be hard to track as it was created in another TX.
Use an ever-increasing nonce counter to guarantee unique contract addresses.
```\\n    bytes memory initializeParams = abi.encode(_ownerHatId, _signersHatId, _safe, hatsAddress, _minThreshold, \\n    _targetThreshold, _maxSigners, version );\\n        hsg = moduleProxyFactory.deployModule(hatsSignerGateSingleton, abi.encodeWithSignature("setUp(bytes)", \\n    initializeParams), _saltNonce );\\n```\\n