Ownership transfers in a single step. A typo or wrong address permanently locks all owner-gated functionality because the new (wrong) owner can never accept or be corrected.
address public pendingOwner;
function transferOwnership(address n) external onlyOwner { pendingOwner = n; }
function acceptOwnership() external {
require(msg.sender == pendingOwner, "not pending");
owner = pendingOwner; pendingOwner = address(0);
}
Largest recorded losses in the same failure class — related, not the same bug:
The SaferICO scanner runs 201 detectors over your Solidity source, SAFE-0011 among them. Paste an address or the source itself — a small per-scan fee, shown before you sign, or unlimited on any plan.