新着:HeliusがLight Protocolを買収
Raydium流動性プールを監視する方法
ブログ/開発

Raydium流動性プールを監視する方法

Developer ExperienceエンジニアXのAnam AnsariLinkedInのAnam Ansari
読了時間:7分
目次

    従来の金融では、買い手と売り手が中央集権型市場を通じて資産に流動性を提供します。一方、分散型金融(DeFi)では流動性プールを使用します。流動性プールとは、分散型取引所やその他のDeFiプラットフォームで、ユーザーが暗号資産を売買できるようにするスマートコントラクトです。流動性プールを監視することで、特定の資産のパフォーマンスを追跡し、購入、売却、スワップのタイミングについて十分な情報に基づいて判断できます。また、新しい流動性プールの作成を監視すれば、ローンチされたばかりのトークンを発見するのにも役立ちます。

    この記事では、流動性プールを監視する2つの方法、webhookとWebSocketについて解説します。また、流動性プールで発生するイベントをリッスンするために、webhookとWebSocketを設定する方法も説明します。プラットフォームの仕組みを詳しく見る前に、Helius APIキーが必要です。Helius Dashboardから簡単に取得できます。GitHub、Solana Wallet、またはGoogleアカウントで登録し、左側のサイドバーにあるAPI Keysセクションに移動してください。

    webhookを使用する方法

    webhookを使用して構築するには、大きく3つの手順を実行します。まず、Cloudflare Workerを設定します。次に、Helius webhookを設定し、Cloudflare WorkerのURLを追加します。流動性プール内のトランザクションをリッスンするたびに、webhookがWorkerをトリガーします。最後に、この通知を処理してレスポンスをログに記録するように、Workerのコードを編集します。

    Cloudflare Workerを設定する

    webhookによってトリガーされるWorkerを設定します。webhookから受け取ったトリガーを処理するコードをWorkerに追加します。Cloudflare Workersを使用すると、サーバーレスコードをデプロイできます。CloudflareのWebサイトにログインまたは登録し、メインページの左側のパネルからWorkers & Pagesを選択します。

    ‍Create applicationボタンをクリックします。

    ‍次に、Create Workerをクリックします。

    ‍続いて、Deployをクリックします。

    ‍Workerが正常にデプロイされました。このWorkerのリンクはwebhookの設定に使用するため、コピーしてください。

    webhookを設定する

    Raydiumを監視します。Raydiumは、完全に分散化された中央指値注文板を活用する、Solana上で構築された最初のAMMです。中央指値注文板とは、株式市場で一般的な取引所形式の執行方法であり、価格と時間の優先順位に従ってすべての買い注文と売り注文をマッチングします。分散型中央指値注文板(CLOB)は、中央管理主体ではなく、分散ネットワーク上のノードで動作する取引システムです。 

    Heliusを使用してwebhookを作成します。webhookを使用すると、オンチェーンイベントをリッスンし、そのイベントが発生したときに特定のアクションをトリガーできます。指定したRaydium流動性プール内の特定のトランザクションタイプをリッスンするようにwebhookを設定します。Heliusは現在、Raydiumについて次のトランザクションタイプをサポートしています。 

    コード
    "RAYDIUM": [
       "WITHDRAW_LIQUIDITY"
       "ADD_LIQUIDITY"
       "CREATE_POOL"
       "SWAP"
     ]

    webhookは、Helius DashboardまたはAPIリファレンスを使用して作成できます。Dashboardから作成するには、左側のパネルにあるWebhooksセクションに移動し、New Webhookをクリックします。

    次に、以下の情報を入力してwebhookを設定します。

    1. ネットワーク: Mainnet/Devnet
    2. webhookタイプ:必要なデータに応じて、Enhanced、Raw、Discordのいずれかのwebhookタイプを選択します。人が読みやすいデータが必要な場合はEnhancedを選択します。ここではこれを選択します。Discordを使用する場合はWebhook URLを送信する必要があり、ボットが通知を整形して直接送信します。Discord Bot用のwebhookを設定する方法については、こちらの記事を参照してください。Rawを選択すると、トランザクションタイプを指定できない点に注意してください。
    3. トランザクションタイプ: *下の画像に表示されているトランザクションタイプを選択します。Programでサポートされているその他のトランザクションタイプはこちらで確認できます。 
    4. Webhook URL: Cloudflareで設定したWorkerのURLを追加します(Discordを選択した場合は、ボット用のWebhook URLを指定する必要があります)
    5. 認証ヘッダー: webhookのPOSTリクエストに渡す認証ヘッダーを入力します。これは任意です。
    6. アカウントアドレス: RaydiumのAMM Program Addressはこちらです:675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8。必要に応じて複数のアカウントアドレスを追加できます。監視する資産のアドレスも追加できます。 

    **Confirm,**をクリックすると、webhookがCloudflare Workerに通知します。

    次の手順では、通知を処理するための適切なコードを記述します。

    Workerでwebhook通知を処理する

    Workerにコードを追加し、トリガーされた際にデータを正しく処理できるようにするには、Wrangler CLIをインストールする必要があります。

    Cloudflareアカウントにログインし、WranglerがスクリプトをCloudflareにデプロイできるようにします。

    コマンドプロンプトまたはターミナルを開き、次のコマンドを入力します。

    コード
    wrangler login

    Wranglerによってブラウザが自動的に開き、Cloudflareの同意画面が表示されたら、Allowボタンをクリックします。これにより、API TokenがWranglerに送信されます。‍

    Cloudflare Dashboardで作成したWorkerから新しいプロジェクトを初期化します。

    コード
    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のWebサイトに戻り、Logsセクションに移動します。

    ‍Begin Log Streamボタンをクリックします。

    ‍受信したログを展開すると、「message**」**の下に記録されたデータを表示できます。

    WebSocketを使用する方法

    WebSocketは、クライアントとサーバー間でリアルタイムにデータを交換できる通信プロトコルです。これは、クライアントがリクエストを送信し、サーバーの応答を待つ従来の方式とは異なります。WebSocketでは接続が開いたまま維持され、継続的にデータが交換されます。ここでは、WebSocketを使用してRaydium流動性プールを監視します。

    プロジェクトのレスポンス速度を高めるために、ベータ機能として提供されているGeyser拡張版のtransactionSubscribeメソッドを使用します。このメソッドはBusinessまたはProfessionalプランでのみ利用できます。 Geyser Enhanced WebSocketは、標準の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();

    リクエストのaccountInclude配列パラメータに、RaydiumのAMM Program Addressである675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8を追加しています。必要なデータを取得するには、適切なパラメータを追加できます。 

    このコードはWebSocketに接続し、レスポンス全体をコンソールに記録します。WebSocketは、約5分間操作がないと切断されます。これを防ぐため、onCloseハンドラーに再接続ロジックを追加しています。 

    コマンドプロンプトまたはターミナルで、次のコマンドを実行します。 

    コード
    npm install && npm start

    コンソールに次のようなログが表示されます。

    まとめ

    以上です。流動性プールを監視するwebhookは簡単に設定できます。また、より高速なレスポンスが必要な場合は、Geyser拡張版のWebSocketメソッドも利用できます。設定が完了したら、データを表示するための適切なフロントエンドを構築できます。より高速な専用接続が必要な場合は、Geyser RPCプラグインを備えた専用ノードを利用できます。問題が発生した場合やサポートが必要な場合は、Discordからお気軽にお問い合わせください。

    Solanaの最新情報を見逃さないよう、下にメールアドレスを入力してください。さらに詳しく知りたいですか?Heliusブログで最新の記事をチェックし、今すぐSolanaの世界をさらに深く探究しましょう。

    リソース

    ‍

    Heliusを購読

    Solana開発の最新情報や新しい記事の公開通知を受け取れます

    拡大画像