Разработка системы крипто-донатов
Задача на первый взгляд простая: принять крипту от донатера. Но в этом потоке сразу несколько нетривиальных вопросов — как показать статус в реальном времени, как работать с разными сетями и токенами, что делать с пылью (dust) после газа, и как не потерять донат при реорге сети.
Минимальная жизнеспособная схема
Для разового или малообъёмного потока донатов не нужна сложная инфраструктура. Схема с одним адресом:
- Публикуете один адрес (ETH/BTC/SOL) на странице
- Webhook-мониторинг через провайдера (Alchemy Notify, Moralis Streams, QuickNode Streams)
- Webhook триггерит бэкенд → обновляет UI донатера в real-time
// Alchemy Notify webhook handler
app.post('/webhook/donations', express.raw({type: 'application/json'}), async (req, res) => {
const isValid = verifyAlchemySignature(req.body, req.headers['x-alchemy-signature'], WEBHOOK_SECRET)
if (!isValid) return res.sendStatus(401)
const payload = JSON.parse(req.body.toString())
for (const activity of payload.event?.activity || []) {
if (activity.toAddress.toLowerCase() === DONATION_ADDRESS.toLowerCase() && activity.value > 0) {
await db.donations.create({
txHash: activity.hash,
fromAddress: activity.fromAddress,
amount: activity.value,
asset: activity.asset,
status: 'pending'
})
io.emit('new_donation', { amount: activity.value, asset: activity.asset })
}
}
res.sendStatus(200)
})
Webhook надёжнее поллинга: Alchemy/QuickNode ретраят доставку при неудаче, и вы не пропустите транзакцию.
Подтверждения: когда считать донат полученным
Не считайте донат финальным по первому уведомлению. Для ETH mainnet — минимум 6 подтверждений, для L2 (Arbitrum, Base, Optimism) — 1–2 достаточно (finality у L2 быстрее, реорги редкие). Для BTC — 1 подтверждение для малых сумм, 3+ для крупных.
Статус-машина для доната:
-
detected— транзакция в mempool -
confirming— включена в блок, ждём подтверждений -
confirmed— достигнуто нужное число подтверждений, донат засчитан -
failed— реорг или dropped транзакция
Виджет для стримеров / real-time уведомления
Самый частый сценарий: стример хочет получать крипто-донаты с pop-up уведомлением в OBS. Архитектура:
Blockchain → Webhook Provider → Backend API → WebSocket (Socket.io) → OBS Browser Source
Виджет — HTML страница с WebSocket подключением:
<!-- OBS Browser Source URL: https://yourapp.com/widget?streamer_id=123 -->
<script>
const socket = io('wss://yourapp.com')
socket.on('donation', (data) => {
showDonationAlert(data.sender, data.amount, data.currency, data.message)
})
</script>
Мультивалютность без лишней сложности
Для небольшой системы — принимать USDC/USDT на нескольких сетях плюс нативный ETH. Это покрывает 90% аудитории. Давать донатеру выбор сети — ETH mainnet, Arbitrum, Base, Polygon — это снижает барьер (газ на L2 дешевле).
Идентификация донации по сети + адресу + токену:
def identify_donation(network: str, token: str, amount: float, tx_hash: str) -> Donation:
usd_value = convert_to_usd(token, amount, network)
return Donation(
tx_hash=tx_hash,
network=network,
token=token,
raw_amount=amount,
usd_value=usd_value,
confirmed=False
)
Полная система с real-time виджетом, мультисетевым приёмом и дашбордом: 3–5 дней разработки.







