` і
`
Три різні події, які легко сплутати
Це головне джерело плутанини — і саме через неї в UI довелося робити окремий банер (див. Розрив між кінцем сезону і freeze).
1. Кінець сезону — настає сам
Дата вже записана в базі (seasons.ends_at). Натискати нічого не треба.
У цю мить сезонна таблиця перестає рухатись: XP, зароблений після, у сезонний
рейтинг більше не потрапляє.
Технічно: season_standings рахує пів-відкрите вікно created_at < ends_at.
2. Finalize — коли натиснули кнопку
Підбиття підсумків сезону: система записує остаточні місця, видає медалі за топ-10 і чемпіонство, виплачує призи мем-контесту. Усе це — одна транзакція, або все, або нічого.
Може статись і в день кінця сезону, і через тиждень. Поки не натиснуто, сезон
формально лишається «активним» (finalized_at is null).
→ seasons.md
3. Freeze аірдропу — ще пізніше й про інше
Це вже не про сезон, а про роздачу токенів. Окрема дія, окремі дані, окремі наслідки.
Проєкт не змушує робити 2 і 3 одночасно. Це гнучкість, але й ризик: ніхто
не нагадає, що час настав. Саме тому зʼявилась щоденна перевірка
/api/cron/ops-check, яка сигналить, коли сезон закінчився, а finalize ні.
Розрив між кінцем сезону і freeze
Між подіями 1 і 3 є вікно, у якому все виглядає дивно, якщо не знати правил:
- сезонна таблиця вже замерзла;
- квести, рулетка, скрині все ще нараховують XP;
- цей XP у сезонний рейтинг не йде, але в аірдроп — йде, бо снапшот рахує довічні підсумки на момент freeze.
Раніше про це не говорило ніщо, і людина бачила тільки те, що її рейтинг стоїть.
Тепер у цьому стані показується банер, у сезонному рейтингу зʼявляється
пояснювальний рядок, а в /help є картка «Що після кінця відліку», де обидва
годинники названо явно.
Правило, яке з цього випливає: що пізніше freeze після кінця сезону, то більше «позасезонної» активності потрапить в аірдроп. Це не помилка, але це має бути оголошено заздалегідь — інакше виглядатиме як зміна правил.
Що таке freeze простими словами
Уяви, що ти фотографуєш дошку з результатами. До зйомки на дошці можна писати й стирати. Після — фотографія вже є, і вона не міняється, навіть якщо дошку потім перепишуть.
Freeze робить рівно це. Система бере поточний стан кожного учасника — скільки XP, скільки ачівок, скільки квестів, скільки днів у сімʼї, чи холдер, який гаманець — рахує за формулою бали й записує результат намертво.
Чому «намертво» — це не обіцянка, а механіка
Ті рядки не можна ні змінити, ні видалити: у базі стоять тригери, які
відхиляють DELETE, а руйнівні звʼязки з профілями прибрані. Навіть видалення
профілю не чіпає снапшот. Це не питання дисципліни адміна — база фізично не
дасть.
Дайджест: навіщо контрольна сума
Разом із фотографією рахується довгий рядок символів, який однозначно відповідає її вмісту. Публікуються обидва.
Будь-хто може взяти опубліковану таблицю, перерахувати суму сам і переконатися, що вона збігається. Якщо потім тихо змінити хоч одну цифру — сума не зійдеться, і це побачать усі. Незалежна перевірка робиться так:
node scripts/verify-digest.mjs --csv airdrop_<id>.csv --meta meta_<id>.json --expect sha256:…
У фотографію входить адреса гаманця
Снапшот фіксує не лише «скільки», а й «кому»: номер паспорта і адреса Solana-гаманця вморожуються в рядки й входять у контрольну суму.
Наслідок: якщо людина після freeze поміняє гаманець, стара фотографія лишиться зі старою адресою. Виправити це можна тільки новою фотографією з новою сумою. Тихо підмінити адресата неможливо.
Що дає Season 1
On-chain роздачі цього сезону немає, і токен не випускається. Season 1 дає:
- номер паспорта — назавжди твій, фіксує, що ти був тут рано;
- медалі за мілстоуни й сезонні досягнення;
- місце в заморожених підсумках сезону;
- опублікований снапшот із дайджестом — незворотний, перевірюваний запис того, хто був тут і що зробив.
Останнє — не «втішний приз». Це рівно та обіцянка, яку продукт дає з першого дня, тільки перетворена з гасла на запис, який будь-хто може перевірити самостійно. Коли зʼявиться що розподіляти, спиратись будуть на такий запис.
З Season 2: Discord-сервер і гаманець обовʼязкові
Рішення 16.09.2026. Політика «гаманець не потрібен, щоб брати участь» була помилкою, і Season 1 це показав: три чверті учасників із XP так і лишились без адреси. Виправляємо відкрито й наперед.
З Season 2 доступ до Passport мають лише ті, хто:
- учасник Discord-сервера Gremlins;
- привʼязав Solana-гаманець до паспорта.
Без обох умов увійти в паспорт не вийде. Номер, XP і запис Season 1 нікуди не зникають — доступ повертається одразу, щойно обидві умови виконані.
Season 1 це не зачіпає. Він закривається за оголошеними правилами, і снапшот 18.09 бере саме їх. Нижче — як гаманець працює до кінця Season 1.
Гаманець у Season 1: участі не блокує, але без нього запис лишається неповним
Уточнення 05.08.2026. Тут раніше стояло «нічого в прогресі за ним не замкнено» і «дедлайну немає й поспішати нема куди». Обидва твердження неточні, і ми виправляємо їх відкрито, а не переписуємо мовчки. Саме правило при цьому не змінилось: гаманець і далі не потрібен, щоб брати участь, і бали фіксуються без нього. Змінилось те, що наслідок більше не захований у підрядне речення.
Гаманець не потрібен, щоб брати участь: квести, XP, рівні, ранги, стрик, рулетка, скрині, реферали, меми й мем-контест, рейтинг, лор і генератор працюють без нього. Це правило оголошене й діє до кінця Season 1.
Але «не блокує участь» ≠ «нічого не замкнено». За гаманцем стоять:
- медаль Connected і XP за неї — одразу після лінку;
- перевірка статусу Genesis-холдера: володіння звіряється по залінкованому гаманцю, тож без нього перевірки не буде, навіть якщо NFT у тебе вже є;
- квести для холдерів — ціла категорія, недоступна без цього статусу;
- холдерський бонус до XP за кожен схвалений квест;
- графа адреси у снапшоті — без гаманця бали фіксуються, але адресат лишається порожнім.
І дедлайн є. Це freeze сезону: снапшот бере адресу такою, якою вона є на той момент, і після цього її вже не додати — запис незворотний за побудовою (див. розділ про SHA-256 вище). Тому попереднє «поспішати нема куди» було неправильною порадою: поспішати не треба, а от встигнути до freeze — треба, інакше запис зафіксує лише половину: скільки, але не куди.
Гаманець незмінний після першого лінку — виправляє лише модератор. Тож привʼязуй той, який справді контролюєш.