Розробка системи крипто-донатів
Задача на перший погляд проста: прийняти крипту від донатера. Але у цьому потоці одразу кілька нетривіальних запитань — як показати статус в реальному часі, як працювати з розними сітями та токенами, що робити з пилом (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 надійніший за polling: 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 днів розробки.







