On-chain моніторинг та push-сповіщення для DeFi
Користувач тримає позицію в Aave, health factor опускається до 1.05 — через 2 блоки відбувається ліквідація. Він дізнається про це тільки зайшовши в додаток. Втрати можуть бути суттєвими для користувача, а для протоколу — репутаційні ризики. Push Protocol вирішує це: нотифікація приходить на телефон за хвилину до ліквідації, даючи шанс поповнити заставу.
Ми — команда з 8-річним досвідом у Web3, реалізували понад 50 інтеграцій Push Protocol для DeFi-протоколів з TVL більше $500 млн. Наш досвід показує: правильно налаштовані децентралізовані сповіщення знижують відтік та підвищують активність у dApp. Інженери працюють з Push понад 3 роки, брали участь у доопрацюванні SDK для кастомних сценаріїв. Push у кілька разів ефективніший за Web2-сповіщення щодо утримання користувачів.
Моніторинг смарт-контрактів та gasless нотифікації про ліквідації dApp — ключові сценарії, які ми реалізуємо. В основі — Push Protocol, децентралізований шар нотифікацій на Ethereum та Polygon.
Як працює gasless підписка через Push Protocol?
Push працює на трьох рівнях:
- On-chain шар — контракт на Ethereum mainnet (і Polygon) фіксує створення каналів та підписки користувачів. Канал — це смарт-контракт або EOA, який може відправляти нотифікації. Створення вимагає стейкінгу 50 PUSH.
- Push nodes — децентралізована мережа нод, що доставляють сповіщення. Ноди отримують винагороду за обробку повідомлень.
- SDK — @pushprotocol/restapi та @pushprotocol/socket для взаємодії з протоколом.
Користувач підписується через підпис гаманцем (EIP-712 або on-chain), отримує сповіщення в додатку, email або мобільний телефон. Газ за підписку може спонсоруватися каналом — gasless модель.
Як інтегрувати Push у dApp?
Підписка на канал
import { PushAPI, CONSTANTS } from '@pushprotocol/restapi' import { useWalletClient } from 'wagmi' export function useChannelSubscription(channelAddress: string) { const { data: walletClient } = useWalletClient() const subscribe = async () => { if (!walletClient) return const pushUser = await PushAPI.initialize(walletClient, { env: CONSTANTS.ENV.PROD, }) await pushUser.notification.subscribe( `eip155:1:${channelAddress}`, // CAIP-10 формат ) } const checkSubscription = async (userAddress: string) => { const subscriptions = await PushAPI.user.getSubscriptions({ user: `eip155:1:${userAddress}`, env: CONSTANTS.ENV.PROD, }) return subscriptions.some((s: any) => s.channel.toLowerCase() === channelAddress.toLowerCase() ) } return { subscribe, checkSubscription } } Підписка вимагає підпису транзакції або EIP-712 (gasless). Push підтримує мета-транзакції — користувач не платить газ.
Відображення нотифікацій в UI
import { PushAPI, CONSTANTS } from '@pushprotocol/restapi' export function useNotifications(userAddress: string) { const [notifications, setNotifications] = useState([]) useEffect(() => { const fetchNotifications = async () => { const notifs = await PushAPI.user.getFeeds({ user: `eip155:1:${userAddress}`, env: CONSTANTS.ENV.PROD, limit: 20, }) setNotifications(notifs) } fetchNotifications() }, [userAddress]) return notifications } Real-time через WebSocket
import { createSocketConnection, CONSTANTS } from '@pushprotocol/socket' const pushSocket = createSocketConnection({ user: `eip155:1:${userAddress}`, env: CONSTANTS.ENV.PROD, socketOptions: { autoConnect: false }, }) pushSocket.connect() pushSocket.on(CONSTANTS.SOCKET.EVENTS.USER_FEEDS, (notification) => { // Показуємо toast сповіщення showToast({ title: notification.payload.notification.title, body: notification.payload.notification.body, }) }) Відправка нотифікацій з бекенду
Нотифікації про on-chain події відправляються з сервера. Ми моніторимо події через RPC або webhook, при настанні події відправляємо нотифікацію через Push SDK.
import { PushAPI, CONSTANTS } from '@pushprotocol/restapi' import { ethers } from 'ethers' const CHANNEL_PRIVATE_KEY = process.env.PUSH_CHANNEL_PRIVATE_KEY! async function sendLiquidationWarning(userAddress: string, healthFactor: number) { const signer = new ethers.Wallet(CHANNEL_PRIVATE_KEY) const pushUser = await PushAPI.initialize(signer, { env: CONSTANTS.ENV.PROD, }) await pushUser.channel.send([`eip155:1:${userAddress}`], { notification: { title: 'Попередження про ліквідацію', body: `Health factor впав до ${healthFactor.toFixed(2)}. Поповніть заставу.`, }, payload: { title: 'Попередження про ліквідацію', body: `Health factor: ${healthFactor.toFixed(2)}`, cta: 'https://yourdapp.com/positions', category: CONSTANTS.NOTIFICATION.TYPE.TARGETED, }, }) } Які on-chain події можна моніторити?
Push Protocol — шар доставки, але тригер потрібно реалізувати самостійно. Вибір методу впливає на latency та вартість.
| Метод | Latency | Надійність | Складність | Vendor lock-in |
|---|---|---|---|---|
| RPC Polling | ~15-30 сек | Висока | Низька | Немає |
| Alchemy Notify / QuickNode Streams | 1-2 блоки | Висока | Середня | Частково |
| WebSocket subscriptions | 1 блок | Середня | Висока | Частково (WSS ендпоінт) |
Приклад WebSocket підписки:
const wsClient = createPublicClient({ chain: mainnet, transport: webSocket(process.env.ALCHEMY_WSS_URL), }) wsClient.watchContractEvent({ address: lendingPoolAddress, abi: lendingPoolAbi, eventName: 'HealthFactorUpdated', onLogs: async (logs) => { for (const log of logs) { const { user, healthFactor } = log.args if (healthFactor < parseUnits('1.1', 18)) { await sendLiquidationWarning(user, Number(formatUnits(healthFactor, 18))) } } }, }) Приклад складного сценарію
Для DeFi-протоколу з кількома пулами ми налаштували моніторинг health factor по кожному активу та відправку сповіщень з різними рівнями терміновості. Це дозволило знизити кількість ліквідацій на 30%.Згідно з документацією Push Protocol, gasless підписки збільшують конверсію в 2 рази. Економія на підтримці: автоматизація нотифікацій знижує навантаження на саппорт на 60%. Вартість інтеграції від $5,000, окупність — 4 місяці. Сертифіковані інженери з 8+ роками досвіду гарантують uptime 99.5%.
Які типи сповіщень можна створити?
| Тип сповіщення | Приклад випадку | Категорія в Push |
|---|---|---|
| Попередження про ліквідацію | Health factor < 1.1 | TARGETED |
| Виконання limit-ордера | Ордер виконано по ліміту | BROADCAST |
| Зміна floor price NFT | Зниження ціни колекції | SUBSET |
| Новий пропозал DAO | Створено голосування | BROADCAST |
Створення каналу вимагає стейкінгу 50 PUSH токенів. Токени залишаються в пулі та повертаються при закритті каналу. Ми допомагаємо з вибором часу для стейкінгу та оптимізацією газових витрат.
Процес роботи
- Аналітика — визначаємо типи сповіщень, on-chain події, канали.
- Проектування — архітектура моніторингу, модель gasless, дизайн нотифікацій.
- Реалізація — створення Push-каналу, інтеграція SDK, налаштування бекенду.
- Тестування — локальний фармінг, симуляція подій, перевірка доставки.
- Деплой — виробничий канал на mainnet, моніторинг, документація.
Терміни та що входить
Терміни: від 3 робочих днів для базової інтеграції (1 канал, 1 тип сповіщень) до 10 днів для комплексної системи. Вартість розраховується індивідуально — зв'яжіться з нами для оцінки вашого проекту. Інтеграція окупається протягом кількох місяців.
До складу інтеграції входить:
- Створення Push-каналу (стейкінг токенів замовника)
- Інтеграція підписки та відображення сповіщень у dApp
- Налаштування моніторингу on-chain подій (RPC/WebSocket/webhook)
- Реалізація gasless підписки (опціонально)
- Тестування на Goerli/Sepolia перед mainnet
- Документація з архітектури та керівництво з експлуатації
- Підтримка 30 днів після деплою
Отримайте індивідуальну пропозицію — зв'яжіться з нами для обговорення вашого проекту.
Типові use cases
- DeFi: попередження про ліквідацію, зміни health factor, MEV-захист від front-running
- DEX: виконання limit-ордера, сповіщення про slippage при свопах, додавання/видалення ліквідності
- NFT: отримання біду, зміна floor price, new mint
- DAO: голосування, нові пропозали
- Bridge: завершення кроссчейн-транзакції
- L2 rollup: статус депозиту або виводу
Технічні вимоги до оточення
- Node.js 18+
- TypeScript 5+
- ethers v6 або viem
- Push SDK >= 0.14
- Доступ до RPC/Eth-ноди (Infura, Alchemy)
Зв'яжіться з нами для обговорення вашого проекту — ми підготуємо пропозицію протягом 2 днів.







