XRPLのDEX(分散型取引所)に触れてみよう
はじめに
XRPL(XRP Ledger)は、ネイティブな分散型取引所(DEX)機能を提供しており、ユーザーはオファー(注文)を作成して資産を売買することができます。
本記事では「XRPLのDEXに触れてみよう!」目的に、テストネットで実際にオファー(注文)を送信するトランザクションの作成・確認、キャンセル方法までを解説します。
準備
基本的に、ネイティブ通貨であるXRP
以外のトークンを送信する際には、通貨コードとissuer
を指定する必要があります。
学習にあたって、毎回独自に用意していると学習においては効率が悪いため、既存の発行者をあらかじめ特定し、用意しておくことで効率化を図ることができます。
通貨コードUSD
を発行済みのアドレスがテストネットでも存在していますので、今回はこちらを利用します。
// GateHub
rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq
オファーの作成
20 XRP
で200 USD
トークンを購入するオファーを作成してみます。
const xrpl = require('xrpl');
async function createOffer() {
const client = new xrpl.Client('wss://s.altnet.rippletest.net:51233'); // テストネット
await client.connect();
const wallet = xrpl.Wallet.fromSeed('your_wallet_seed'); // ウォレットのシークレットキー
// オファー(注文)の作成
const offer = {
TransactionType: 'OfferCreate', // オファーの作成
Account: wallet.address, // 送金元ウォレットのアドレス
TakerGets: xrpl.xrpToDrops(20), // 支払う資産の金額(ここでは20 XRP)
TakerPays: {
currency: 'USD', // 受け取りたい通貨コード
issuer: 'rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq', // USD発行元(GateHub)
value: '200', // 受け取りたい金額
},
};
const prepared = await client.autofill(offer); // トランザクションを自動的に補完
const signed = wallet.sign(prepared); // トランザクションに署名
const result = await client.submitAndWait(prepared); // 送信
console.log('オファー作成結果:', result);
await client.disconnect();
}
createOffer();
- TakerGetsに自身が提供する資産、TakerPaysに受け取る資産を設定します。
スクリプトの実行
スクリプトを実行し、成功すればコンソールに以下が表示されます。
オファー作成結果: {
id: 10,
result: {
Account: 'rP1WwXDZvQHvNiyenBpLvSdx3E8WuUpQc5',
Fee: '12',
Flags: 0,
LastLedgerSequence: 671539,
Sequence: 477852,
SigningPubKey: 'EDA0094F9DE33C9BBD4681C9D88407C92A93D7532775B08731572DA419C804BA27',
TakerGets: '20000000', // 20 XRP
TakerPays: {
currency: 'USD', // 通貨コード
issuer: 'rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq',
value: '200' // 200 USD
},
TransactionType: 'OfferCreate',
TxnSignature: '9499CCD90E522641E92E53836B583F80D4044C1340571FF8BE4B68EE2A7E15238A1F78418A7CCB274576622BC44EE4F2B8E38EFBCAEC10ED8442C9C3BBF31C04',
ctid: 'C00A3F2100010001',
date: 769022540,
hash: '19A8E96B7222B4C0C05DB2A782FEB211C28E824A73B6A17670D34D47C7694668',
inLedger: 671521,
ledger_index: 671521,
meta: {
AffectedNodes: [Array],
TransactionIndex: 1,
TransactionResult: 'tesSUCCESS' // 成功
},
validated: true
},
type: 'response'
}
オファーの作成が成功しました。
仮にこのUSDがステーブルコインだった場合、実際には現時点(2024/05/15)で、20 XRP
(約10ドルほど)に対して200 USD
支払って交換したいという人はいないため、注文が通る可能性は極めて低いですが、
このようにXRPLでは、ネイティブDEXに対して注文を出すことが容易に可能となっています。
オファーの確認
const xrpl = require('xrpl');
async function checkOffers() {
const client = new xrpl.Client('wss://s.altnet.rippletest.net:51233');
await client.connect();
const walletAddress = 'your_wallet_address'; // ウォレットアドレスを入力
const response = await client.request({
command: 'account_offers',
account: walletAddress,
ledger_index: 'validated'
});
console.log('オファーリスト:', response.result.offers);
await client.disconnect();
}
checkOffers();
スクリプトの実行
スクリプトを実行し、成功すればコンソールに以下が表示されます。
オファーリスト: [
{
flags: 0,
quality: '0.00001',
seq: 477853,
taker_gets: '20000000',
taker_pays: {
currency: 'USD',
issuer: 'rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq',
value: '200'
}
}
]
このようにすれば、アドレスに紐づくオファーの一覧を確認することができます。
実際に、このオファーを受け入れる人は20 XRP
を受け取り、200 USD
を支払います。
出力したseq
の番号は次章で使用しますので、メモしておきましょう。
各フィールドの説明
1. flags: オファーに関連するフラグを示します。特定の条件やオプションを設定するために使用されます。ここでは0なので、特別なフラグは設定されていません。
2. quality: オファーの品質を示します。これは「支払う通貨の量」対「受け取る通貨の量」の比率です。ここでは0.00001という値が設定されており、これは1 USD = 100,000 dropsの比率になっていることを意味します。
3. seq: トランザクションのシーケンス番号です。この番号はアカウントごとに一意であり、トランザクションの順序を示します。
4. taker_gets: オファーを受け入れる人(Taker)が受け取る資産の量を示します。ここでは20000000 drops(20 XRP)が設定されています。XRPはdrops単位で指定されます(1 XRP = 1,000,000 drops)。
5. taker_pays: オファーを受け入れる人(Taker)が支払う資産を示します。
オファーのキャンセル
const xrpl = require('xrpl');
async function cancelOffer() {
const client = new xrpl.Client('wss://s.altnet.rippletest.net:51233');
await client.connect();
const wallet = xrpl.Wallet.fromSeed('your_wallet_seed'); // ウォレットのシークレットキー
const offerSequence = 123456; // キャンセルしたいオファーのシーケンス番号を数値で指定
const cancelTx = {
TransactionType: 'OfferCancel', // オファーのキャンセル
Account: wallet.address, // ウォレットのアドレス
OfferSequence: offerSequence // 123456
};
const prepared = await client.autofill(cancelTx); // トランザクションを自動的に補完
const signed = wallet.sign(prepared); // トランザクションに署名
const result = await client.submitAndWait(signed.tx_blob); // 送信
console.log('オファーキャンセル結果:', result);
await client.disconnect();
}
cancelOffer();
スクリプトの実行
オファーキャンセル結果: {
id: 14,
result: {
Account: 'rP1WwXDZvQHvNiyenBpLvSdx3E8WuUpQc5',
Fee: '12',
Flags: 0,
LastLedgerSequence: 673065,
OfferSequence: 477853,
Sequence: 477854,
SigningPubKey: 'EDA0094F9DE33C9BBD4681C9D88407C92A93D7532775B08731572DA419C804BA27',
TransactionType: 'OfferCancel',
TxnSignature: '4F231AB487C2BFB30777841F60177E164F028BC700DC8A76845EE90FDF639B491E7C3E23EA0CF7EB7DE9D4C9139059779E0FB3BD2EF59727B6B470CA05EE7506',
ctid: 'C00A451700100001',
date: 769027381,
hash: '99DF4150E96163C8A22888C9C3B7E979D9FB4E1A9497199018C0648B119908F3',
inLedger: 673047,
ledger_index: 673047,
meta: {
AffectedNodes: [Array],
TransactionIndex: 16,
TransactionResult: 'tesSUCCESS' // 成功
},
validated: true
},
type: 'response'
}
ここでもう一度、先ほどのオファーの確認を行うコードを実行し、キャンセルされたことを確認してみましょう。
成功すれば、コンソールに以下が表示され、オファーを無事にキャンセルできたことを確認できると思います。
オファーリスト: []
まとめ
この記事では、XRPLのDEXにオファーを作成する方法からキャンセル方法までを解説しました。
いかがでしょうか?一般的には非常に難しいイメージがあるDEXですが、XRPLではJavaScriptライブラリなどを用いることで、比較的簡単に触れることができることを理解いただけたかと思います。
このようにXRPLではネイティブ機能としてDEXなどが存在しているため、開発者はJavaScriptライブラリなどを用いてXRPLのコア機能の使い方を覚えていくことができ、非常に学習しやすいブロックチェーンとなっています。
興味のあるWeb開発者の方はぜひ、私が運営しているXRP道場 -DOJO-でも学習してみてください!
また、日本のコミュニティ、開発者向けディスコードなどもあります。
Discussion