MyTonWallet Giveaways
MyTonWallet TeamТехническое задание на разработку системы раздач криптовалюты в MyTonWallet.
Описание задачи
Необходимо разработать систему для организации и проведения раздач (giveaways) криптовалюты (TON и jettons) пользователям кошелька MyTonWallet.
Авторизованные (с помощью secret-токена) партнёры смогут создавать раздачи, пополнять их баланс и приглашать других пользователей принять в них участие с помощью публикации ссылки вида https://my.tt/g/{GIVEAWAY_ID}.
Ссылка открывает MyTonWallet (через механизм universal link) и запускает процесс авторизации участника в раздаче. После прохождения авторизации участник может получить вознаграждение.
Существует два типа раздач:
- мгновенные (instant) — участники получают вознаграждения сразу после перехода по ссылке,
- розыгрыши (lottery) — раздача имеет срок действия и количество победителей, которые в момент окончания срока раздачи выбираются случайным образом среди всех участников.
Раздачи могут опционально содержать задание. В этом случае для выплаты необходимо подтверждение выполнения задания через обратный вызов от стороннего сервиса.
Проект включает в себя разработку трёх компонентов:
- серверное приложение для управления раздачами,
- dapp для авторизации участников в раздачах,
- (опционально) Telegram-бот для упрощения управления раздачами.
Компоненты системы
1. Основное серверное приложение
Описание
Основное приложение должно работать на сервере, взаимодействовать с базой данных для хранения информации о раздачах и участниках, а также управлять TON-кошельком для проверки пополнения баланса раздачи создателем и выплат участникам.
Технологии
Node.js, TypeScript, Sequelize, Postgres.
Ключевые функции
- Cоздание раздачи. POST-запрос с данными раздачи.
POST /giveaways { giveaway: NewGiveaway; secret: %SECRET% }
=> 200 SuccessResponse | 400 ErrorResponse
type NewGiveaway = {
type: 'instant' | 'lottery';
endsAt?: Date; // Required for 'lottery'
tokenAddress?: string; // Leave blank for Toncoin
amount: number; // For each receiver
receiverCount: number;
taskUrl?: string;
}
type SuccessResponse = {
giveawayLink: string; // Ex.: https://my.tt/g/{GIVEAWAY_ID}
topUpLink: string; // Ex.: ton://transfer/{MAIN_ADDRESS}?token={TOKEN_ADDRESS}&amount={amount * participantCount}&comment={GIVEAWAY_ID}
taskToken?: string;
}
type ErrorResponse = {
error: string;
}
- Мониторинг пополнений. Каждые 5 секунд необходимо проверять входящие транзакции на специальный кошелёк
MAIN_ADDRESSи обновлять статус раздачи после пополнения баланса. - GET-запрос для получения статуса и других данных раздачи.
GET /giveaways/{GIVEAWAY_ID}
=> 200 Giveaway | 404 ErrorResponse
type Giveaway = NewGiveaway & {
status: 'pending' | 'active' | 'finished';
participantCount: number;
}
- Авторизация пользователей. Проверяет captcha, подпись публичным ключом, и создаёт запись в таблице
participantsсо значениемParticipant.status = 'awaitingTask' | 'awaitingPayment'.
POST /giveaways/{GIVEAWAY_ID}/checkin {
captchaToken: string;
receiverAddress: string;
publicKey: string;
signedProof: string;
}
=> 200 { ok: true, giveaway: Giveaway } | 400 ErrorResponse
model Participant {
giveawayId: string;
receiverAddress: string;
status: 'awaitingTask' | 'awaitingPayment' | 'paid' | 'lost';
}
- Обратные вызовы для заданий. POST-запрос для приема подтверждения выполнения задания от стороннего сервиса. Обновляет
Participant.status = 'awaitingPayment'.
POST /giveaways/{GIVEAWAY_ID}/complete-task {
taskToken: string;
receiverAddress: string;
}
=> 200 { ok: true } | 400 ErrorResponse
- Выплаты победителям. Каждые 5 секунд необходимо проверять участников со статусом
Participant.status = 'awaitingPayment', производить выплаты на их адреса и обновлятьParticipant.status = 'paid'. Для подписи транзакций используется env-переменнаяMAIN_ADDRESS_MNEMONICS. - Завершение розыгрышей. Каждые 5 секунд необходимо определять завершённые розыгрыши, случайным образом определять победителей и обновлять
Participant.status = 'awaitingPayment' | 'lost'.
2. Checkin dapp
Описание
Приложение для регистрации участников в раздаче, использующее captcha и подпись с помощью TON Connect with proof для авторизации.
Технологии
JavaScript, HTML, CSS.
Функции
- Авторизация участников. Принимает единственный query-параметр
?giveawayId=.... Использует captcha и TON Connect для верификации и регистрации участников. См. https://checkin.mytonwallet.org для примера. - Отображение статуса участия. Информирует пользователя о статусе его участия и выводит информацию о раздаче.
- Управление заданиями. Если раздача связана с выполнением задания, отображает статус задания и предоставляет ссылку для его выполнения.
Режим разработки
- Ссылки вида https://my.tt/g/{GIVEAWAY_ID} пока не поддерживаются в MyTonWallet. Для отладки вашего Checkin-приложения вы можете вручную открывать его, вводя адрес https://{YOUR_DAPP_URL}/?giveawayId={GIVEAWAY_ID} через встроенный браузер в разделе Обзор (Explore).
3. Telegram-бот (опционально)
Описание
Бот для Telegram, предоставляющий более удобный интерфейс к серверному приложению для управления раздачами.
Технологии
Node.js, TypeScript, Telegraf.js/grammY.
Функции
- Создание раздачи. Позволяет создателю раздачи задать её параметры через диалоговое взаимодействие. В конце присылает сообщение с информацией о раздаче и кнопкой (
giveawayLink) для участия в раздаче (такое сообщение, например, удобно переслать в публичный канал). Дополнительно присылаетton://-ссылку для пополнения баланса раздачи иtaskTokenдля обратного вызова после выполнения задания. - Проверка статуса. Позволяет узнать статусы ранее созданных раздач по их ID через диалоговое взаимодействие.