Save rate and money (Clicker)

Hello! Could you please help me fix a “bug”?

I created a clicker for my own purposes, and as a way to increase profit per click, I implemented tasks. Upon completing a task, users receive a password that they enter into a prompt. The problem is that when the password is entered, the profit per click increases, and the button for entering the password for the completed task becomes unavailable (it cannot be clicked). However, upon restarting the game, the coins and profit are saved, but the state of the button resets, allowing me to click it again, enter the same password, and unfairly increase my profit.

using UnityEngine;
using UnityEngine.UI;

public class Script : MonoBehaviour
{
    public static int money;
    public static int rate = 1;

    public Text moneyText; // Отображение баланса
    public GameObject upgradeWindow; // Ссылка на окно для задания
    public InputField passwordInput; // Поле для ввода пароля
    public Button startTaskButton; // Кнопка "Начать задание"
    public Button checkPasswordButton; // Кнопка "Проверить пароль"

    private string correctPassword = "#samsanapreza";
    private bool taskStarted = false;
    private bool taskCompleted = false;
    private bool passwordEntered = false;

    private const string MoneyKey = "Money";
    private const string TaskCompletedKey = "TaskCompleted";
    private const string RateKey = "Rate";
    private const string PasswordEnteredKey = "PasswordEntered";

    private void Start()
    {
        LoadData();

        if (taskCompleted)
        {
            DisableTask();
        }
        else
        {
            startTaskButton.interactable = true;
        }
    }

    public void Click()
    {
        money += rate;
    }

    public void OpenUpgradeWindow()
    {
        if (upgradeWindow != null)
        {
            upgradeWindow.SetActive(true);
        }
        else
        {
            Debug.LogError("UpgradeWindow не привязан в инспекторе!");
        }
    }

    public void ClosePanel()
    {
        if (upgradeWindow != null)
        {
            upgradeWindow.SetActive(false);
        }
        else
        {
            Debug.LogError("UpgradeWindow не привязан в инспекторе!");
        }
    }

    public void StartTask()
    {
        if (taskCompleted)
        {
            Debug.LogWarning("Задание уже выполнено.");
            return;
        }

        Debug.Log("Задание началось!");

        if (passwordInput != null)
        {
            passwordInput.gameObject.SetActive(true);
            passwordInput.onEndEdit.AddListener(HandleInput);
        }
        else
        {
            Debug.LogError("PasswordInput не привязан в инспекторе!");
        }

        if (checkPasswordButton != null)
        {
            checkPasswordButton.gameObject.SetActive(true);
        }
        else
        {
            Debug.LogError("CheckPasswordButton не привязан в инспекторе!");
        }

        taskStarted = true;
    }

    public void CheckPassword()
    {
        if (taskStarted)
        {
            if (passwordInput != null && passwordInput.text == correctPassword && !passwordEntered)
            {
                Debug.Log("Пароль верный! Увеличиваем ставку.");
                rate += 3;
                passwordEntered = true;
                SaveData();
                CompleteTask();
                ClosePanel();
            }
            else if (passwordEntered)
            {
                Debug.Log("Вы уже вводили правильный пароль, ставка не будет увеличена.");
            }
            else
            {
                Debug.Log("Неверный пароль. Попробуйте снова.");
            }
        }
        else
        {
            Debug.LogWarning("Задание ещё не началось.");
        }
    }

    private void HandleInput(string input)
    {
        Debug.Log($"Пользователь ввёл: {input}");

        // Проверка пароля
        if (input == correctPassword && !passwordEntered)
        {
            Debug.Log("Пароль верный! Увеличиваем ставку.");
            rate += 3;
            passwordEntered = true;
            SaveData();
            CompleteTask();
            ClosePanel();
        }
        else if (passwordEntered)
        {
            Debug.Log("Вы уже вводили правильный пароль, ставка не будет увеличена.");
        }
        else
        {
            Debug.Log("Неверный пароль. Попробуйте снова.");
        }

        if (passwordInput != null)
        {
            passwordInput.text = "";
        }
    }

    private void CompleteTask()
    {
        taskCompleted = true;
        DisableTask();
        SaveData(); 
    }

    private void DisableTask()
    {
        if (passwordInput != null)
        {
            passwordInput.gameObject.SetActive(false); 
        }

        if (checkPasswordButton != null)
        {
            checkPasswordButton.gameObject.SetActive(false); 
        }

        if (startTaskButton != null)
        {
            startTaskButton.interactable = false;
        }

        Debug.Log("Задание завершено и больше не доступно.");
    }

    private void SaveData()
    {
        PlayerPrefs.SetInt(MoneyKey, money);
        PlayerPrefs.SetInt(RateKey, rate);
        PlayerPrefs.SetInt(TaskCompletedKey, taskCompleted ? 1 : 0);
        PlayerPrefs.SetInt(PasswordEnteredKey, passwordEntered ? 1 : 0);
        PlayerPrefs.Save();
        Debug.Log("Данные сохранены.");
    }

    private void LoadData()
    {
        money = PlayerPrefs.GetInt(MoneyKey, 0);
        rate = PlayerPrefs.GetInt(RateKey, 1);
        taskCompleted = PlayerPrefs.GetInt(TaskCompletedKey, 0) == 1;
        passwordEntered = PlayerPrefs.GetInt(PasswordEnteredKey, 0) == 1;

        if (taskCompleted)
        {
            startTaskButton.interactable = false;
        }

        Debug.Log("Данные загружены.");
    }

    private void OnApplicationQuit()
    {
        SaveData();
        
    }

    public void Update()
    {
        if (moneyText != null)
        {
            moneyText.text = "B" + money;
        }
    }
}