# `shine_login_guard`

## Кратко

`shine_login_guard` — первая программа Solana-модуля SHiNE. Она проверяет логин перед регистрацией пользователя и возвращает класс логина.

Папка программы: `shine-solana/shine/programs/shine_login_guard/`.

## Текущая функция

1. `classify_login(login: String)`
   - Нормализует логин.
   - Проверяет длину и допустимые символы.
   - Сравнивает части логина со словарями premium/trademark.
   - Возвращает результат через `set_return_data`.

Классы результата:

- `0` — обычный логин, регистрацию можно продолжать.
- `1` — premium-логин.
- `2` — trademark-логин, нужна отдельная проверка/разрешение.

## Правила нормализации и классификации

Текущая логика из `programs/shine_login_guard/src/lib.rs`:

- пустой логин или логин длиннее 20 символов получает класс `premium`;
- `_` при нормализации удаляется;
- допустимы только ASCII-буквы и цифры, остальные символы дают класс `premium`;
- после удаления `_` результат приводится к нижнему регистру;
- логины длиной 7 символов или меньше считаются `premium`;
- логин разбивается максимум на 3 словарных фрагмента;
- если среди найденных фрагментов есть trademark-слово, результат `trademark`;
- если найдены только premium-слова, результат `premium`;
- если разбиение по словарям не найдено, результат `free`.

Словари собираются на этапе build из файлов:

- `programs/shine_login_guard/src/dictionaries/premium/*.txt`
- `programs/shine_login_guard/src/dictionaries/trademarks/*.txt`

## Роль в общей схеме

`shine_users::create_user_pda` вызывает `shine_login_guard` через CPI и продолжает регистрацию только если логин получил класс `0`.

## Ключи и управление

На старте удобно считать, что у программы есть отдельный управляющий ключ `key_1`.

Текущая рекомендация:

- пока оставить `shine_login_guard` под отдельным ключом;
- не передавать ее DAO до стабилизации правил premium/trademark;
- позже можно передать upgrade-authority DAO, чтобы изменения словарей и правил проходили через голосование.

## Счета

Собственных постоянных PDA-счетов у программы сейчас нет. Для проверки нужен только подписант транзакции в `ClassifyLogin`.
