Разработка Discord-бота управления whitelist
Whitelist-фаза перед публичным минтом решает несколько задач одновременно: фильтрует боты через верификацию активности, вознаграждает ранних сторонников, формирует контролируемый спрос. Discord-бот — стандартный инструмент для сбора WL-адресов, но его типичная реализация создаёт проблему: один человек с несколькими Discord-аккаунтами получает несколько WL-слотов.
Где ломаются WL-боты
Проблема Sybil и её решения
Базовый бот просто записывает адрес кошелька пользователя — никакой защиты от нескольких аккаунтов одного человека. На крупные коллекции приходят сотни ботов-аккаунтов с купленной историей в Discord.
One wallet per Discord account — минимальный уровень: если кошелёк уже зарегистрирован другим Discord ID — отклонить. Не защищает от владельца нескольких Discord-аккаунтов.
Guild membership requirements — для регистрации нужно состоять в сервере N дней, иметь X сообщений, иметь определённую роль. Это поднимает стоимость атаки: купить прокаченный Discord-аккаунт дороже, чем создать новый.
On-chain activity check — самый надёжный фильтр. Бот проверяет через Alchemy/Etherscan API: есть ли у кошелька история транзакций, NFT из конкретных коллекций (OG holder), POAPs, минимальный баланс. Это не только анти-Sybil, но и target marketing — WL для реальных коллекционеров, а не для флиперов.
Ethereum address validation
Распространённая ошибка: бот принимает любую строку, похожую на адрес, без 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 commands вместо prefix commands (современный стандарт Discord). Interaction handling с ephemeral responses для команд с личными данными.
База данных — 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 deployment вместо long-polling.
Ориентиры по срокам
Базовый бот (регистрация, дедупликация, admin команды, экспорт, Merkle generation) — 3-4 дня. С on-chain activity checks и многоуровневыми WL-ролями — 5-7 дней. Кастомные геймификация-механики (квесты, реферальная система) — обсуждается отдельно.







