Discord бот для управління вайтлістом
Вайтлист-фаза перед публічним мінтом вирішує кілька завдань одночасно: фільтрує ботів через верифікацію активності, вознаграджує ранніх прихильників, формує контрольований попит. Discord бот — стандартний інструмент для збору WL адрес, але його типова реалізація створює проблему: одна людина з кількома Discord акаунтами отримує кілька WL слотів.
Де ломаються WL боти
Проблема Sybil та її рішення
Базовий бот просто записує адресу гаманця — жодного захисту від кількох акаунтів однієї людини. На великі колекції приходять сотні ботів-акаунтів з куплено історією на Discord.
Один гаманець на Discord акаунт — мінімальний рівень: якщо гаманець вже зареєстрований на інший Discord ID — відхилити. Не захищає від власника кількох Discord акаунтів.
Вимоги членства на сервері — для реєстрації потрібно бути на сервері N днів, мати X повідомлень, мати певну роль. Це підвищує вартість атаки: купити прокачаний Discord акаунт дорожче, ніж створити новий.
Перевірка on-chain активності — найнадійніший фільтр. Бот перевіряє через Alchemy/Etherscan API: чи є у гаманця історія транзакцій, NFT з конкретних колекцій (OG holder), POAPs, мінімальний баланс. Це не тільки анти-Sybil, але й цільовий маркетинг — WL для справжніх колекціонерів, а не фліперів.
Валідація Ethereum адрес
Поширена помилка: бот приймає будь-яку рядок, схожу на адресу, без checksum-перевірки. Користувач вводить адресу в нижньому регістрі — це валідна Ethereum адреса. Але при генерації Merkle Tree для контракту потрібна нормалізація: всі адреси через ethers.utils.getAddress() або viem.getAddress() для EIP-55 checksum. Невідповідність регістру в Merkle Tree приведе до того, що користувач не зможе заминтити навіть з правильною адресою.
Перевірка: ethers.isAddress(input) перед записом + нормалізація через ethers.getAddress(input).
Функціональність бота
Реєстрація гаманця. /wallet 0x... — користувач вводить адресу. Бот валідує, перевіряє дубікати (обидва напрями: Discord ID → wallet та wallet → Discord ID), зберігає в БД.
Ролі та привілегії. Окремі ролі для різних категорій WL: OG (пріоритетний мінт, більше місць), WL (стандартний), Public. Бот автоматично призначає роль після перевірки on-chain критеріїв.
Управління листом. Admin команди: /wl-export — выгрузка CSV, /wl-stats — кількість по категоріям, /wl-remove @user — видалення з листа, /wl-check 0x... — перевірка адреси.
Генерація Merkle Tree. За запитом або автоматично перед деплоєм — бот генерує Merkle Tree з накопичених адрес та видає root для контракту. Proof для кожної адреси — через API або в личному повідомленні.
Технічний стек
discord.js v14 — основна бібліотека. Slash команди замість prefix команд (сучасний стандарт Discord). Обробка взаємодій з ephemeral відповідями для команд з личними даними.
База даних — PostgreSQL (для production) або SQLite (для малих колекцій). Зберігання: discord_id, wallet_address, registered_at, wl_tier, on_chain_checks_passed.
ethers.js v6 — валідація адрес, генерація Merkle Tree через merkletreejs + keccak256.
Деплой — Railway або VPS з PM2. Для надійності — webhook-based деплой замість long-polling.
Орієнтири за часом
Базовий бот (реєстрація, дедублікація, admin команди, експорт, генерація Merkle) — 3-4 дні. З on-chain перевірками активності та багаторівневими WL ролями — 5-7 днів. Кастомна геймифікація (квести, реферальна система) — обговорюється окремо.







