zAuction - Unpredictable behavior for users due to admin front running or general bad timing
An administrator of `zAuctionAccountant` contract can update the `zAuction` contract without warning. This has the potential to violate a security goal of the system.\\nSpecifically, privileged roles could use front running to make malicious changes just ahead of incoming transactions, or purely accidental negative effects could occur due to the unfortunate timing of changes.\\nIn general users of the system should have assurances about the behavior of the action they're about to take.\\nupdating the `zAuction` takes effect immediately. This has the potential to fail acceptance of bids by sellers on the now outdated `zAuction` contract as interaction with the accountant contract is now rejected. This forces bidders to reissue their bids in order for the seller to be able to accept them using the Accountant contract. This may also be used by admins to selectively censor the acceptance of accountant based bids by changing the active `zAuction` address.\\n```\\n    function SetZauction(address zauctionaddress) external onlyAdmin{\\n        zauction = zauctionaddress;\\n        emit ZauctionSet(zauctionaddress);\\n    }\\n\\n    function SetAdmin(address newadmin) external onlyAdmin{\\n        admin = newadmin;\\n        emit AdminSet(msg.sender, newadmin);\\n    }\\n```\\n\\nUpgradeable contracts may introduce the same unpredictability issues where the proxyUpgradeable owner may divert execution to a new zNS registrar implementation selectively for certain transactions or without prior notice to users.
The underlying issue is that users of the system can't be sure what the behavior of a function call will be, and this is because the behavior can change at any time.\\nWe recommend giving the user advance notice of changes with a time lock. For example, make all system-parameter and upgrades require two steps with a mandatory time window between them. The first step merely broadcasts to users that a particular change is coming, and the second step commits that change after a suitable waiting period. This allows users that do not accept the change to withdraw immediately.\\nValidate arguments before updating contract addresses (at least != current/0x0). Consider implementing a 2-step admin ownership transfer (transfer+accept) to avoid losing control of the contract by providing the wrong `ETH` address.
```\\n    function SetZauction(address zauctionaddress) external onlyAdmin{\\n        zauction = zauctionaddress;\\n        emit ZauctionSet(zauctionaddress);\\n    }\\n\\n    function SetAdmin(address newadmin) external onlyAdmin{\\n        admin = newadmin;\\n        emit AdminSet(msg.sender, newadmin);\\n    }\\n```\\n