🏦

XRPLでのAMM機能実装ガイド①:セットアップからプール作成まで

に公開

はじめに

XRP Ledger(XRPL)はBitcoinに次ぐ長い歴史を持つ、パブリック・ブロックチェーンです。
特徴としては、一般的に取引処理が速くコストが低いことが強みと知られていますが、多くのユーティリティを持つことが特徴です。また、数年に渡り長期的に多くのトランザクションを処理してきた安定性にも定評があります。

XRPLでは、数年前にAMM(Automated Market Maker:自動マーケットメーカー)機能が提案され、2024年3月にメインネットで有効化されました。

この機能によりユーザーは分散型取引のための流動性プールを作成・運用できるようになりました。

本記事では、xrpl.jsを用いてXRPLのAMM機能のセットアップから作成までの基本的な流れを解説します。

備考

  • 当記事では基本的なローカル実行環境構築の詳細は割愛しています。
  • xrpl.jsの導入方法についてはこちらなどを参照ください。

XRPLのAMM機能とは

AMMは、XRPLの分散型取引所において流動性を提供します。

XRPLのAMMは以下の特徴があります。

  • AMMは、XRP Ledgerの分散型取引所において流動性を提供します。
  • XRPと発行済みIOUトークン、またはのトークン(IOU)同士のペアをサポートしています。
  • AMMに資産を預ける人は流動性供給者(LP)と呼ばれ、LPトークンを受け取ります。
  • LPトークンを利用して、LPはプール内の資産の一部と交換したり、手数料設定の変更に投票したり、手数料割引の入札ができます。
  • トークン発行者が異なるとトークンは異なる資産と見なされ、同じ通貨コードでも発行者が異なればAMMを作成できます。
  • AMMの作成者は最初の流動性供給者となり、LPトークンを受け取ります。
  • 取引手数料は流動性供給者の収益源であり、投票により0%から1%の間で設定できます。

1. 環境準備

テストネットを利用することで実際の資産を使用する必要なく、ローカル環境などでトランザクションを送信することができます。

まずはxrpl.jsをインストールしてください。

npm i xrpl

次に、以下のWebSocketアドレスに接続します。

import { Client } from "xrpl";

// XRPLへの接続
const client = new Client("wss://s.altnet.rippletest.net:51233");

// 開始
await client.connect();

〜処理〜

// 終了
await client.disconnect();

基本的にはこれだけ完了です。簡単にテストネットに接続することができます。(メインネットなども同様です。)

※実際のアプリケーションではtry/catch文を使用することを推奨します。

2. アカウントセットアップ

アカウント作成

AMMプールを構築するために、2つのアカウントを用意します。

// テストアカウントを作成
const issuerWallet = await client.fundWallet();
const aliceWallet = await client.fundWallet();
  • issuerWallet: IOUトークンの発行者として利用します。
  • aliceWallet: issuerWalletが発行体となるIOUトークンを受け取り、AMMプールを作成するアカウントとして利用します。

トークン発行者の設定

AMMプール構築には、IOUトークン発行者アカウントのRipplingを有効にする必要があります。

発行者アカウント(issuerWallet)に対して、DefaultRipple設定を有効にしましょう。

// トークン発行用アカウント(issuerWallet)のRipplingを有効化
const accountSetTx = {
  TransactionType: "AccountSet",
  Account: issuerWallet.address,
  SetFlag: AccountSetAsfFlags.asfDefaultRipple
};

await client.submitAndWait(accountSetTx, { wallet: issuerWallet });

Ripplingについて詳しく知りたい方はこちら👇

https://zenn.dev/nabe3/articles/cb2f72c9b8f56b

トラストラインの設定

XRPLでは、ユーザーがIOUトークンを保有するために「トラストライン」を設定する必要があります。これは、特定の発行者からどれだけのトークンを受け入れるかを定義します。

// トラストラインを設定
const trustSetTx = {
  TransactionType: "TrustSet",
  Account: aliceWallet.address,
  LimitAmount: {
    currency: "XYZ",
    issuer: issuerWallet.address,
    value: "10000" // 任意設定
  }
};

await client.submitAndWait(trustSetTx, { wallet: aliceWallet });

トラストラインについて詳しく知りたい方はこちら👇
https://zenn.dev/nabe3/articles/f2bde79293eb7a

3. AMM(流動性プール)の作成

準備が整ったら、AMMCreateトランザクションを送信して、AMMプールを作成してみましょう。

