トラストラインの挙動について | JavaScriptでのXRPL開発 三段編
次は、オファーを行った際の、トラストラインの挙動について解説します。
ボブが発行者BのB.EUR
を売り、発行者AのA.USD
買うオファーを出し、そのB.EUR
が最終的にダニエルに届くような流れを試してみましょう。
前提
チャーリーは、ダニエルに支払いを行う必要がありますが、ダニエルはB.EUR
で受け取りたいそうです。しかし、現時点では、チャーリーはB.EUR
を保有していないため、
XRP
と発行者AのA.USD
しか保有していないチャーリーは、手持ちのA.USD
を交換できないかと考えました。
- ボブが発行者Bの
B.EUR
を売り、発行者AのA.USD
を買うオファーを出して、流動性を提供しましょう。 - チャーリーから
A.USD
をダニエルにB.EUR
として、送付する手続きを行います。
スクリプトの作成
-
作成済みの
createOffers.js
で、ボブからオファーを出します。import { Client, xrpToDrops } from 'xrpl';import { wallets } from './wallets.js';import { createOffer } from './utils/createOffer.js';const client = new Client('wss://s.altnet.rippletest.net:51233'); // テストネットを使用async function main() {try {await client.connect();const { issuerA, issuerB, alice, bob, charlie, daniel } = wallets;// await createOffer(// client,// alice,// { currency: 'USD', issuer: issuerA.address, value: '100' },// { currency: 'EUR', issuer: issuerB.address, value: '100' }// );await createOffer(client,bob,{ currency: 'EUR', issuer: issuerB.address, value: '100' },{ currency: 'USD', issuer: issuerA.address, value: '100' });} catch (error) {console.error(`Error in offer creation: ${error}`);} finally {await client.disconnect();}}main(); -
作成済みの
crossCurrencyPayment.js
で、チャーリーから支払いを行います。crossCurrencyPayment.js import xrpl from 'xrpl';import { wallets } from './wallets.js';import { sendPayment } from './utils/payment.js';const client = new xrpl.Client('wss://s.altnet.rippletest.net:51233');const main = async () => {await client.connect();const { issuerA, issuerB, alice, bob, charlie, daniel } = wallets;// await sendPayment(// client,// daniel,// { currency: 'USD', issuer: issuerA.address, value: '100' }, // チャーリーが受け取りたい通貨:A.USD// charlie.address,// {// sendMax: { currency: 'EUR', issuer: issuerB.address, value: '100' }, // ダニエルが支払いたい通貨:B.EUR// }// );// チャーリーからダニエルへの支払いawait sendPayment(client,charlie,{ currency: 'EUR', issuer: issuerB.address, value: '100' }, // ダニエルが受け取りたい通貨:B.EURdaniel.address,{sendMax: { currency: 'USD', issuer: issuerA.address, value: '100' }, // チャーリーが支払いたい通貨:A.USD});await client.disconnect();};main().catch(console.error);
スクリプトの実行
-
コマンドラインで以下のコマンドを実行して、スクリプトを実行します。
Terminal window node createOffers.jsnode crossCurrencyPayment.js -
crossCurrencyPayment.js
の結果として、以下のようなログが表示されれば成功です。Terminal window Payment sent from rnP7Q6LaejYi7oaN4qJHkKhnESZYAyVQwh to rf6R7pFgytT9JKjMVjKqeTv6MeDTrbNw3: {id: 14,result: {Account: 'rnP7Q6LaejYi7oaN4qJHkKhnESZYAyVQwh', // CharlieAmount: {currency: 'EUR',issuer: 'rstM9rxhKo4N4WEaQgQmQSPQRgZqkhHkaU', // issuerBvalue: '100'},DeliverMax: {currency: 'EUR',issuer: 'rstM9rxhKo4N4WEaQgQmQSPQRgZqkhHkaU',value: '100'},Destination: 'rf6R7pFgytT9JKjMVjKqeTv6MeDTrbNw3', // DanielFee: '12',Flags: 0,LastLedgerSequence: 1085862,SendMax: {currency: 'USD',issuer: 'rfkJ7Uz6NrNV1FdbmKB5wepoim51KFpYQp', // issuerAvalue: '100' // 限度額},Sequence: 1046427,SigningPubKey: 'ED88C6BDCFE0FB8612FCE299211DDAB0E6E6498EEAD14D07673D7C2C0778361766',TransactionType: 'Payment',TxnSignature: 'CE013A27741315A5DE67B811DF4AA793F3CBF24AA80D0EED9A1148B790A6A9713B1DE457BF3F3EECC5C155A8CA81D9536F7C151239DF6BEBA13BFCA057255E02',ctid: 'C010919400000001',date: 770335361,hash: '95CE240790C3B1AA5C59CB1C1A4747B42901B06F3F4217C5BFC3E4F07D372E07',inLedger: 1085844,ledger_index: 1085844,meta: {AffectedNodes: [Array],TransactionIndex: 0,TransactionResult: 'tesSUCCESS', // 成功delivered_amount: [Object]},validated: true},type: 'response'}この時点で、以下のようになっていることをエクスプローラで確認してください。
- ボブは
B.EUR
の残高が900
に減少、A.USD
の残高が100
に増加しました。 - チャーリーは
A.USD
の残高が1,000
に増加しました。(初期状態に戻る) - ダニエルは
B.EUR
の残高が1,000
に増加しました。(初期状態に戻る)
- ボブは
トラストラインについて
ボブはA.USD
に対してトラストラインの設定を明示的に行っていないにも関わらず、A.USD
の保有ができている状態になりました。
これは、OfferCreate
トランザクションが引き起こす挙動で、「A.USD
が欲しいという注文 = トラストした」と解釈していただければ良いかと思います。
次章では、クロスカレンシー送金のパターンなどについて解説します。