Whirlpool へ流動性を提供できるようになりましょう。

プログラムで実現すること

下図では Orca のサイトで 0.1 SOL と 2.3617 USDC を 24.1224 - 31.7638 USDC の価格帯に流動性提供しようとしています。

今回はこれと同じことをプログラムで実装します(ただし Devnet で行います)。

スクリーンショット 2022-06-14 0.29.02.png

スクリーンショット 2022-06-14 0.29.20.png

現在価格の取得

Whirlpool のプールに流動性を提供する場合、どの価格帯で流動性を提供するかを指定する必要があります。そのため、まずプールにおける現在価格を取得し、価格帯を決める参考にします。

コード

src フォルダ下に「031_get_price.ts」を作り、内容は下記とします。

import { PublicKey } from "@solana/web3.js";
import { AnchorProvider } from "@coral-xyz/anchor";
import {
  WhirlpoolContext, buildWhirlpoolClient, ORCA_WHIRLPOOL_PROGRAM_ID,
  PDAUtil, PriceMath
} from "@orca-so/whirlpools-sdk";

// スクリプト実行前に環境変数定義が必要です
// ANCHOR_PROVIDER_URL=https://api.devnet.solana.com
// ANCHOR_WALLET=wallet.json

async function main() {
  // WhirlpoolClient 作成
  const provider = AnchorProvider.env();
  const ctx = WhirlpoolContext.withProvider(provider, ORCA_WHIRLPOOL_PROGRAM_ID);
  const client = buildWhirlpoolClient(ctx);

  console.log("endpoint:", ctx.connection.rpcEndpoint);
  console.log("wallet pubkey:", ctx.wallet.publicKey.toBase58());

  // トークン定義
  // devToken specification
  // <https://everlastingsong.github.io/nebula/>
  const devUSDC = {mint: new PublicKey("BRjpCHtyQLNCo8gqRUr8jtdAj5AjPYQaoqbvcZiHok1k"), decimals: 6};
  const devSAMO = {mint: new PublicKey("Jd4M8bfJG3sAkd82RsGWyEXoaBXQP7njFzBwEaCTuDa"), decimals: 9};

  // Whirlpool の Config アカウント
  // devToken ecosystem / Orca Whirlpools
  const DEVNET_WHIRLPOOLS_CONFIG = new PublicKey("FcrweFY1G9HJAHG5inkGB6pKg1HZ6x9UC2WioAfWrGkR");

  // devSAMO/devUSDC プール取得
  const tick_spacing = 64;
  const whirlpool_pubkey = PDAUtil.getWhirlpool(
      ORCA_WHIRLPOOL_PROGRAM_ID,
      DEVNET_WHIRLPOOLS_CONFIG,
      devSAMO.mint, devUSDC.mint, tick_spacing).publicKey;
  console.log("whirlpool_key:", whirlpool_pubkey.toBase58());
  const whirlpool = await client.getPool(whirlpool_pubkey);

  // プールにおける現在価格を取得
  const sqrt_price_x64 = whirlpool.getData().sqrtPrice;
  const price = PriceMath.sqrtPriceX64ToPrice(sqrt_price_x64, devSAMO.decimals, devUSDC.decimals);

  console.log("sqrt_price_x64:", sqrt_price_x64.toString());
  console.log("price:", price.toFixed(devUSDC.decimals));
}

main();

実行結果

実行し、devSAMO の devUSDC 価格を確認します。

この実行例では 1 devSAMO = 0.01 devUSDC となります。

$ export ANCHOR_PROVIDER_URL=https://api.devnet.solana.com $ export export ANCHOR_WALLET=wallet.json $ ts-node src/031_get_price.ts endpoint: https://api.devnet.solana.com wallet pubkey: 2fng9ronQimfU3osQUDAcuQnoXH3DhsyzFTyppnfGfm8 whirlpool_key: EgxU92G34jw6QDG9RuTX9StFg1PmHuDqkRKAE5kVEiZ4 sqrt_price_x64: 58334166546793311 price: 0.010000