НОВОЕ: Helius приобретает Light Protocol
Как отслеживать пул ликвидности Raydium
Блог/Разработка

Как отслеживать пул ликвидности Raydium

Инженер по взаимодействию с разработчикамиAnam Ansari в XAnam Ansari в LinkedIn
Чтение: 7 мин
Содержание

    В традиционных финансах покупатели и продавцы обеспечивают ликвидность актива через централизованный рынок. В децентрализованных финансах (DeFi) вместо этого используются пулы ликвидности. Пулы ликвидности — это смарт-контракты, которые позволяют пользователям покупать и продавать криптовалюту на децентрализованных биржах и других платформах DeFi. Отслеживая пулы ликвидности, вы можете оценивать динамику конкретного актива и принимать обоснованные решения о покупке, продаже или обмене. Мониторинг создания новых пулов ликвидности также помогает находить недавно запущенные токены.

    В этой статье рассматриваются два способа мониторинга пулов ликвидности: webhook и WebSocket. Вы также узнаете, как настроить webhook и WebSocket для отслеживания событий в пуле ликвидности. Прежде чем разбираться в работе платформы, вам понадобится ключ Helius API. Его легко получить через панель управления Helius. Зарегистрируйтесь с помощью GitHub, Solana Wallet или аккаунта Google, затем перейдите в раздел API Keys на левой боковой панели.

    Через webhook

    Для работы через webhook нужно выполнить три основных шага. Сначала мы настроим Cloudflare Worker. Затем настроим webhook Helius и добавим URL Cloudflare Worker. Webhook будет запускать Worker каждый раз при обнаружении транзакции в пуле ликвидности. Наконец, мы изменим код Worker, чтобы он обрабатывал уведомление и записывал ответ в журнал.

    Настройка Cloudflare Worker

    Мы настроим Worker, который будет запускаться нашим webhook. Затем добавим в Worker код для обработки сигнала от webhook. Cloudflare Workers позволяет развертывать бессерверный код. Войдите или зарегистрируйтесь на сайте Cloudflare, затем выберите Workers & Pages на левой панели главной страницы.

    ‍Нажмите кнопку Create application.

    ‍Затем нажмите Create Worker.

    ‍Теперь нажмите Deploy.

    ‍Worker успешно развернут. Скопируйте ссылку на Worker: она понадобится для настройки webhook.

    Настройка webhook

    Мы будем отслеживать Raydium — первый AMM на Solana, использующий полностью децентрализованную книгу лимитных заявок. Центральная книга лимитных заявок — это стандартный для фондового рынка биржевой механизм исполнения, который сопоставляет все заявки на покупку и продажу с учетом приоритета цены и времени. Децентрализованная центральная книга лимитных заявок (CLOB) — это биржевая система, работающая в распределенной сети нод, а не под управлением централизованной организации. 

    Мы создадим webhook с помощью Helius. Webhook позволяет отслеживать ончейн-события и запускать определенные действия при их возникновении. Мы настроим webhook для отслеживания конкретных типов транзакций в выбранном пуле ликвидности Raydium. Сейчас Helius поддерживает следующие типы транзакций Raydium: 

    Код
    "RAYDIUM": [
       "WITHDRAW_LIQUIDITY"
       "ADD_LIQUIDITY"
       "CREATE_POOL"
       "SWAP"
     ]

    Webhook можно создать с помощью панели управления Helius или справочника API. Чтобы создать его через панель управления, откройте раздел Webhooks на левой панели и нажмите New Webhook.

    Затем настройте webhook, указав следующие данные:

    1. Сеть: Mainnet/Devnet
    2. Тип webhook: Чтобы получать нужные данные, выберите тип webhook: Enhanced, Raw или Discord. Если вам нужны удобочитаемые данные, выберите Enhanced — мы будем использовать именно его. Если вы предпочитаете Discord, укажите URL webhook, и бот самостоятельно отформатирует и отправит уведомления. Инструкции по настройке webhook для бота Discord приведены в этой статье. Учтите, что при выборе Raw вы не сможете указать тип транзакции.
    3. Тип транзакции: Выберите типы транзакций, показанные на изображении ниже*.* Другие типы транзакций, поддерживаемые программой, перечислены здесь. 
    4. URL webhook: Добавьте URL Worker, который мы настроили в Cloudflare (если вы выбрали Discord, укажите URL webhook для бота)
    5. Заголовок аутентификации: Укажите заголовок аутентификации, который будет передаваться в POST-запросах вашего webhook. Это необязательно.
    6. Адрес аккаунта: Адрес AMM-программы Raydium: 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8. При необходимости можно добавить несколько адресов аккаунтов. Также можно добавить адреса своих активов, чтобы отслеживать их. 

    После нажатия Confirm, ваш webhook начнет отправлять уведомления в Cloudflare Worker.

    Следующий шаг — написать код для обработки уведомления.

    Обработка уведомления webhook в Worker

    Нужно установить Wrangler CLI, чтобы добавить код в Worker и обеспечить корректную обработку данных при его запуске.

    Войдите в аккаунт Cloudflare, чтобы разрешить Wrangler развертывать ваши скрипты в Cloudflare.

    Откройте командную строку или терминал и введите следующую команду:

    Код
    wrangler login

    Когда Wrangler автоматически откроет в браузере экран согласия Cloudflare, нажмите кнопку Allow. После этого API Token будет отправлен в Wrangler.‍

    Инициализируйте новый проект из Worker, созданного через панель управления Cloudflare:

    Код
    wrangler init --from-dash <worker-name>

    Имя Worker можно найти в разделе Metrics:

    ‍Команда выше создаст папку с конфигурацией и кодом Worker. Затем замените код в файле src/index.js приведенным ниже кодом. Обязательно добавьте свой ключ API. Чтобы скрыть ключ API, рекомендуем следовать этим рекомендациям.

    Теперь используем в Worker следующий код:

    Код
    const HELIUS_API_KEY = API_KEY;
    const HELIUS_RPC_URL = `https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}`;
    
    addEventListener('fetch', event => {
        event.respondWith(handleRequest(event.request))
    })
    
    async function handleRequest(request) {
        if (request.method === 'POST') {
            const requestBody = await request.json();
            console.log(requestBody[0].description);
    
            return new Response('Logged POST request body.', { status: 200 });
        } else {
            return new Response('Method not allowed.', { status: 405 });
        }
    }

    ‍В этом коде мы записываем в журнал только описание уведомления. Уведомления с ответом имеют формат разобранной транзакции. Обратите внимание, что финансовые данные, например сведения о цене, не предоставляются. Для получения финансовой информации можно использовать такие платформы, как Jupiter и Birdeye.‍

    Разверните проект в глобальной сети Cloudflare:

    Код
    wrangler publish

    После успешной публикации кода проверим журналы.

    Вернитесь на сайт Cloudflare и откройте раздел Logs:

    ‍Нажмите кнопку Begin Log Stream.

    ‍Чтобы просмотреть записанные данные в разделе "message", разверните любую полученную запись журнала.

    Через WebSocket

    WebSocket — это протокол связи, который обеспечивает обмен данными между клиентами и серверами в реальном времени. Он отличается от традиционных методов, при которых клиент отправляет запрос и ждет ответа сервера. При использовании WebSocket соединение остается открытым, а данные передаются непрерывно. Мы будем использовать WebSocket для мониторинга пула ликвидности Raydium.

    Чтобы ускорить получение ответов в проекте, мы используем улучшенный с помощью Geyser метод transactionSubscribe, доступный в бета-версии. Обратите внимание: этот метод доступен только на планах Business или Professional. Улучшенные с помощью Geyser WebSockets работают быстрее стандартных методов RPC WebSocket. Для начала создадим простой проект JavaScript и новую папку с именем websocket-test. Затем нужно создать файл package.json.

    Код
    {
        "name": "websocket-test",
        "version": "1.0.0",
        "description": "",
        "main": "index.js",
        "scripts": {
            "test": "echo \"Error: no test specified\" && exit 1",
            "start": "ts-node src/index.js"
        },
        "keywords": [],
        "author": "",
        "license": "ISC",
        "devDependencies": {
            "@types/bn.js": "^5.1.0",
            "ts-node": "^10.7.0",
            "typescript": "^4.6.3"
        },
        "dependencies": {
            "@solana/web3.js": "^1.41.3",
            "dotenv": "^16.0.0"
        }
    }
    

    Создайте папку с именем src и добавьте в нее файл index.js.

    Скопируйте приведенный ниже код и вставьте его в файл, заменив <your-api-key> своим ключом Helius API. 

    Код
    const WebSocket = require('ws');
    
    // Function to send a request to the WebSocket server
    function sendRequest(ws) {
        const request = {
            jsonrpc: "2.0",
            id: 420,
            method: "transactionSubscribe",
            params: [{
                    failed: false,
                    accountInclude: ["675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8"]
                },
                {
                    commitment: "processed",
                    encoding: "base64",
                    transactionDetails: "full",
                    showRewards: true,
                    maxSupportedTransactionVersion: 0
                }
            ]
        };
        ws.send(JSON.stringify(request));
    }
    
    function websocketHandler() {
        // Create a WebSocket connection
        let ws = new WebSocket('wss://atlas-mainnet.helius-rpc.com?api-key=<your-api-key>');
    
        // Define WebSocket event handlers
    
        ws.on('open', function open() {
            console.log('WebSocket is open');
            sendRequest(ws); // Send a request once the WebSocket is open
        });
    
        ws.on('message', function incoming(data) {
            const messageStr = data.toString('utf8');
            console.log('Received:', messageStr);
        });
    
        ws.on('error', function error(err) {
            console.error('WebSocket error:', err);
        });
    
        ws.on('close', function close() {
            console.log('WebSocket is closed');
            // connection closed, discard old websocket and create a new one in 5s
            ws = null
            setTimeout(startWebsocket, 5000)
        });
    }
    
    websocketHandler();

    Мы добавили адрес AMM-программы Raydium 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 в параметр-массив accountInclude запроса. Чтобы получить нужные данные, добавьте подходящие параметры. 

    Код подключается к WebSocket и выводит весь ответ в консоль. WebSocket закрывается примерно через ~5 минут бездействия. Чтобы этого избежать, в обработчик onClose добавлена логика повторного подключения. 

    Выполните эту команду в командной строке или терминале: 

    Код
    npm install && npm start

    В консоли начнут появляться такие записи:

    Заключение

    Вот и все! Настроить webhook для мониторинга пула ликвидности несложно. Для более быстрого получения ответов можно использовать улучшенный с помощью Geyser метод WebSocket. После завершения настройки вы можете создать подходящий интерфейс для отображения данных. Для выделенного соединения с более высокой скоростью можно использовать отдельную ноду с плагином Geyser RPC. Если у вас возникнут проблемы или понадобится помощь, свяжитесь с нами в Discord!

    Укажите ниже свой адрес электронной почты, чтобы не пропускать новости Solana. Хотите узнать больше? Читайте свежие статьи в блоге Helius и продолжайте знакомство с Solana уже сегодня.

    Ресурсы

    ‍

    Подпишитесь на Helius

    Следите за новостями разработки на Solana и получайте уведомления о наших публикациях

    Увеличенное изображение