contract Owned is Ownable {
    address private _proposedOwner;

    /**
     * @dev Initiate transfer ownership of the contract to a new account (`proposedOwner`).
     * Can only be called by the current owner. Current owner will still be owner until
     * proposed owner accept ownership.
     * @param proposedOwner proposed owner address
     */
    function transferOwnership(address proposedOwner) public override onlyOwner {
        //solhint-disable-next-line reason-string
        require(proposedOwner != address(0), "Proposed owner is the zero address");
        _proposedOwner = proposedOwner;
    }

    /// @dev Allows proposed owner to accept ownership of the contract.
    function acceptOwnership() public {
        require(msg.sender == _proposedOwner, "Caller is not the proposed owner");
        emit OwnershipTransferred(_owner, _proposedOwner);
        _owner = _proposedOwner;
        _proposedOwner = address(0);
    }

    function renounceOwnership() public override onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
        _proposedOwner = address(0);
    }
}
/**
 * @dev Contract module extends Ownable and provide a way for safe transfer ownership.
 * Proposed owner has to call acceptOwnership in order to complete ownership trasnfer.
 */
function transferOwnership(address proposedOwner) public override onlyOwner {
    //solhint-disable-next-line reason-string
    require(proposedOwner != address(0), "Proposed owner is the zero address");
    _proposedOwner = proposedOwner;
}

/**
 * @dev Initiate transfer ownership of the contract to a new account (`proposedOwner`).
 * Can only be called by the current owner. Current owner will still be owner until
 * proposed owner accept ownership.
 * @param proposedOwner proposed owner address
 */