# Устойчивое создание PDA (защита от «минирования» адреса) ## Краткое описание В `shine_payments` и `shine_users` функция `create_pda_account` переведена с жёсткого `system_instruction::create_account` на паттерн «создание поверх предзаполненного»: - если на детерминированном адресе будущего PDA нет лампортов — обычный `create_account`; - если лампорты уже есть («подсев» атакующим) — добор ренты переводом, затем `allocate` + `assign` под подписью PDA. Дополнительно в `shine_payments` `is_uninitialized_account` перестала требовать нулевой баланс (проверяет только пустые данные + владельца System Program). Это закрывает последний (LOW) пункт аудита: griefing-DoS на покупку тикетов и сквоттинг логинов через предсказуемые адреса PDA. ## Что проверять (devnet/localnet) 1. Обычная покупка тикета без «подсева» — создаётся как раньше (быстрый путь). 2. На адрес следующего тикета заранее переведены лампорты обычным system-переводом → покупка/`manager_add_ticket` всё равно проходит, тикет создаётся корректно, данные и владелец = program id. 3. На адрес `user_pda` будущего логина заранее переведены лампорты → регистрация логина (`create_user_pda`) всё равно проходит; запись и комиссия корректны. 4. Повторная инициализация уже существующего тикета/пользователя по-прежнему отклоняется (`PdaAlreadyExists` / `UserAlreadyExists`). 5. Singleton-PDA (`init`, economy config) и manager allowance создаются без регрессий. ## Ожидаемый результат Подсев лампортов на заранее известный адрес PDA не блокирует создание; вся остальная экономика и проверки повторной инициализации работают как прежде. ## Статус pending