Whirlpool へ流動性を提供できるようになりましょう。
下図では Orca のサイトで 0.1 SOL と 2.3617 USDC を 24.1224 - 31.7638 USDC の価格帯に流動性提供しようとしています。
今回はこれと同じことをプログラムで実装します(ただし Devnet で行います)。
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