// AMMCreateトランザクション
const ammCreateTx = {
  TransactionType: "AMMCreate",
  Account: aliceWallet.address,
  Amount: {
    currency: "XYZ",       // IOUトークン
    issuer: issuerWallet.address, // IOUトークンの発行者アドレス
    value: "1000"          // 初期流動性(トークン量)
  },
  Amount2: "50000000",     // 初期流動性(ここでは 50 XRP)
  TradingFee: 600,         // 取引手数料 0.6%(1000が1%)
};

// トランザクションの準備と送信
const prepared = await client.autofill(ammCreateTx);
const signed = aliceWallet.sign(prepared);
const result = await client.submitAndWait(signed.tx_blob);

AMMCreateの重要なパラメータ

  • Account: AMMを作成するアカウント(流動性提供者)
  • Amount: 提供するIOUトークンの情報と数量
  • Amount2: 提供するIOUトークンまたはXRPの数量(XRPの場合はドロップ単位、1 XRP = 1,000,000ドロップ)
  • TradingFee: 取引手数料(0〜1000の範囲、1000が1%)

4. AMM情報の確認

// AMMの情報を取得
const ammInfo = await client.request({
  command: "amm_info",
  asset: {
    currency: "XYZ",
    issuer: issuerWallet.address
  },
  asset2: {
    currency: "XRP"
  }
});

console.log("AMM情報:", JSON.stringify(ammInfo.result.amm, null, 2));

このコマンドにて、AMM情報、流動性、資産残高などの情報が取得できます。

console.log()の中身を確認してみましょう。

以下はconsole.log()のサンプルです。

AMM情報: {
  "api_version": 2,
  "id": 14,
  "result": {
    "amm": {
      "account": "rfbGJn18h4swdA7DRZGvc75XkrgexPPJ1R", // AMMのアドレス
      "amount": {
        "currency": "XYZ",
        "issuer": "r396ou4sCRbB5MfdnXY8DzTrTK2aYCmBdX", // トークン発行者アドレス
        "value": "1000"
      },
      "amount2": "50000000",
      "asset_frozen": false,
      "auction_slot": {
        "account": "rp2E45Z6xW1XQKVqrEKJJosJHdZBzHPLoV", // AMMCreateを実行したアドレス(Alice)
        "discounted_fee": 60,
        "expiration": "2025-04-11T13:31:21+0000",
        "price": {
          "currency": "03D1DA9BF8BD8F2ADF41E20091A87328D34D4081", // LPトークンコード
          "issuer": "rfbGJn18h4swdA7DRZGvc75XkrgexPPJ1R", // AMMのアドレス
          "value": "0"
        },
        "time_interval": 0
      },
      "lp_token": {
        "currency": "03D1DA9BF8BD8F2ADF41E20091A87328D34D4081", // LPトークンコード
        "issuer": "rfbGJn18h4swdA7DRZGvc75XkrgexPPJ1R", // AMMのアドレス
        "value": "223606.797749979"
      },
      "trading_fee": 600,
      "vote_slots": [
        {
          "account": "rp2E45Z6xW1XQKVqrEKJJosJHdZBzHPLoV", // AMMCreateを実行したアドレス(Alice)
          "trading_fee": 600,
          "vote_weight": 100000
        }
      ]
    },
    "ledger_current_index": 6386043,
    "validated": false
  },
  "type": "response"
}

最も特徴的なのは、AMMのアドレスが新たに自動生成されていることです。AMMのアドレスが生成され、LPトークンがAMMのアドレスから発行されていることが確認できます。

当記事で実際に作成したAMMプールはこちらです。

まとめ

今回のチュートリアルでXRPLでAMMプール作成(AMMCreate)をする基本的な流れは以下の通りです。

  1. アカウントを作成する
  2. IOUアカウントのDefaultRippleを有効化する
  3. Aliceがトラストラインを設定する
  4. IOUトークン発行アカウントからAliceにトークンを送金する
  5. AliceがAMMCreateでプールを作成する

AMM作成後は、流動性の追加・引き出しなどの操作が可能になります。


以上がAMM機能の中の、AMMCreateまでの実装の基本的な流れとなります。

実際のアプリケーション開発では、エラー処理やUI実装などさらに多くの要素が必要になりますが、この記事がXRPLのAMM機能理解の第一歩となれば幸いです。

次回もお楽しみに!

関連情報

Discussion