From 0b77ba0002cf8b581c8fdaa46ad21d72de620d06 Mon Sep 17 00:00:00 2001 From: Maria Shodunke Date: Mon, 7 Jul 2025 14:25:58 +0100 Subject: [PATCH 01/16] Migrate code snippets from xrpl.js and xrpl-py --- .../js/claimPayChannel.ts | 20 ++- .../py/claim_pay_channel.py | 87 +++++++++++++ _code-samples/escrow/js/create-escrow.js | 23 ++-- _code-samples/escrow/js/finish-escrow.js | 1 + _code-samples/escrow/py/cancel_escrow.py | 6 +- _code-samples/escrow/py/create_escrow.py | 3 +- _code-samples/escrow/py/finish_escrow.py | 8 +- _code-samples/multisigning/js/multisigning.ts | 8 +- _code-samples/paths/js/paths.ts | 4 +- docs/_snippets/wait-for-validation.md | 2 + .../send-a-multi-signed-transaction.md | 43 ++++++- .../set-up-multi-signing.md | 13 ++ .../use-escrows/cancel-an-expired-escrow.md | 18 +-- .../use-escrows/look-up-escrows.md | 24 ++-- .../send-a-conditionally-held-escrow.md | 34 ++--- .../use-escrows/send-a-time-held-escrow.md | 117 ++++++++++++++---- .../use-payment-channels/index.md | 3 +- 17 files changed, 323 insertions(+), 91 deletions(-) create mode 100644 _code-samples/claim-payment-channel/py/claim_pay_channel.py diff --git a/_code-samples/claim-payment-channel/js/claimPayChannel.ts b/_code-samples/claim-payment-channel/js/claimPayChannel.ts index 097a8fcf22..0053cca3d2 100644 --- a/_code-samples/claim-payment-channel/js/claimPayChannel.ts +++ b/_code-samples/claim-payment-channel/js/claimPayChannel.ts @@ -12,13 +12,11 @@ import { const client = new Client('wss://s.altnet.rippletest.net:51233') -void claimPayChannel() - // The snippet walks us through creating and claiming a Payment Channel. async function claimPayChannel(): Promise { await client.connect() - // creating wallets as prerequisite + // Creating wallets as prerequisite const { wallet: wallet1 } = await client.fundWallet() const { wallet: wallet2 } = await client.fundWallet() @@ -26,13 +24,13 @@ async function claimPayChannel(): Promise { console.log(`Balance of ${wallet1.address} is ${await client.getXrpBalance(wallet1.address)} XRP`) console.log(`Balance of ${wallet2.address} is ${await client.getXrpBalance(wallet2.address)} XRP`) - // create a Payment Channel and submit and wait for tx to be validated + // Create a Payment Channel and submit and wait for tx to be validated const paymentChannelCreate: PaymentChannelCreate = { TransactionType: 'PaymentChannelCreate', Account: wallet1.classicAddress, - Amount: '100', + Amount: '100', // 10 XRP Destination: wallet2.classicAddress, - SettleDelay: 86400, + SettleDelay: 86400, // 1 day in seconds PublicKey: wallet1.publicKey, } @@ -44,7 +42,7 @@ async function claimPayChannel(): Promise { console.log("PaymentChannelCreate transaction response:") console.log(paymentChannelResponse) - // check that the object was actually created + // Check that the object was actually created const accountObjectsRequest: AccountObjectsRequest = { command: 'account_objects', account: wallet1.classicAddress, @@ -52,23 +50,21 @@ async function claimPayChannel(): Promise { const accountObjects = (await client.request(accountObjectsRequest)).result .account_objects - console.log("Account Objects:", accountObjects) - // destination claims the Payment Channel and we see the balances to verify. + // Destination claims the Payment Channel and we see the balances to verify. const paymentChannelClaim: PaymentChannelClaim = { Account: wallet2.classicAddress, TransactionType: 'PaymentChannelClaim', Channel: hashes.hashPaymentChannel( wallet1.classicAddress, wallet2.classicAddress, - paymentChannelResponse.result.Sequence ?? 0, + paymentChannelResponse.result.tx_json.Sequence ?? 0, ), Amount: '100', } console.log("Submitting a PaymentChannelClaim transaction...") - const channelClaimResponse = await client.submit(paymentChannelClaim, { wallet: wallet1, }) @@ -81,3 +77,5 @@ async function claimPayChannel(): Promise { await client.disconnect() } + +void claimPayChannel() diff --git a/_code-samples/claim-payment-channel/py/claim_pay_channel.py b/_code-samples/claim-payment-channel/py/claim_pay_channel.py new file mode 100644 index 0000000000..264cf0af38 --- /dev/null +++ b/_code-samples/claim-payment-channel/py/claim_pay_channel.py @@ -0,0 +1,87 @@ +""" +Create, claim and verify a Payment Channel. +Reference: https://xrpl.org/paychannel.html +""" +from xrpl.clients import JsonRpcClient +from xrpl.models import ( + AccountObjects, + PaymentChannelCreate, + PaymentChannelClaim, +) +from xrpl.wallet import generate_faucet_wallet +from xrpl.transaction import submit, submit_and_wait +from xrpl.account import get_balance + + +def claim_pay_channel(): + """The snippet walks us through creating and claiming a Payment Channel.""" + + client = JsonRpcClient("https://s.altnet.rippletest.net:51234") + + # Creating wallets as prerequisite + wallet1 = generate_faucet_wallet(client) + wallet2 = generate_faucet_wallet(client) + + print("Balances of wallets before Payment Channel is claimed:") + print(f"Balance of {wallet1.address} is {get_balance(wallet1.address, client)} XRP") + print(f"Balance of {wallet2.address} is {get_balance(wallet2.address, client)} XRP") + + # Create a Payment Channel and submit and wait for tx to be validated + payment_channel_create = PaymentChannelCreate( + account=wallet1.address, + amount="100", # 10 XRP + destination=wallet2.address, + settle_delay=86400, # 1 day in seconds + public_key=wallet1.public_key, + ) + + print("Submitting a PaymentChannelCreate transaction...") + payment_channel_response = submit_and_wait( + payment_channel_create, + client, + wallet1 + ) + print("PaymentChannelCreate transaction response:") + print(payment_channel_response.result) + + # Check that the object was actually created + account_objects_request = AccountObjects( + account=wallet1.address, + ) + account_objects_response = client.request(account_objects_request) + account_objects = account_objects_response.result["account_objects"] + + # Find the PayChannel object to get the correct channel ID + channel_id = None + for obj in account_objects: + if obj["LedgerEntryType"] == "PayChannel": + channel_id = obj["index"] + break + + if not channel_id: + raise Exception("PayChannel not found in account objects") + + print(f"PayChannel ID: {channel_id}") + + # Destination claims the Payment Channel and we see the balances to verify. + payment_channel_claim = PaymentChannelClaim( + account=wallet2.address, + channel=channel_id, + amount="100", + ) + + print("Submitting a PaymentChannelClaim transaction...") + channel_claim_response = submit_and_wait( + payment_channel_claim, + client, + wallet1, + ) + print("PaymentChannelClaim transaction response:") + print(channel_claim_response.result) + + print("Balances of wallets after Payment Channel is claimed:") + print(f"Balance of {wallet1.address} is {get_balance(wallet1.address, client)} XRP") + print(f"Balance of {wallet2.address} is {get_balance(wallet2.address, client)} XRP") + +if __name__ == "__main__": + claim_pay_channel() diff --git a/_code-samples/escrow/js/create-escrow.js b/_code-samples/escrow/js/create-escrow.js index cd9d032312..9f48213565 100644 --- a/_code-samples/escrow/js/create-escrow.js +++ b/_code-samples/escrow/js/create-escrow.js @@ -14,15 +14,6 @@ const seed = "sEd7jfWyNG6J71dEojB3W9YdHp2KCjy"; async function main() { try { - // Construct condition and fulfillment ------------------------------------ - const preimageData = crypto.randomBytes(32); - const myFulfillment = new cc.PreimageSha256(); - myFulfillment.setPreimage(preimageData); - const conditionHex = myFulfillment.getConditionBinary().toString('hex').toUpperCase(); - - console.log('Condition:', conditionHex); - console.log('Fulfillment:', myFulfillment.serializeBinary().toString('hex').toUpperCase()); - // Connect ---------------------------------------------------------------- const client = new xrpl.Client('wss://s.altnet.rippletest.net:51233'); await client.connect(); @@ -37,6 +28,16 @@ async function main() { finishAfter = new Date(finishAfter * 1000); console.log("This escrow will finish after: ", finishAfter); + // Construct condition and fulfillment ------------------------------------ + const preimageData = crypto.randomBytes(32); + const myFulfillment = new cc.PreimageSha256(); + myFulfillment.setPreimage(preimageData); + const conditionHex = myFulfillment.getConditionBinary().toString('hex').toUpperCase(); + + console.log('Condition:', conditionHex); + console.log('Fulfillment:', myFulfillment.serializeBinary().toString('hex').toUpperCase()); + + // Prepare EscrowCreate transaction ------------------------------------ const escrowCreateTransaction = { "TransactionType": "EscrowCreate", "Account": wallet.address, @@ -46,7 +47,7 @@ async function main() { "Condition": conditionHex, "Fee": "12", "FinishAfter": xrpl.isoTimeToRippleTime(finishAfter.toISOString()), - }; + }; xrpl.validate(escrowCreateTransaction); @@ -54,7 +55,7 @@ async function main() { console.log('Signing and submitting the transaction:', JSON.stringify(escrowCreateTransaction, null, "\t"), "\n" ); - const response = await client.submitAndWait(escrowCreateTransaction, { wallet }); + const response = await client.submitAndWait(escrowCreateTransaction, { wallet }); console.log(`Sequence number: ${response.result.tx_json.Sequence}`); console.log(`Finished submitting! ${JSON.stringify(response.result, null, "\t")}`); diff --git a/_code-samples/escrow/js/finish-escrow.js b/_code-samples/escrow/js/finish-escrow.js index b63a17ab37..71f1dabe1b 100644 --- a/_code-samples/escrow/js/finish-escrow.js +++ b/_code-samples/escrow/js/finish-escrow.js @@ -28,6 +28,7 @@ const main = async () => { throw new Error("Please specify the sequence number, condition and fulfillment of the escrow you created"); }; + // Prepare EscrowFinish transaction --------------------------------- const escrowFinishTransaction = { "Account": wallet.address, "TransactionType": "EscrowFinish", diff --git a/_code-samples/escrow/py/cancel_escrow.py b/_code-samples/escrow/py/cancel_escrow.py index b1cfaa83b3..38cd32a88c 100644 --- a/_code-samples/escrow/py/cancel_escrow.py +++ b/_code-samples/escrow/py/cancel_escrow.py @@ -14,7 +14,11 @@ escrow_sequence = 30215126 sender_wallet = generate_faucet_wallet(client=client) # Build escrow cancel transaction -cancel_txn = EscrowCancel(account=sender_wallet.address, owner=sender_wallet.address, offer_sequence=escrow_sequence) +cancel_txn = EscrowCancel( + account=sender_wallet.address, + owner=sender_wallet.address, + offer_sequence=escrow_sequence +) # Autofill, sign, then submit transaction and wait for result stxn_response = submit_and_wait(cancel_txn, client, sender_wallet) diff --git a/_code-samples/escrow/py/create_escrow.py b/_code-samples/escrow/py/create_escrow.py index c35775a5e3..9ea2512347 100644 --- a/_code-samples/escrow/py/create_escrow.py +++ b/_code-samples/escrow/py/create_escrow.py @@ -34,7 +34,8 @@ create_txn = EscrowCreate( destination=receiver_addr, finish_after=claim_date, cancel_after=expiry_date, - condition=condition) + condition=condition +) # Autofill, sign, then submit transaction and wait for result stxn_response = submit_and_wait(create_txn, client, sender_wallet) diff --git a/_code-samples/escrow/py/finish_escrow.py b/_code-samples/escrow/py/finish_escrow.py index e31fc2535d..a8c0b7821d 100644 --- a/_code-samples/escrow/py/finish_escrow.py +++ b/_code-samples/escrow/py/finish_escrow.py @@ -25,7 +25,13 @@ fulfillment = "A0228020AED2C5FE4D147D310D3CFEBD9BFA81AD0F63CE1ADD92E00379DDDAF8E sender_wallet = generate_faucet_wallet(client=client) # Build escrow finish transaction -finish_txn = EscrowFinish(account=sender_wallet.address, owner=escrow_creator, offer_sequence=escrow_sequence, condition=condition, fulfillment=fulfillment) +finish_txn = EscrowFinish( + account=sender_wallet.address, + owner=escrow_creator, + offer_sequence=escrow_sequence, # The sequence number of the escrow transaction + condition=condition, + fulfillment=fulfillment +) # Autofill, sign, then submit transaction and wait for result stxn_response = submit_and_wait(finish_txn, client, sender_wallet) diff --git a/_code-samples/multisigning/js/multisigning.ts b/_code-samples/multisigning/js/multisigning.ts index f4e7a195e7..4e2c0d778e 100644 --- a/_code-samples/multisigning/js/multisigning.ts +++ b/_code-samples/multisigning/js/multisigning.ts @@ -22,6 +22,7 @@ async function multisigning(): Promise { const { wallet: wallet1 } = await client.fundWallet() const { wallet: wallet2 } = await client.fundWallet() const { wallet: walletMaster } = await client.fundWallet() + const signerListSet: SignerListSet = { TransactionType: 'SignerListSet', Account: walletMaster.classicAddress, @@ -56,9 +57,14 @@ async function multisigning(): Promise { const accountSetTx = await client.autofill(accountSet, 2) console.log('AccountSet transaction is ready to be multisigned:') console.log(accountSetTx) + const { tx_blob: tx_blob1 } = wallet1.sign(accountSetTx, true) const { tx_blob: tx_blob2 } = wallet2.sign(accountSetTx, true) const multisignedTx = multisign([tx_blob1, tx_blob2]) + + console.log("Successfully multisigned the transaction") + console.log(multisignedTx) + const submitResponse = await client.submit(multisignedTx) if (submitResponse.result.engine_result === 'tesSUCCESS') { @@ -79,4 +85,4 @@ async function multisigning(): Promise { await client.disconnect() } -void multisigning() \ No newline at end of file +void multisigning() diff --git a/_code-samples/paths/js/paths.ts b/_code-samples/paths/js/paths.ts index fa4fa59c76..3916901172 100644 --- a/_code-samples/paths/js/paths.ts +++ b/_code-samples/paths/js/paths.ts @@ -2,7 +2,7 @@ * Extract best paths from RipplePathFind to trade with and send a payment using paths. * Reference: https://xrpl.org/paths.html */ -import { Client, Payment, RipplePathFindResponse } from 'xrpl' +import { Client, Payment, RipplePathFindResponse, RipplePathFindRequest } from 'xrpl' const client = new Client('wss://s.altnet.rippletest.net:51233') @@ -17,7 +17,7 @@ async function createTxWithPaths(): Promise { issuer: 'rVnYNK9yuxBz4uP8zC8LEFokM2nqH3poc', } - const request = { + const request: RipplePathFindRequest = { command: 'ripple_path_find', source_account: wallet.classicAddress, source_currencies: [ diff --git a/docs/_snippets/wait-for-validation.md b/docs/_snippets/wait-for-validation.md index d020db203d..f385e9fd01 100644 --- a/docs/_snippets/wait-for-validation.md +++ b/docs/_snippets/wait-for-validation.md @@ -1,3 +1,5 @@ On a live network (including Mainnet, Testnet, or Devnet), you can wait 4-7 seconds for the ledger to close automatically. If you're running `rippled` in stand-alone mode, use the [ledger_accept method][] to manually close the ledger. + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/tutorials/how-tos/manage-account-settings/send-a-multi-signed-transaction.md b/docs/tutorials/how-tos/manage-account-settings/send-a-multi-signed-transaction.md index c0e1904caa..b73c2eb138 100644 --- a/docs/tutorials/how-tos/manage-account-settings/send-a-multi-signed-transaction.md +++ b/docs/tutorials/how-tos/manage-account-settings/send-a-multi-signed-transaction.md @@ -25,6 +25,9 @@ Keep in mind that the `Fee` for multi-signed transactions is significantly highe Here's an example transaction ready to be multi-signed: +{% tabs %} + +{% tab label="JSON" %} ```json { "TransactionType": "TrustSet", @@ -42,7 +45,17 @@ Here's an example transaction ready to be multi-signed: ``` (This transaction creates an accounting relationship from `rEuLyBCvcw4CFmzv8RepSiAoNgF8tTGJQC` to `rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh` with a maximum balance of 100 USD.) +{% /tab %} +{% tab label="Javascript" %} +{% code-snippet file="/_code-samples/multisigning/js/multisigning.ts" language="js" from="const accountSet: AccountSet = {" before="const { tx_blob" /%} +{% /tab %} + +{% tab label="Python" %} +{% code-snippet file="/_code-samples/multisigning/py/multisigning.py" language="py" from="account_set_tx = AccountSet" before="# Since" /%} +{% /tab %} + +{% /tabs %} ## 2. Get one signature @@ -185,6 +198,9 @@ If you collected the signatures in serial, the `tx_json` from the last `sign_for If you collected the signatures in parallel, you must manually construct a `tx_json` object with all the signatures included. Take the `Signers` arrays from all the `sign_for` responses, and combine their contents into a single `Signers` array that has each signature. Add the combined `Signers` array to the original transaction JSON value, and use that as the argument to the [submit_multisigned method][]. +{% tabs %} + +{% tab label="Commandline" %} ``` $ rippled submit_multisigned '{ > "Account" : "rEuLyBCvcw4CFmzv8RepSiAoNgF8tTGJQC", @@ -256,9 +272,18 @@ Connecting to 127.0.0.1:5005 } ``` - Take note of the `hash` value from the response so you can check the results of the transaction later. (In this case, the hash is `BD636194C48FD7A100DE4C972336534C8E710FD008C0F3CF7BC5BF34DAF3C3E6`.) +{% /tab %} +{% tab label="Javascript" %} +{% code-snippet file="/_code-samples/multisigning/js/multisigning.ts" language="js" from="const { tx_blob" before="if (submitResponse" /%} +{% /tab %} + +{% tab label="Python" %} +{% code-snippet file="/_code-samples/multisigning/py/multisigning.py" language="py" from="tx_1 =" before="if multisigned_tx_response" /%} +{% /tab %} + +{% /tabs %} ## 5. Close the ledger @@ -278,7 +303,6 @@ Connecting to 127.0.0.1:5005 } ``` - ## 6. Confirm transaction results Use the hash value from the response to the `submit_multisigned` command to look up the transaction using the [tx method][]. In particular, check that the `TransactionResult` is the string `tesSUCCESS`. @@ -287,6 +311,9 @@ On the live network, you must also confirm that the `validated` field is set to In stand-alone mode, the server automatically considers a ledger to be `validated` if it has been manually closed. +{% tabs %} + +{% tab label="Commandline" %} ``` $ rippled tx BD636194C48FD7A100DE4C972336534C8E710FD008C0F3CF7BC5BF34DAF3C3E6 Loading: "/etc/opt/ripple/rippled.cfg" @@ -399,5 +426,17 @@ Connecting to 127.0.0.1:5005 } } ``` +{% /tab %} + +{% tab label="Javascript" %} +{% code-snippet file="/_code-samples/multisigning/js/multisigning.ts" language="js" from="if (submitResponse" before="await client.disconnect" /%} +{% /tab %} + +{% tab label="Python" %} +{% code-snippet file="/_code-samples/multisigning/py/multisigning.py" language="py" from="if multisigned_tx_response" /%} +{% /tab %} + +{% /tabs %} + {% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/tutorials/how-tos/manage-account-settings/set-up-multi-signing.md b/docs/tutorials/how-tos/manage-account-settings/set-up-multi-signing.md index 0e88ee4c4d..5bbfc29111 100644 --- a/docs/tutorials/how-tos/manage-account-settings/set-up-multi-signing.md +++ b/docs/tutorials/how-tos/manage-account-settings/set-up-multi-signing.md @@ -67,7 +67,9 @@ In this example, the signer list has 3 members, with the weights and quorum set {% partial file="/docs/_snippets/secret-key-warning.md" /%} +{% tabs %} +{% tab label="Commandline" %} ``` $ rippled submit shqZZy2Rzs9ZqWTCQAdqc3bKgxnYq '{ > "Flags": 0, @@ -139,6 +141,17 @@ Connecting to 127.0.0.1:5005 } } ``` +{% /tab %} + +{% tab label="Javascript" %} +{% code-snippet file="/_code-samples/multisigning/js/multisigning.ts" language="js" from=" const { wallet: wallet1" before="const accountSet:" /%} +{% /tab %} + +{% tab label="Python" %} +{% code-snippet file="/_code-samples/multisigning/py/multisigning.py" language="py" from="master_wallet =" before="# Now that" /%} +{% /tab %} + +{% /tabs %} Make sure that the [Transaction Result](../../../references/protocol/transactions/transaction-results/index.md) is [**`tesSUCCESS`**](../../../references/protocol/transactions/transaction-results/tes-success.md). Otherwise, the transaction failed. If you have a problem in stand-alone mode or a non-production network, check that [multi-sign is enabled](../../../infrastructure/testing-and-auditing/start-a-new-genesis-ledger-in-stand-alone-mode.md#settings-in-new-genesis-ledgers). diff --git a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md index c28d4996f5..c1adf3d566 100644 --- a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md +++ b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md @@ -67,24 +67,24 @@ Response: {% partial file="/docs/_snippets/secret-key-warning.md" /%} -Request: - {% tabs %} {% tab label="Websocket" %} +Request: {% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowcancel.json" language="json" /%} -{% /tab %} - -{% /tabs %} Response: - -{% tabs %} - -{% tab label="Websocket" %} {% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowcancel.json" language="json" /%} {% /tab %} +{% tab label="Javascript" %} +{% code-snippet file="/_code-samples/escrow/js/cancel-escrow.js" language="js" from="const escrowCancelTransaction" before="await client.disconnect" /%} +{% /tab %} + +{% tab label="Python" %} +{% code-snippet file="/_code-samples/escrow/py/cancel_escrow.py" language="py" from="# Build escrow cancel" /%} +{% /tab %} + {% /tabs %} Take note of the transaction's identifying `hash` value so you can check its final status when it is included in a validated ledger version. diff --git a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/look-up-escrows.md b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/look-up-escrows.md index 377596b815..132063c542 100644 --- a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/look-up-escrows.md +++ b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/look-up-escrows.md @@ -15,30 +15,28 @@ All pending escrows are stored in the ledger as [Escrow objects](../../../../con Use the [account_objects method][], where the sender or destination address is the `account` value. -Request: - {% tabs %} {% tab label="Websocket" %} +Request: {% code-snippet file="/_api-examples/escrow/websocket/account_objects-request.json" language="json" /%} -{% /tab %} - -{% /tabs %} - -The response includes all pending escrow objects with `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm`, where the sender address is the `Account` value, or the destination address is the `Destination` value. Response: - -{% tabs %} - -{% tab label="Websocket" %} {% code-snippet file="/_api-examples/escrow/websocket/account_objects-response.json" language="json" /%} + +The response includes all pending escrow objects with `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm`, where the sender address is the `Account` value, or the destination address is the `Destination` value. +{% /tab %} + +{% tab label="Javascript" %} +{% code-snippet file="/_code-samples/escrow/js/list-escrows.js" language="js" from="const response" before="client.disconnect" /%} +{% /tab %} + +{% tab label="Python" %} +{% code-snippet file="/_code-samples/escrow/py/account_escrows.py" language="py" from="req =" /%} {% /tab %} {% /tabs %} - - ## See Also - **Concepts:** diff --git a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md index 9e090fe32b..93f39ba2a9 100644 --- a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md +++ b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md @@ -96,24 +96,24 @@ print(cancel_after) {% partial file="/docs/_snippets/secret-key-warning.md" /%} -Request: - {% tabs %} {% tab label="Websocket" %} +Request: {% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowcreate-condition.json" language="json" /%} -{% /tab %} - -{% /tabs %} Response: - -{% tabs %} - -{% tab label="Websocket" %} {% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowcreate-condition.json" language="json" /%} {% /tab %} +{% tab label="Javascript" %} +{% code-snippet file="/_code-samples/escrow/js/create-escrow.js" language="js" from="// Prepare EscrowCreate" before="await client.disconnect" /%} +{% /tab %} + +{% tab label="Python" %} +{% code-snippet file="/_code-samples/escrow/py/create_escrow.py" language="py" from="# Build escrow create" /%} +{% /tab %} + {% /tabs %} ## 4. Wait for validation @@ -157,19 +157,21 @@ If the escrow has expired, you can only [cancel the escrow](cancel-an-expired-es {% tabs %} {% tab label="Websocket" %} +Request: {% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowfinish-condition.json" language="json" /%} -{% /tab %} - -{% /tabs %} Response: - -{% tabs %} - -{% tab label="Websocket" %} {% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowfinish-condition.json" language="json" /%} {% /tab %} +{% tab label="Javascript" %} +{% code-snippet file="/_code-samples/escrow/js/finish-escrow.js" language="js" from="// Prepare EscrowFinish" before="await client.disconnect" /%} +{% /tab %} + +{% tab label="Python" %} +{% code-snippet file="/_code-samples/escrow/py/finish_escrow.py" language="py" from="# Build escrow finish" /%} +{% /tab %} + {% /tabs %} Take note of the transaction's identifying `hash` value so you can check its final status when it is included in a validated ledger version. diff --git a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md index 61d911335f..2cb08fec91 100644 --- a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md +++ b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md @@ -47,26 +47,68 @@ print(release_date_ripple) {% partial file="/docs/_snippets/secret-key-warning.md" /%} + +{% tabs %} + +{% tab label="Websocket" %} Request: - -{% tabs %} - -{% tab label="Websocket" %} {% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowcreate-time.json" language="json" /%} -{% /tab %} - -{% /tabs %} - Response: - -{% tabs %} - -{% tab label="Websocket" %} {% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowcreate-time.json" language="json" /%} {% /tab %} -{% /tabs %} +{% tab label="Javascript" %} +```js +// Prepare EscrowCreate transaction ------------------------------------ +const escrowCreateTransaction = { + "TransactionType": "EscrowCreate", + "Account": wallet.address, + "Destination": wallet.address, + "Amount": "6000000", //drops XRP + "DestinationTag": 2023, + "Fee": "12", + "FinishAfter": xrpl.isoTimeToRippleTime(finishAfter.toISOString()), +}; +xrpl.validate(escrowCreateTransaction); + +// Sign and submit the transaction ---------------------------------------- +console.log('Signing and submitting the transaction:', + JSON.stringify(escrowCreateTransaction, null, "\t"), "\n" +); +const response = await client.submitAndWait(escrowCreateTransaction, { wallet }); +console.log(`Sequence number: ${response.result.tx_json.Sequence}`); +console.log(`Finished submitting! ${JSON.stringify(response.result, null, "\t")}`); +``` +{% /tab %} + +{% tab label="Python" %} +```python +# Build escrow create transaction +create_txn = EscrowCreate( + account=sender_wallet.address, + amount=xrp_to_drops(10.000), + destination=receiver_addr, + finish_after=claim_date +) + +# Autofill, sign, then submit transaction and wait for result +stxn_response = submit_and_wait(create_txn, client, sender_wallet) + +# Return result of transaction +stxn_result = stxn_response.result + + +# Parse result and print out the neccesary info +print(stxn_result["tx_json"]["Account"]) +print(stxn_result["tx_json"]["Sequence"]) + +print(stxn_result["meta"]["TransactionResult"]) +print(stxn_result["hash"]) +``` +{% /tab %} + +{% /tabs %} Take note of the transaction's identifying `hash` value so you can check its final status when it is included in a validated ledger version. @@ -138,22 +180,55 @@ If the escrow has expired, you can only [cancel the escrow](cancel-an-expired-es {% partial file="/docs/_snippets/secret-key-warning.md" /%} -Request: - {% tabs %} {% tab label="Websocket" %} +Request: {% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowfinish-time.json" language="json" /%} -{% /tab %} - -{% /tabs %} Response: +{% code-snippet file="/_api-examples/escrow/websocket/tx-response-escrowfinish-time.json" language="json" /%} +{% /tab %} -{% tabs %} +{% tab label="Javascript" %} +```js +// Prepare EscrowFinish transaction --------------------------------- +const escrowFinishTransaction = { + "Account": wallet.address, + "TransactionType": "EscrowFinish", + "Owner": wallet.address, + // This should equal the sequence number of the escrow transaction + "OfferSequence": offerSequence, +}; -{% tab label="Websocket" %} -{% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowfinish-time.json" language="json" /%} +xrpl.validate(escrowFinishTransaction); + +// Sign and submit the transaction ---------------------------------------- +console.log('Signing and submitting the transaction:', JSON.stringify(escrowFinishTransaction, null, "\t")); +const response = await client.submitAndWait(escrowFinishTransaction, { wallet }); +console.log(`Finished submitting! ${JSON.stringify(response.result, null, "\t")}`); +``` +{% /tab %} + +{% tab label="Python" %} +```python +# Build escrow finish transaction +finish_txn = EscrowFinish( + account=sender_wallet.address, + owner=escrow_creator, + offer_sequence=escrow_sequence, # The sequence number of the escrow transaction +) + +# Autofill, sign, then submit transaction and wait for result +stxn_response = submit_and_wait(finish_txn, client, sender_wallet) + +# Parse response and return result +stxn_result = stxn_response.result + +# Parse result and print out the transaction result and transaction hash +print(stxn_result["meta"]["TransactionResult"]) +print(stxn_result["hash"]) +``` {% /tab %} {% /tabs %} diff --git a/docs/tutorials/how-tos/use-specialized-payment-types/use-payment-channels/index.md b/docs/tutorials/how-tos/use-specialized-payment-types/use-payment-channels/index.md index 380d35d8dc..b4b7b58dd9 100644 --- a/docs/tutorials/how-tos/use-specialized-payment-types/use-payment-channels/index.md +++ b/docs/tutorials/how-tos/use-specialized-payment-types/use-payment-channels/index.md @@ -84,7 +84,7 @@ Content-Type: application/json "fee_mult_max": 1000 }] } -```json +``` Response: @@ -106,7 +106,6 @@ Response: } ``` - The immediate response to the `submit` request contains a _provisional_ result with the transaction's identifying `hash` value. The payer should check the transaction's _final_ result in a validated ledger and get the Channel ID from the metadata. This can be done with the `tx` command: Request: From 24f501fda99b88237d374f642a68bd5c72d60722 Mon Sep 17 00:00:00 2001 From: Maria Shodunke Date: Wed, 9 Jul 2025 15:28:52 +0100 Subject: [PATCH 02/16] Add payment channel snippets to docs --- .../js/claimPayChannel.ts | 2 +- .../py/claim_pay_channel.py | 120 +++++++++--------- .../use-payment-channels/index.md | 28 ++++ 3 files changed, 87 insertions(+), 63 deletions(-) diff --git a/_code-samples/claim-payment-channel/js/claimPayChannel.ts b/_code-samples/claim-payment-channel/js/claimPayChannel.ts index 0053cca3d2..9fba2216f2 100644 --- a/_code-samples/claim-payment-channel/js/claimPayChannel.ts +++ b/_code-samples/claim-payment-channel/js/claimPayChannel.ts @@ -66,7 +66,7 @@ async function claimPayChannel(): Promise { console.log("Submitting a PaymentChannelClaim transaction...") const channelClaimResponse = await client.submit(paymentChannelClaim, { - wallet: wallet1, + wallet: wallet2, }) console.log("PaymentChannelClaim transaction response:") console.log(channelClaimResponse) diff --git a/_code-samples/claim-payment-channel/py/claim_pay_channel.py b/_code-samples/claim-payment-channel/py/claim_pay_channel.py index 264cf0af38..6c51eed203 100644 --- a/_code-samples/claim-payment-channel/py/claim_pay_channel.py +++ b/_code-samples/claim-payment-channel/py/claim_pay_channel.py @@ -13,75 +13,71 @@ from xrpl.transaction import submit, submit_and_wait from xrpl.account import get_balance -def claim_pay_channel(): - """The snippet walks us through creating and claiming a Payment Channel.""" +"""The snippet walks us through creating and claiming a Payment Channel.""" - client = JsonRpcClient("https://s.altnet.rippletest.net:51234") - - # Creating wallets as prerequisite - wallet1 = generate_faucet_wallet(client) - wallet2 = generate_faucet_wallet(client) +client = JsonRpcClient("https://s.altnet.rippletest.net:51234") - print("Balances of wallets before Payment Channel is claimed:") - print(f"Balance of {wallet1.address} is {get_balance(wallet1.address, client)} XRP") - print(f"Balance of {wallet2.address} is {get_balance(wallet2.address, client)} XRP") +# Creating wallets as prerequisite +wallet1 = generate_faucet_wallet(client) +wallet2 = generate_faucet_wallet(client) - # Create a Payment Channel and submit and wait for tx to be validated - payment_channel_create = PaymentChannelCreate( - account=wallet1.address, - amount="100", # 10 XRP - destination=wallet2.address, - settle_delay=86400, # 1 day in seconds - public_key=wallet1.public_key, - ) +print("Balances of wallets before Payment Channel is claimed:") +print(f"Balance of {wallet1.address} is {get_balance(wallet1.address, client)} XRP") +print(f"Balance of {wallet2.address} is {get_balance(wallet2.address, client)} XRP") - print("Submitting a PaymentChannelCreate transaction...") - payment_channel_response = submit_and_wait( - payment_channel_create, - client, - wallet1 - ) - print("PaymentChannelCreate transaction response:") - print(payment_channel_response.result) +# Create a Payment Channel and submit and wait for tx to be validated +payment_channel_create = PaymentChannelCreate( + account=wallet1.address, + amount="100", # 10 XRP + destination=wallet2.address, + settle_delay=86400, # 1 day in seconds + public_key=wallet1.public_key, +) - # Check that the object was actually created - account_objects_request = AccountObjects( - account=wallet1.address, - ) - account_objects_response = client.request(account_objects_request) - account_objects = account_objects_response.result["account_objects"] +print("Submitting a PaymentChannelCreate transaction...") +payment_channel_response = submit_and_wait( + payment_channel_create, + client, + wallet1 +) +print("PaymentChannelCreate transaction response:") +print(payment_channel_response.result) - # Find the PayChannel object to get the correct channel ID - channel_id = None - for obj in account_objects: - if obj["LedgerEntryType"] == "PayChannel": - channel_id = obj["index"] - break +# Check that the object was actually created +account_objects_request = AccountObjects( + account=wallet1.address, +) +account_objects_response = client.request(account_objects_request) +account_objects = account_objects_response.result["account_objects"] - if not channel_id: - raise Exception("PayChannel not found in account objects") +# Find the PayChannel object to get the correct channel ID +channel_id = None +for obj in account_objects: + if obj["LedgerEntryType"] == "PayChannel": + channel_id = obj["index"] + break - print(f"PayChannel ID: {channel_id}") +if not channel_id: + raise Exception("PayChannel not found in account objects") - # Destination claims the Payment Channel and we see the balances to verify. - payment_channel_claim = PaymentChannelClaim( - account=wallet2.address, - channel=channel_id, - amount="100", - ) +print(f"PayChannel ID: {channel_id}") - print("Submitting a PaymentChannelClaim transaction...") - channel_claim_response = submit_and_wait( - payment_channel_claim, - client, - wallet1, - ) - print("PaymentChannelClaim transaction response:") - print(channel_claim_response.result) - - print("Balances of wallets after Payment Channel is claimed:") - print(f"Balance of {wallet1.address} is {get_balance(wallet1.address, client)} XRP") - print(f"Balance of {wallet2.address} is {get_balance(wallet2.address, client)} XRP") - -if __name__ == "__main__": - claim_pay_channel() +# Destination claims the Payment Channel and we see the balances to verify. +payment_channel_claim = PaymentChannelClaim( + account=wallet2.address, + channel=channel_id, + amount="100", +) + +print("Submitting a PaymentChannelClaim transaction...") +channel_claim_response = submit_and_wait( + payment_channel_claim, + client, + wallet2, +) +print("PaymentChannelClaim transaction response:") +print(channel_claim_response.result) + +print("Balances of wallets after Payment Channel is claimed:") +print(f"Balance of {wallet1.address} is {get_balance(wallet1.address, client)} XRP") +print(f"Balance of {wallet2.address} is {get_balance(wallet2.address, client)} XRP") diff --git a/docs/tutorials/how-tos/use-specialized-payment-types/use-payment-channels/index.md b/docs/tutorials/how-tos/use-specialized-payment-types/use-payment-channels/index.md index b4b7b58dd9..df49b332eb 100644 --- a/docs/tutorials/how-tos/use-specialized-payment-types/use-payment-channels/index.md +++ b/docs/tutorials/how-tos/use-specialized-payment-types/use-payment-channels/index.md @@ -62,6 +62,9 @@ The following example shows creation of a payment channel by [submitting](../../ {% admonition type="info" name="Note" %}A payment channel counts as one object toward the payer's [owner reserve](../../../../concepts/accounts/reserves.md#owner-reserves). The owner must keep at least enough XRP to satisfy the reserve after subtracting the XRP allocated to the payment channel.{% /admonition %} +{% tabs %} + +{% tab label="JSON-RPC" %} Request: ```json @@ -105,6 +108,17 @@ Response: } } ``` +{% /tab %} + +{% tab label="Javascript" %} +{% code-snippet file="/_code-samples/claim-payment-channel/js/claimPayChannel.ts" language="js" from="// Create a Payment" before="// Check" /%} +{% /tab %} + +{% tab label="Python" %} +{% code-snippet file="/_code-samples/claim-payment-channel/py/claim_pay_channel.py" language="py" from="# Create a Payment" before="# Check" /%} +{% /tab %} + +{% /tabs %} The immediate response to the `submit` request contains a _provisional_ result with the transaction's identifying `hash` value. The payer should check the transaction's _final_ result in a validated ledger and get the Channel ID from the metadata. This can be done with the `tx` command: @@ -399,6 +413,9 @@ The payee can do this multiple times, to settle partially while still doing busi Example of claiming XRP from a channel: +{% tabs %} + +{% tab label="JSON-RPC" %} Request: ```json @@ -453,6 +470,17 @@ Response: } } ``` +{% /tab %} + +{% tab label="Javascript" %} +{% code-snippet file="/_code-samples/claim-payment-channel/js/claimPayChannel.ts" language="js" from="// Destination claims" before="console.log('Balances of" /%} +{% /tab %} + +{% tab label="Python" %} +{% code-snippet file="/_code-samples/claim-payment-channel/py/claim_pay_channel.py" language="py" from="# Destination claims" before="print(\"Balances of" /%} +{% /tab %} + +{% /tabs %} The payee should confirm that this transaction is successful in a validated ledger. For the full details, see [Reliable Transaction Submission](../../../../concepts/transactions/reliable-transaction-submission.md). From d6075dd033bc919d3252afc1f94644dd8beb03cf Mon Sep 17 00:00:00 2001 From: mDuo13 Date: Fri, 11 Jul 2025 15:59:31 -0700 Subject: [PATCH 03/16] Update installation supported OSes --- .../build-run-rippled-in-reporting-mode.md | 2 - ...with-yum.md => install-rippled-on-rhel.md} | 0 .../update-rippled-automatically-on-linux.md | 4 +- ....md => update-rippled-manually-on-rhel.md} | 2 +- .../img/reporting-mode-basic-architecture.svg | 1 - .../build-run-rippled-in-reporting-mode.md | 367 +----------------- docs/infrastructure/installation/index.md | 3 +- .../installation/install-clio-on-ubuntu.md | 6 +- ...with-yum.md => install-rippled-on-rhel.md} | 11 +- .../installation/install-rippled-on-ubuntu.md | 15 +- .../rippled-1-3-migration-instructions.md | 129 ------ .../installation/system-requirements.md | 9 +- .../update-rippled-automatically-on-linux.md | 10 +- ....md => update-rippled-manually-on-rhel.md} | 29 +- .../update-rippled-manually-on-ubuntu.md | 24 +- .../troubleshooting/diagnosing-problems.md | 2 +- .../logrotate.md | 2 +- redirects.yaml | 9 + sidebars.yaml | 6 +- 19 files changed, 53 insertions(+), 578 deletions(-) rename @l10n/ja/docs/infrastructure/installation/{install-rippled-on-centos-rhel-with-yum.md => install-rippled-on-rhel.md} (100%) rename @l10n/ja/docs/infrastructure/installation/{update-rippled-manually-on-centos-rhel.md => update-rippled-manually-on-rhel.md} (95%) delete mode 100644 docs/img/reporting-mode-basic-architecture.svg rename docs/infrastructure/installation/{install-rippled-on-centos-rhel-with-yum.md => install-rippled-on-rhel.md} (84%) delete mode 100644 docs/infrastructure/installation/rippled-1-3-migration-instructions.md rename docs/infrastructure/installation/{update-rippled-manually-on-centos-rhel.md => update-rippled-manually-on-rhel.md} (54%) diff --git a/@l10n/ja/docs/infrastructure/installation/build-run-rippled-in-reporting-mode.md b/@l10n/ja/docs/infrastructure/installation/build-run-rippled-in-reporting-mode.md index e0bc5e5e6c..1aed9187d5 100644 --- a/@l10n/ja/docs/infrastructure/installation/build-run-rippled-in-reporting-mode.md +++ b/@l10n/ja/docs/infrastructure/installation/build-run-rippled-in-reporting-mode.md @@ -16,8 +16,6 @@ top_nav_grouping: 人気ページ そしてAPIコールを効率的に処理し、P2Pモードで動作している`rippled`サーバの負荷を軽減することができます。 -[{% inline-svg file="/docs/img/reporting-mode-basic-architecture.svg" /%}](/docs/img/reporting-mode-basic-architecture.svg "図 1: レポートモードでの`rippled`の動作") - `rippled`のレポートモードでは2種類のデータストアを使用します。 * トランザクションのメタデータ、アカウントの状態、レジャーのヘッダーを含む`rippled`のプライマリ永続データストア。プライマリ永続データストアとしてNuDB(ソースに付属)または[Cassandra](https://cassandra.apache.org/)を使用できます。Cassandraを使用する場合、複数のレポートモードサーバが単一のCassandraインスタンスまたはクラスター内のデータへのアクセスを共有できます。 diff --git a/@l10n/ja/docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum.md b/@l10n/ja/docs/infrastructure/installation/install-rippled-on-rhel.md similarity index 100% rename from @l10n/ja/docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum.md rename to @l10n/ja/docs/infrastructure/installation/install-rippled-on-rhel.md diff --git a/@l10n/ja/docs/infrastructure/installation/update-rippled-automatically-on-linux.md b/@l10n/ja/docs/infrastructure/installation/update-rippled-automatically-on-linux.md index e97300abd9..ed72e3636a 100644 --- a/@l10n/ja/docs/infrastructure/installation/update-rippled-automatically-on-linux.md +++ b/@l10n/ja/docs/infrastructure/installation/update-rippled-automatically-on-linux.md @@ -11,11 +11,11 @@ labels: Linuxでは、`rippled`が1回限りの`cron`構成を使用して最新バージョンに自動的にアップグレードされるように設定できます。可能であれば自動更新を有効にしておくことが推奨されます。 -以下の手順では、`rippled`が[`yum`リポジトリから(CentOS/RedHat)](install-rippled-on-centos-rhel-with-yum.md)、または[`apt`(Ubuntu/Debian)を使用して](install-rippled-on-ubuntu.md)インストールされていることを前提としています。 +以下の手順では、`rippled`が[`yum`リポジトリから(CentOS/RedHat)](install-rippled-on-rhel.md)、または[`apt`(Ubuntu/Debian)を使用して](install-rippled-on-ubuntu.md)インストールされていることを前提としています。 自動更新を設定するには、以下の手順に従います。 -1. `/opt/ripple/etc/update-rippled-cron`が存在することを確認します。存在しない場合は、([CentOS/Red Hat](update-rippled-manually-on-centos-rhel.md)または[Ubuntu/Debian](update-rippled-manually-on-ubuntu.md)を)手動で更新します。 +1. `/opt/ripple/etc/update-rippled-cron`が存在することを確認します。存在しない場合は、([CentOS/Red Hat](update-rippled-manually-on-rhel.md)または[Ubuntu/Debian](update-rippled-manually-on-ubuntu.md)を)手動で更新します。 2. `cron.d`フォルダーに、`/opt/ripple/etc/update-rippled-cron`構成ファイルへのsymlinkを作成します。 diff --git a/@l10n/ja/docs/infrastructure/installation/update-rippled-manually-on-centos-rhel.md b/@l10n/ja/docs/infrastructure/installation/update-rippled-manually-on-rhel.md similarity index 95% rename from @l10n/ja/docs/infrastructure/installation/update-rippled-manually-on-centos-rhel.md rename to @l10n/ja/docs/infrastructure/installation/update-rippled-manually-on-rhel.md index d07294471e..a99c080247 100644 --- a/@l10n/ja/docs/infrastructure/installation/update-rippled-manually-on-centos-rhel.md +++ b/@l10n/ja/docs/infrastructure/installation/update-rippled-manually-on-rhel.md @@ -11,7 +11,7 @@ labels: このページでは、CentOSまたはRed Hat Enterprise Linuxで最新リリースの`rippled`に手動で更新する手順を説明します。可能であれば手動更新ではなく[自動更新](update-rippled-automatically-on-linux.md)を設定することが推奨されます。 -以下の手順は、[`rippled`がすでに`yum`リポジトリからインストール](install-rippled-on-centos-rhel-with-yum.md)されていることを前提としています。 +以下の手順は、[`rippled`がすでに`yum`リポジトリからインストール](install-rippled-on-rhel.md)されていることを前提としています。 {% admonition type="success" name="ヒント" %}これらの手順をすべて一度に実行するには、`rippled`パッケージに含まれている`/opt/ripple/bin/update-rippled.sh`スクリプトを実行します。このスクリプトは`sudo`ユーザとして実行する必要があります。{% /admonition %} diff --git a/docs/img/reporting-mode-basic-architecture.svg b/docs/img/reporting-mode-basic-architecture.svg deleted file mode 100644 index b554dc0be3..0000000000 --- a/docs/img/reporting-mode-basic-architecture.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/infrastructure/installation/build-run-rippled-in-reporting-mode.md b/docs/infrastructure/installation/build-run-rippled-in-reporting-mode.md index 5f2ff16c06..173690570e 100644 --- a/docs/infrastructure/installation/build-run-rippled-in-reporting-mode.md +++ b/docs/infrastructure/installation/build-run-rippled-in-reporting-mode.md @@ -1,371 +1,12 @@ --- -html: build-run-rippled-in-reporting-mode.html -parent: install-rippled.html seo: - description: Build and run a special operating mode of rippled that handles remote procedure calls (RPC) for validated data. -labels: - - Core Server - - Blockchain -top_nav_grouping: Popular Pages + description: Reporting mode was a rippled server build specialized for for API usage. It has been deprecated in favor of the Clio server. +status: removed --- # Build and Run `rippled` in Reporting Mode -[Reporting mode](../../concepts/networks-and-servers/rippled-server-modes.md) is a mode of the XRP Ledger core server specialized for serving [HTTP and WebSocket APIs](../../references/http-websocket-apis/index.md). +**Reporting mode** was a build option of the `rippled` server, specialized for serving [HTTP and WebSocket APIs](../../references/http-websocket-apis/index.md). It has been removed in favor of the [Clio server](../../concepts/networks-and-servers/the-clio-server.md). -In reporting mode, the server does not connect to the peer-to-peer network. Instead, it uses gRPC to get validated data from one or more trusted servers that are connected to the P2P network. - -It can then efficiently handle API calls, reducing the load on `rippled` servers running in P2P mode. - -[{% inline-svg file="/docs/img/reporting-mode-basic-architecture.svg" /%}](/docs/img/reporting-mode-basic-architecture.svg "Figure 1: Working of `rippled` in reporting mode") - -The reporting mode of `rippled` uses two datastores: - -* The primary persistent datastore for `rippled` that includes transaction metadata, account states, and ledger headers. You can use NuDB (included with the source) or [Cassandra](https://cassandra.apache.org/) as the primary persistent datastore. If you use Cassandra, multiple reporting mode servers can share access to data in a single Cassandra instance or cluster. - -* [PostgreSQL](https://www.postgresql.org/) database to hold relational data, which is used mainly by [tx method][] and [account_tx method][]. - -When a reporting mode server receives an API request, it loads the data from these data stores if possible. For requests that require data from the P2P network, the reporting mode forwards the request to a P2P server, and then passes the response back to the client. - -Multiple reporting mode servers can share access to the same network accessible databases (PostgreSQL and Cassandra); at any given time, only one reporting mode server writes to the databases, while all the others read from the databases. - -## How to Run Reporting Mode - -### Prerequisites - -1. Ensure that your system meets the [system requirements](system-requirements.md). - - {% admonition type="info" name="Note" %}If you choose to use Cassandra as the database, the disk requirements for `rippled` will be lower as the data will not be stored on your local disk. {% /admonition %} - -2. You also need to run at least one `rippled` server in P2P mode. - -3. A compatible version of CMake must be installed. - -4. Install and configure the datastores required to run `rippled` in reporting mode. - - 1. Install PostgreSQL. - - 2. Install and configure the database to be used as the primary persistent datastore. You can choose to use Cassandra or NuDB. - - 3. On macOS, you need to manually install the Cassandra cpp driver. On all other platforms, the Cassandra driver is built as part of the `rippled` build. - - ``` - brew install cassandra-cpp-driver - ``` - -#### Install PostgreSQL - -**Install PostgreSQL on Linux** - -1. Download and [install PostgreSQL on Linux](https://www.postgresqltutorial.com/install-postgresql-linux/). - -2. Connect to the PostgreSQL Database Server using `psql`, and create a user `newuser` and a database `reporting`. - - ``` - psql postgres - CREATE ROLE newuser WITH LOGIN PASSWORD ‘password’; - ALTER ROLE newuser CREATEDB; - \q - psql postgres -U newuser - postgres=# create database reporting; - ``` - - -**Install PostgreSQL on macOS** - -1. Download and install PostgreSQL on macOS. - - ``` - brew install postgres - brew services start postgres - ``` - -2. Connect to the PostgreSQL Database Server using `psql` and create a user `newuser` and a database `reporting`. - - ``` - psql postgres - CREATE ROLE newuser WITH LOGIN PASSWORD ‘password’; - ALTER ROLE newuser CREATEDB; - \q - psql postgres -U newuser - postgres=# create database reporting; - ``` - -#### Install and Configure the Primary Persistent Datastore - -**Cassandra** - -Install Cassandra and then create a keyspace for `rippled`, with replication. - -While a replication factor of 3 is recommended, when running locally, replication is not needed and you can set `replication_factor` to 1. - -``` -$ cqlsh [host] [port] -> CREATE KEYSPACE `rippled` WITH REPLICATION = -{'class' : 'SimpleStrategy', 'replication_factor' : 1 }; -``` - -**NuDB** - -If you’re running `rippled` in reporting mode for your local network, you can choose to use NuDB instead of Cassandra as your backend database. - -NuDB is installed as part of your `rippled` build setup and does not require any additional installation steps. - - -### Steps - -1. Build `rippled` for reporting mode on [Ubuntu or macOS](https://github.com/XRPLF/rippled/blob/release/BUILD.md). - - {% tabs %} - - ```{% label="Linux" %} - wget https://github.com/Kitware/CMake/releases/download/v3.16.3/cmake-3.16.3-Linux-x86_64.sh - sudo sh cmake-3.16.3-Linux-x86_64.sh --prefix=/usr/local --exclude-subdir - cmake -B build -Dreporting=ON -DCMAKE_BUILD_TYPE=Debug - cmake --build build --parallel $(nproc) - ``` - - ```{% label="macOS" %} - cmake -B build -G "Unix Makefiles" -Dreporting=ON -DCMAKE_BUILD_TYPE=Debug - cmake --build build --parallel $(nproc) - ``` - - {% /tabs %} - -2. Create a configuration file to run `rippled` in reporting mode. - - Make a copy of the example config file, `rippled-example.cfg`, and save it as `rippled-reporting-mode.cfg` in a location that enables you to run `rippled` as a non-root user. For example: - - ``` - mkdir -p $HOME/.config/ripple - cp /cfg/rippled-example.cfg $HOME/.config/ripple/rippled-reporting-mode.cfg - ``` - -3. Edit rippled-reporting-mode.cfg to set necessary file paths. The user you plan to run `rippled` as must have write permissions to all of the paths you specify here. - - 1. Set the `[node_db]` path to the location where you want to store the ledger database. - - 2. Set the `[database_path]` to the location where you want to store other database data. (This includes an SQLite database with configuration data, and is typically one level above the `[node_db]` path field.) - - 3. Set the `[debug_logfile]` to a path where `rippled` can write logging information. - - Note that these are the only configurations required for `rippled` to start up successfully. All other configurations are optional and can be tweaked after you have a working server. - -4. Edit the `rippled-reporting-mode.cfg` file to enable reporting mode: - - 1. Uncomment the `[reporting]` stanza or add a new one: - - ``` - [reporting] - etl_source - read_only=0 - ``` - - 2. List the `rippled` sources (ETL sources) to extract data from. These `rippled` servers must have gRPC enabled. - - NOTE: Only include servers that you trust as reporting mode does not connect to the P2P network and hence cannot verify that the data actually matches the network consensus ledger. - - ``` - [etl_source] - source_grpc_port=50051 - source_ws_port=6006 - source_ip=127.0.0.1 - ``` - -5. Configure the databases - - 1. Specify the Postgres DB for `[ledger_tx_tables]`: - - ``` - [ledger_tx_tables] - conninfo = postgres://newuser:password@127.0.0.1/reporting - use_tx_tables=1 - ``` - - 2. Specify the database for `[node_db]`. - - {% tabs %} - - ```{% label="NuDB" %} - [node_db] - type=NuDB - path=/home/ubuntu/ripple/ - - [ledger_history] - 1000000 - ``` - - ```{% label="Cassandra" %} - [node_db] - type=Cassandra - - [ledger_history] - 1000000 - ``` - - {% /tabs %} - -6. Modify the configuration for `rippled` to open up ports. - - 1. Open the public websocket port: - - ``` - [port_ws_admin_local] - port = 6006 - ip = 127.0.0.1 - admin = 127.0.0.1 - protocol = ws - ``` - - - 2. Open the gRPC port: - - ``` - [port_grpc] - port = 60051 - ip = 0.0.0.0 - ``` - - - 3. Add a secured gateway to the IP of your reporting system: - - ``` - secure_gateway = 127.0.0.1 - ``` - -7. Run `rippled` in reporting mode: - - ``` - ./rippled --conf /home/ubuntu/.config/ripple/rippled-reporting-example.cfg - ``` - - -### What to Expect - -Here are the excerpts of what you can expect to see on your terminal. - -```text -Loading: "/home/ubuntu/.config/ripple/rippled-reporting-example.cfg" -2021-Dec-09 21:31:52.245577 UTC JobQueue:NFO Using 10 threads -2021-Dec-09 21:31:52.255422 UTC LedgerConsensus:NFO Consensus engine started (cookie: 17859050541656985684) -2021-Dec-09 21:31:52.256542 UTC ReportingETL::ETLSource:NFO Using IP to connect to ETL source: 127.0.0.1:50051 -2021-Dec-09 21:31:52.257784 UTC ReportingETL::ETLSource:NFO Made stub for remote = { validated_ledger : , ip : 127.0.0.1 , web socket port : 6006, grpc port : 50051 } -2021-Dec-09 21:31:52.258032 UTC ReportingETL::LoadBalancer:NFO add : added etl source - { validated_ledger : , ip : 127.0.0.1 , web socket port : 6006, grpc port : 50051 } -2021-Dec-09 21:31:52.258327 UTC Application:NFO process starting: rippled-1.8.1+DEBUG -2021-Dec-09 21:31:52.719186 UTC PgPool:DBG max_connections: 18446744073709551615, timeout: 600, connection params: port: 5432, hostaddr: 127.0.0.1, user: newuser, password: *, channel_binding: prefer, dbname: reporting_test_core, host: 127.0.0.1, options: , sslmode: prefer, sslcompression: 0, sslsni: 1, ssl_min_protocol_version: TLSv1.2, gssencmode: prefer, krbsrvname: postgres, target_session_attrs: any -2021-Dec-09 21:31:52.788851 UTC PgPool:NFO server message: NOTICE: relation "version" already exists, skipping - -2021-Dec-09 21:31:53.282807 UTC TaggedCache:DBG LedgerCache target size set to 384 -2021-Dec-09 21:31:53.282892 UTC TaggedCache:DBG LedgerCache target age set to 240000000000 -2021-Dec-09 21:31:53.283741 UTC Amendments:DBG Amendment 98DECF327BF79997AEC178323AD51A830E457BFC6D454DAF3E46E5EC42DC619F (CheckCashMakesTrustLine) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.283836 UTC Amendments:DBG Amendment 157D2D480E006395B76F948E3E07A45A05FE10230D88A7993C71F97AE4B1F2D1 (Checks) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.283917 UTC Amendments:DBG Amendment 1562511F573A19AE9BD103B5D6B9E01B3B46805AEC5D3C4805C902B514399146 (CryptoConditions) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.283975 UTC Amendments:DBG Amendment 86E83A7D2ECE3AD5FA87AB2195AE015C950469ABF0B72EAACED318F74886AE90 (CryptoConditionsSuite) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284016 UTC Amendments:DBG Amendment 30CD365592B8EE40489BA01AE2F7555CAC9C983145871DC82A42A31CF5BAE7D9 (DeletableAccounts) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284062 UTC Amendments:DBG Amendment F64E1EABBE79D55B3BB82020516CEC2C582A98A6BFE20FBE9BB6A0D233418064 (DepositAuth) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284099 UTC Amendments:DBG Amendment 3CBC5C4E630A1B82380295CDA84B32B49DD066602E74E39B85EF64137FA65194 (DepositPreauth) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284126 UTC Amendments:DBG Amendment DC9CA96AEA1DCF83E527D1AFC916EFAF5D27388ECA4060A88817C1238CAEE0BF (EnforceInvariants) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284153 UTC Amendments:DBG Amendment 07D43DCE529B15A10827E5E04943B496762F9A88E3268269D69C44BE49E21104 (Escrow) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284189 UTC Amendments:DBG Amendment 42426C4D4F1009EE67080A9B7965B44656D7714D104A72F9B4369F97ABF044EE (FeeEscalation) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284216 UTC Amendments:DBG Amendment 740352F2412A9909880C23A559FCECEDA3BE2126FED62FC7660D628A06927F11 (Flow) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284241 UTC Amendments:DBG Amendment 3012E8230864E95A58C60FD61430D7E1B4D3353195F2981DC12B0C7C0950FFAC (FlowCross) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284284 UTC Amendments:DBG Amendment AF8DF7465C338AE64B1E937D6C8DA138C0D63AD5134A68792BBBE1F63356C422 (FlowSortStrands) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284337 UTC Amendments:DBG Amendment 1F4AFA8FA1BC8827AD4C0F682C03A8B671DCDF6B5C4DE36D44243A684103EF88 (HardenedValidations) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284412 UTC Amendments:DBG Amendment 4C97EBA926031A7CF7D7B36FDE3ED66DDA5421192D63DE53FFB46E43B9DC8373 (MultiSign) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284455 UTC Amendments:DBG Amendment 586480873651E106F1D6339B0C4A8945BA705A777F3F4524626FF1FC07EFE41D (MultiSignReserve) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284491 UTC Amendments:DBG Amendment B4E4F5D2D6FB84DF7399960A732309C9FD530EAE5941838160042833625A6076 (NegativeUNL) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284528 UTC Amendments:DBG Amendment 08DE7D96082187F6E6578530258C77FAABABE4C20474BDB82F04B021F1A68647 (PayChan) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284592 UTC Amendments:DBG Amendment 00C1FC4A53E60AB02C864641002B3172F38677E29C26C5406685179B37E1EDAC (RequireFullyCanonicalSig) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284649 UTC Amendments:DBG Amendment CC5ABAE4F3EC92E94A59B1908C2BE82D2228B6485C00AFF8F22DF930D89C194E (SortedDirectories) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284703 UTC Amendments:DBG Amendment 532651B4FD58DF8922A49BA101AB3E996E5BFBF95A913B3E392504863E63B164 (TickSize) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284787 UTC Amendments:DBG Amendment 955DF3FA5891195A9DAEFA1DDC6BB244B545DDE1BAA84CBB25D5F12A8DA68A0C (TicketBatch) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284950 UTC Amendments:DBG Amendment 6781F8368C4771B83E8B821D88F580202BCB4228075297B19E4FDC5233F1EFDC (TrustSetAuth) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.284997 UTC Amendments:DBG Amendment B4D44CC3111ADD964E846FC57760C8B50FFCD5A82C86A72756F6B058DDDF96AD (fix1201) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285025 UTC Amendments:DBG Amendment E2E6F2866106419B88C50045ACE96368558C345566AC8F2BDF5A5B5587F0E6FA (fix1368) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285067 UTC Amendments:DBG Amendment 42EEA5E28A97824821D4EF97081FE36A54E9593C6E4F20CBAE098C69D2E072DC (fix1373) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285103 UTC Amendments:DBG Amendment 6C92211186613F9647A89DFFBAB8F94C99D4C7E956D495270789128569177DA1 (fix1512) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285129 UTC Amendments:DBG Amendment 67A34F2CF55BFC0F93AACD5B281413176FEE195269FA6D95219A2DF738671172 (fix1513) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285153 UTC Amendments:DBG Amendment 5D08145F0A4983F23AFFFF514E83FAD355C5ABFBB6CAB76FB5BC8519FF5F33BE (fix1515) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285176 UTC Amendments:DBG Amendment B9E739B8296B4A1BB29BE990B17D66E21B62A300A909F25AC55C22D6C72E1F9D (fix1523) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285202 UTC Amendments:DBG Amendment 1D3463A5891F9E589C5AE839FFAC4A917CE96197098A1EF22304E1BC5B98A454 (fix1528) is supported and will be down voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285256 UTC Amendments:DBG Amendment CA7C02118BA27599528543DFE77BA6838D1B0F43B447D4D7F53523CE6A0E9AC2 (fix1543) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285290 UTC Amendments:DBG Amendment 7117E2EC2DBF119CA55181D69819F1999ECEE1A0225A7FD2B9ED47940968479C (fix1571) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285343 UTC Amendments:DBG Amendment FBD513F1B893AC765B78F250E6FFA6A11B573209D1842ADC787C850696741288 (fix1578) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285381 UTC Amendments:DBG Amendment 58BE9B5968C4DA7C59BA900961828B113E5490699B21877DEF9A31E9D0FE5D5F (fix1623) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285424 UTC Amendments:DBG Amendment 25BA44241B3BD880770BFA4DA21C7180576831855368CBEC6A3154FDE4A7676E (fix1781) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285464 UTC Amendments:DBG Amendment 4F46DF03559967AC60F2EB272FEFE3928A7594A45FF774B87A7E540DB0F8F068 (fixAmendmentMajorityCalc) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285500 UTC Amendments:DBG Amendment 8F81B066ED20DAECA20DF57187767685EEF3980B228E0667A650BAF24426D3B4 (fixCheckThreading) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285527 UTC Amendments:DBG Amendment C4483A1896170C66C098DEA5B0E024309C60DC960DE5F01CD7AF986AA3D9AD37 (fixMasterKeyAsRegularKey) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285550 UTC Amendments:DBG Amendment 621A0B264970359869E3C0363A899909AAB7A887C8B73519E4ECF952D33258A8 (fixPayChanRecipientOwnerDir) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285575 UTC Amendments:DBG Amendment 89308AF3B8B10B7192C4E613E1D2E4D9BA64B2EE2D5232402AE82A6A7220D953 (fixQualityUpperBound) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285614 UTC Amendments:DBG Amendment B6B3EEDC0267AB50491FDC450A398AF30DBCD977CECED8BEF2499CAB5DAC19E2 (fixRmSmallIncreasedQOffers) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285651 UTC Amendments:DBG Amendment 452F5906C46D46F407883344BFDD90E672B672C5E9943DB4891E3A34FEEEB9DB (fixSTAmountCanonicalize) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.285725 UTC Amendments:DBG Amendment 2CD5286D8D687E98B41102BDD797198E81EA41DF7BD104E6561FEB104EFF2561 (fixTakerDryOfferRemoval) is supported and will be up voted if not enabled on the ledger. -2021-Dec-09 21:31:53.290446 UTC Server:NFO Opened 'port_rpc_admin_local' (ip=127.0.0.1:7005, admin IPs:127.0.0.1, http) -2021-Dec-09 21:31:53.290834 UTC Server:NFO Opened 'port_ws_admin_local' (ip=127.0.0.1:7006, admin IPs:127.0.0.1, ws) -2021-Dec-09 21:31:53.290984 UTC Application:WRN Running in standalone mode -2021-Dec-09 21:31:53.291048 UTC NetworkOPs:NFO STATE->full -2021-Dec-09 21:31:53.291192 UTC Application:FTL Startup RPC: -{ - "command" : "log_level", - "severity" : "debug" -} - - -2021-Dec-09 21:31:53.291347 UTC RPCHandler:DBG RPC call log_level completed in 2.2e-08seconds -2021-Dec-09 21:31:53.291440 UTC Application:FTL Result: -{ - "warnings" : - [ - - { - "id" : 1004, - "message" : "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" - } - ] -} - - -2021-Dec-09 21:31:53.291502 UTC ReportingETL:NFO Starting reporting etl -2021-Dec-09 21:31:53.291605 UTC Application:NFO Application starting. Version is 1.8.1+DEBUG -2021-Dec-09 21:31:53.291747 UTC LoadManager:DBG Starting -2021-Dec-09 21:31:53.291846 UTC gRPC Server:NFO Starting gRPC server at 0.0.0.0:60051 -2021-Dec-09 21:31:53.293246 UTC LedgerCleaner:DBG Started -2021-Dec-09 21:31:53.295543 UTC ReportingETL::ETLSource:DBG handleMessage : Received a message on ledger subscription stream. Message : { - "result" : {}, - "status" : "success", - "type" : "response" -} - - { validated_ledger : , ip : 127.0.0.1 , web socket port : 6006, grpc port : 50051 } -2021-Dec-09 21:31:53.368075 UTC ReportingETL:NFO monitor : Database is empty. Will download a ledger from the network. -2021-Dec-09 21:31:53.368183 UTC ReportingETL:NFO monitor : Waiting for next ledger to be validated by network... -``` - -## Frequently Asked Questions - - -**Do I need to run more than one instance of `rippled` to use reporting mode?** - -Yes. A `rippled` server running in reporting mode does not connect to the peer-to-peer network, but instead extracts validated data from one or more `rippled` servers that are connected to the network, so you need to run at least one P2P mode server. - -**I’ve already installed `rippled`. Can I update the configuration file to enable reporting mode and restart `rippled`?** - -No. Currently, you need to download the source and build `rippled` for reporting mode. There are initiatives in progress to provide packages for reporting mode. - - -**To run `rippled` in reporting mode, I need at least one `rippled` server running in P2P mode too. Does this mean I need double the disk space?** - -The answer depends on the location of your primary data store. If you use Cassandra as the primary data store, the reporting mode server stores much less data on its local disk. The PostgreSQL server can be remote as well. You can have multiple reporting mode servers share the same data this way. - -Lastly, the P2P mode server only needs to keep very recent history, while the reporting mode server keeps long term history. - -For more information on system requirements to run `rippled`, see the [`rippled` system requirements](system-requirements.md). - -**How can I confirm the validity of the data that comes from the PostgreSQL or Cassandra database?** - -When `rippled` runs in reporting mode, it only serves validated data from the ETL source specified in the config file. If you are using someone else's `rippled` server in P2P mode as the ETL source, you are implicitly trusting that server. If not, you need to run your own `rippled` node in P2P mode. - -**Is it possible to make traditional SQL queries to the relational database rather than using the API?** - -Technically, you *can* directly access the database if you want. However, the data is stored as binary blobs and you have to decode the blobs to access the data in them. This makes traditional SQL queries much less useful since they cannot find and filter the individual fields of the data. +Instead, see: [Install Clio on Ubuntu Linux](./install-clio-on-ubuntu.md). {% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/infrastructure/installation/index.md b/docs/infrastructure/installation/index.md index 4aae4bd99e..b2362a22e9 100644 --- a/docs/infrastructure/installation/index.md +++ b/docs/infrastructure/installation/index.md @@ -9,7 +9,6 @@ seo: --- # Installation -Install and update XRP Ledger servers including the core server, rippled, and API server, Clio. - +Install and update the core XRP Ledger server (`rippled`) or the API server (Clio). {% child-pages /%} diff --git a/docs/infrastructure/installation/install-clio-on-ubuntu.md b/docs/infrastructure/installation/install-clio-on-ubuntu.md index b3a42a565e..318dac3685 100644 --- a/docs/infrastructure/installation/install-clio-on-ubuntu.md +++ b/docs/infrastructure/installation/install-clio-on-ubuntu.md @@ -8,7 +8,7 @@ labels: --- # Install Clio on Ubuntu Linux -This page describes the recommended instructions for installing the latest stable version of Clio on **Ubuntu Linux 20.04 or higher** using the [`apt`](https://ubuntu.com/server/docs) utility. +This page describes the recommended instructions for installing the latest stable version of Clio on **Ubuntu Linux 22.04 or higher** using the [`apt`](https://ubuntu.com/server/docs) utility. These instructions install an Ubuntu package that has been compiled and published by Ripple. You can also: @@ -93,11 +93,11 @@ Before you install Clio, you must meet the following requirements. 5. Add the appropriate Ripple repository for your operating system version: ``` - echo "deb [signed-by=/usr/local/share/keyrings/ripple-key.gpg] https://repos.ripple.com/repos/rippled-deb focal stable" | \ + echo "deb [signed-by=/usr/local/share/keyrings/ripple-key.gpg] https://repos.ripple.com/repos/rippled-deb noble stable" | \ sudo tee -a /etc/apt/sources.list.d/ripple.list ``` - The above example is appropriate for **Ubuntu 20.04 Focal Fossa**. + The above example is appropriate for **Ubuntu 24.04 Noble Numbat**. If you want access to development or pre-release versions, use one of the following instead of `stable`: diff --git a/docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum.md b/docs/infrastructure/installation/install-rippled-on-rhel.md similarity index 84% rename from docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum.md rename to docs/infrastructure/installation/install-rippled-on-rhel.md index f82d682f77..10a5df1c14 100644 --- a/docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum.md +++ b/docs/infrastructure/installation/install-rippled-on-rhel.md @@ -1,17 +1,14 @@ --- -html: install-rippled-on-centos-rhel-with-yum.html -parent: install-rippled.html seo: - description: Install a precompiled rippled binary on CentOS or Red Hat Enterprise Linux. + description: Install a precompiled rippled binary on Red Hat Enterprise Linux. labels: - Core Server --- -# Install on CentOS/Red Hat with yum +# Install on Red Hat Enterprise Linux -This page describes the recommended instructions for installing the latest stable version of `rippled` on **CentOS 7** or **Red Hat Enterprise Linux 7**, using Ripple's [yum](https://en.wikipedia.org/wiki/Yellowdog_Updater,_Modified) repository. - -These instructions install a binary that has been compiled by Ripple. +This page describes the recommended instructions for installing the latest stable version of `rippled` on **Red Hat Enterprise Linux**, using a binary that has been compiled and published by Ripple as an `rpm` package. +Currently, **Red Hat Enterprise Linux (RHEL) 9.6 is supported on x86_64 processors**. You may also be able to adapt these instructions to similar Linux distributions including CentOS or Rocky Linux, but other configurations are not officially supported. ## Prerequisites diff --git a/docs/infrastructure/installation/install-rippled-on-ubuntu.md b/docs/infrastructure/installation/install-rippled-on-ubuntu.md index 0a94e51f69..8eedc0de3d 100644 --- a/docs/infrastructure/installation/install-rippled-on-ubuntu.md +++ b/docs/infrastructure/installation/install-rippled-on-ubuntu.md @@ -8,9 +8,9 @@ labels: --- # Install on Ubuntu or Debian Linux -This page describes the recommended instructions for installing the latest stable version of `rippled` on **Ubuntu Linux 18.04 or higher** or **Debian 10 or higher**, using the [`apt`](https://ubuntu.com/server/docs) utility. +This page describes the recommended instructions for installing the latest stable version of `rippled` on **Ubuntu Linux**, using a binary that has been compiled and published by Ripple as a `deb` package. -These instructions install a binary that has been compiled by Ripple. +Currently, **Ubuntu 22.04 and Ubuntu 24.04 on x86_64 processors** have received the highest level of support and testing. Packages are also available for **Debian Linux 12 Bookworm**. You may be able to adapt these instructions to other Linux distributions that also use the `apt` package manager, but other configurations are not officially supported. ## Prerequisites @@ -40,7 +40,6 @@ Before you install `rippled`, you must meet the [System Requirements](system-req sudo gpg --dearmor -o /etc/apt/keyrings/ripple.gpg ``` - 4. Check the fingerprint of the newly-added key: ``` @@ -56,22 +55,19 @@ Before you install `rippled`, you must meet the [System Requirements](system-req sub rsa3072 2019-02-14 [E] [expires: 2026-02-17] ``` - In particular, make sure that the fingerprint matches. (In the above example, the fingerprint is on the second line, starting with `C001`.) 5. Add the appropriate Ripple repository for your operating system version: ``` - echo "deb [signed-by=/etc/apt/keyrings/ripple.gpg] https://repos.ripple.com/repos/rippled-deb focal stable" | \ + echo "deb [signed-by=/etc/apt/keyrings/ripple.gpg] https://repos.ripple.com/repos/rippled-deb noble stable" | \ sudo tee -a /etc/apt/sources.list.d/ripple.list ``` - The above example is appropriate for **Ubuntu 20.04 Focal Fossa**. For other operating systems, replace the word `focal` with one of the following: + The above example is appropriate for **Ubuntu 24.04 Noble Numbat**. For other operating systems, replace the word `noble` with one of the following: - - `buster` for **Debian 10 Buster** - `bullseye` for **Debian 11 Bullseye** - `bookworm` for **Debian 12 Bookworm** - - `bionic` for **Ubuntu 18.04 Bionic Beaver** - `jammy` for **Ubuntu 22.04 Jammy Jellyfish** - `noble` for **Ubuntu 24.04 Noble Numbat** @@ -88,7 +84,6 @@ Before you install `rippled`, you must meet the [System Requirements](system-req sudo apt -y update && sudo apt -y install rippled ``` - 7. Check the status of the `rippled` service: ``` @@ -101,7 +96,6 @@ Before you install `rippled`, you must meet the [System Requirements](system-req sudo systemctl start rippled.service ``` - 8. Optional: allow `rippled` to bind to privileged ports. This allows you to serve incoming API requests on port 80 or 443. (If you want to do so, you must also update the config file's port settings.) @@ -110,7 +104,6 @@ Before you install `rippled`, you must meet the [System Requirements](system-req sudo setcap 'cap_net_bind_service=+ep' /opt/ripple/bin/rippled ``` - 9. Optional: configure core dumps By default Ubuntu is not configured to produce core files useful for debugging crashes. diff --git a/docs/infrastructure/installation/rippled-1-3-migration-instructions.md b/docs/infrastructure/installation/rippled-1-3-migration-instructions.md deleted file mode 100644 index 8a47d6ac7c..0000000000 --- a/docs/infrastructure/installation/rippled-1-3-migration-instructions.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -html: rippled-1-3-migration-instructions.html -parent: install-rippled.html -seo: - description: Use these instructions to upgrade rippled packages from 1.2.x or below to 1.3.x or higher. -status: removed ---- -# rippled v1.3.x Migration Instructions - -This document describes the migration process for upgrading from `rippled` 1.2.4 or earlier to `rippled` v1.3 or later. This migration process is necessary because the `rippled` install process has changed as of version 1.3. - -This document provides migration steps for upgrading on supported platforms: - -- [CentOS or Red Hat Enterprise Linux (RHEL)](#migration-on-centos-or-red-hat-enterprise-linux-rhel) -- [Ubuntu Linux](#migration-on-ubuntu-linux) - -For other platforms, see the updated instructions for compiling from source. ([Ubuntu](build-on-linux-mac-windows.md), [macOS](build-on-linux-mac-windows.md), or [Windows](https://github.com/XRPLF/rippled/tree/develop/Builds/VisualStudio2017)) - - -## Migration on CentOS or Red Hat Enterprise Linux (RHEL) - -Ripple's official RPM repository and instructions for using it have changed. If you have [automatic updates](update-rippled-automatically-on-linux.md) enabled, your system should perform the migration automatically. To migrate manually from the old repository to the new one, complete the following steps: - -1. Stop the `rippled` server. - - ``` - $ sudo systemctl stop rippled.service - ``` - -2. Remove the old Ripple repository package. - - ``` - $ sudo rpm -e ripple-repo - ``` - - The `rippled-repo` package is now **DEPRECATED**. The package has been updated one last time for version 1.3.1. In the future, any changes to the repositories will require manual changes to the `ripple.repo` file. - -3. Add Ripple's new yum repository: - - ``` - $ cat << REPOFILE | sudo tee /etc/yum.repos.d/ripple.repo - [ripple-stable] - name=XRP Ledger Packages - baseurl=https://repos.ripple.com/repos/rippled-rpm/stable/ - enabled=1 - gpgcheck=0 - gpgkey=https://repos.ripple.com/repos/rippled-rpm/stable/repodata/repomd.xml.key - repo_gpgcheck=1 - REPOFILE - ``` - -4. Install the new `rippled` package: - - ``` - $ sudo yum install rippled - ``` - - Version 1.3.1 does not require any changes to your config files (`rippled.cfg` and `validators.txt`). This update procedure leaves your existing config files in place. - -5. Reload systemd unit files: - - ``` - $ sudo systemctl daemon-reload - ``` - -6. Start the `rippled` service: - - ``` - $ sudo systemctl start rippled.service - ``` - - -{% admonition type="danger" name="Warning" %}If you use [automatic updates](update-rippled-automatically-on-linux.md), they should continue working after performing this migration process. However, **the `ripple-repo` package is now deprecated**. As a consequence, in the future, any changes to Ripple's repositories may require you to manually update your repos file.{% /admonition %} - - -## Migration on Ubuntu Linux - -Prior to version 1.3, the supported way to install `rippled` on Ubuntu Linux was using Alien to install the RPM package. Starting with `rippled` v1.3.1, Ripple provides a native package for Ubuntu and Debian Linux, which is the recommended way of installing it. If you already have the RPM package installed, complete the [installation steps](install-rippled-on-ubuntu.md) to upgrade the package and switch over to the native APT (`.deb`) package. - -If you have made any changes to your config files (`/opt/ripple/etc/rippled.cfg` and `/opt/ripple/etc/validators.txt`), `apt` may prompt you during installation asking if you want to overwrite your config files with the newest versions from the packages. Version 1.3 does not require any changes to the config file, so you can safely keep your existing config files unchanged. - -After installing the native APT package for 1.3, you need to reload/restart the service: - -1. Reload systemd unit files: - - ``` - $ sudo systemctl daemon-reload - ``` - -2. Restart the `rippled` service: - - ``` - $ sudo systemctl restart rippled.service - ``` - -If you no longer need Alien for any other packages, you may optionally uninstall it and its dependencies using the following steps: - -1. Uninstall Alien: - - ``` - $ sudo apt -y remove alien - ``` - -2. Uninstall unused dependencies: - - ``` - $ sudo apt -y autoremove - ``` - -### Automatic Updates - -The `rippled` v1.3 package includes an updated auto-update script that works on Ubuntu and Debian Linux. For more information, see [Update `rippled` Automatically on Linux](update-rippled-automatically-on-linux.md). - -## See Also - -- **[`rippled` v1.3.1 Release Notes](https://github.com/XRPLF/rippled/releases/1.3.1)** -- **Concepts:** - - [The `rippled` Server](../../concepts/networks-and-servers/index.md) - - [Consensus](../../concepts/consensus-protocol/index.md) -- **Tutorials:** - - [Update Automatically on Linux](update-rippled-automatically-on-linux.md) - - [Troubleshoot rippled](../troubleshooting/index.md) - - [Get Started with the rippled API](../../tutorials/http-websocket-apis/build-apps/get-started.md) -- **References:** - - [rippled API Reference](../../references/http-websocket-apis/index.md) - - [`rippled` Commandline Usage](../commandline-usage.md) - - [server_info method][] - -{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/infrastructure/installation/system-requirements.md b/docs/infrastructure/installation/system-requirements.md index b3a78c0d5d..ac94d8e046 100644 --- a/docs/infrastructure/installation/system-requirements.md +++ b/docs/infrastructure/installation/system-requirements.md @@ -1,16 +1,16 @@ --- -html: system-requirements.html -parent: install-rippled.html seo: - description: Hardware and software requirements for running rippled. + description: Hardware and software requirements for running rippled or Clio. labels: - Core Server --- # System Requirements +The following system requirements apply to both the core XRP Ledger server, `rippled`, and the Clio server for API access. + ## Recommended Specifications -For reliable performance in production environments, it is recommended to run an XRP Ledger (`rippled`) server on bare metal with the following characteristics or better: +For reliable performance in production environments, it is recommended to run a server on bare metal with the following characteristics or better: - Operating System: Ubuntu (LTS), Red Hat Enterprise Linux (latest release), or a compatible Linux distribution. - CPU: 3+ GHz 64-bit x86_64 processor with 8+ cores. @@ -28,6 +28,7 @@ For testing purposes, you can run an XRP Ledger server on commodity hardware wit - Operating System: macOS, Windows (64-bit), or most Linux distributions (Red Hat, Ubuntu, and Debian supported). - CPU: 64-bit x86_64, 4+ cores. + - For development purposes, is also possible to compile `rippled` for some Apple Silicon or ARM processors. See the [Build instructions](https://github.com/XRPLF/rippled/blob/develop/BUILD.md) for guidance. However, architectures other than x86_64 are not officially supported and are not recommended for production. - Disk: SSD / NVMe (10,000 IOPS sustained - not burst or peak - or better). Minimum 50 GB for the database partition. Do not use Amazon Elastic Block Store (AWS EBS) because its latency is too high to sync reliably. - RAM: 16 GB+. diff --git a/docs/infrastructure/installation/update-rippled-automatically-on-linux.md b/docs/infrastructure/installation/update-rippled-automatically-on-linux.md index 773391730a..4b54d09b4d 100644 --- a/docs/infrastructure/installation/update-rippled-automatically-on-linux.md +++ b/docs/infrastructure/installation/update-rippled-automatically-on-linux.md @@ -1,6 +1,4 @@ --- -html: update-rippled-automatically-on-linux.html -parent: install-rippled.html seo: description: Set up automatic updates for rippled on Linux. labels: @@ -9,13 +7,13 @@ labels: --- # Update Automatically on Linux -On Linux, you can set up `rippled` to automatically upgrade to the latest version with a one-time `cron` configuration. Ripple recommends enabling automatic updates if possible. +On Linux, you can set up `rippled` to automatically upgrade to the latest version with a one-time `cron` configuration. -These instructions assume you have already installed `rippled` [from the `yum` repository (CentOS/RedHat)](install-rippled-on-centos-rhel-with-yum.md) or [using `apt` (Ubuntu/Debian)](install-rippled-on-ubuntu.md). +These instructions assume you have already installed `rippled` from a package on [Red Hat Enterprise Linux](install-rippled-on-rhel.md), [Ubuntu Linux, or Debian Linux](install-rippled-on-ubuntu.md). To set up automatic updates, complete the following steps: -1. Check that `/opt/ripple/etc/update-rippled-cron` exists. If it does not, update manually ([CentOS/Red Hat](update-rippled-manually-on-centos-rhel.md) or [Ubuntu/Debian](update-rippled-manually-on-ubuntu.md)). +1. Check that `/opt/ripple/etc/update-rippled-cron` exists. If it does not, update manually ([Red Hat](update-rippled-manually-on-rhel.md) or [Ubuntu/Debian](update-rippled-manually-on-ubuntu.md)). 2. Create a symlink in your `cron.d` folder to the `/opt/ripple/etc/update-rippled-cron` config file: @@ -23,7 +21,7 @@ To set up automatic updates, complete the following steps: sudo ln -s /opt/ripple/etc/update-rippled-cron /etc/cron.d/ ``` - This configuration runs a script to update the installed `rippled` package within an hour of each new release. To avoid network instability from too many servers updating at the same time, this script does not automatically restart the server, so it continues to run the old version until it restarts. {% badge href="https://github.com/XRPLF/rippled/releases/tag/1.8.1" %}Updated in: rippled 1.8.1{% /badge %} + This configuration runs a script to update the installed `rippled` package within an hour of each new release. To avoid network instability from too many servers updating at the same time, this script does not automatically restart the server, so it continues to run the old version until it restarts. 3. **Whenever a new release comes out,** you must manually restart the `rippled` service to switch to the updated software. diff --git a/docs/infrastructure/installation/update-rippled-manually-on-centos-rhel.md b/docs/infrastructure/installation/update-rippled-manually-on-rhel.md similarity index 54% rename from docs/infrastructure/installation/update-rippled-manually-on-centos-rhel.md rename to docs/infrastructure/installation/update-rippled-manually-on-rhel.md index 3a561c04b0..700cc45399 100644 --- a/docs/infrastructure/installation/update-rippled-manually-on-centos-rhel.md +++ b/docs/infrastructure/installation/update-rippled-manually-on-rhel.md @@ -1,40 +1,24 @@ --- -html: update-rippled-manually-on-centos-rhel.html -parent: install-rippled.html seo: description: Manually update rippled on CentOS or Red Hat Enterprise Linux. labels: - Core Server - Security --- -# Update Manually on CentOS/Red Hat +# Update Manually on Red Hat Enterprise Linux -This page describes how to update manually to the latest release of `rippled` on CentOS or Red Hat Enterprise Linux. Ripple recommends setting up [automatic updates](update-rippled-automatically-on-linux.md) instead, where possible. +This page describes how to update manually to the latest release of `rippled` on Red Hat Enterprise Linux. You can also set up [automatic updates](update-rippled-automatically-on-linux.md). -These instructions assume you have already [installed `rippled` from the `yum` repository](install-rippled-on-centos-rhel-with-yum.md). +These instructions assume you have already [installed `rippled` on a supported version of Red Hat Enterprise Linux using Ripple's `rpm` package distribution](install-rippled-on-rhel.md). If you are upgrading from `rippled` 1.6.x or older, remove it and perform a fresh install instead. {% admonition type="success" name="Tip" %}To perform these steps all at once, you can run the `/opt/ripple/bin/update-rippled.sh` script, which is included with the `rippled` package. This script should be run as a `sudo` user.{% /admonition %} To update manually, complete the following steps: -1. If you are upgrading to `rippled` 1.7.0 from an earlier version, re-add the repository to get Ripple's updated GPG key. Otherwise, skip this step: - - ``` - $ cat << REPOFILE | sudo tee /etc/yum.repos.d/ripple.repo - [ripple-stable] - name=XRP Ledger Packages - enabled=1 - gpgcheck=0 - repo_gpgcheck=1 - baseurl=https://repos.ripple.com/repos/rippled-rpm/stable - gpgkey=https://repos.ripple.com/repos/rippled-rpm/stable/repodata/repomd.xml.key - REPOFILE - ``` - 1. Download and install the latest `rippled` package: ``` - $ sudo yum update rippled + sudo yum update rippled ``` This update procedure leaves your existing config files in place. @@ -42,13 +26,13 @@ To update manually, complete the following steps: 2. Reload the `systemd` unit files: ``` - $ sudo systemctl daemon-reload + sudo systemctl daemon-reload ``` 3. Restart the `rippled` service: ``` - $ sudo service rippled restart + sudo service rippled restart ``` @@ -58,7 +42,6 @@ To update manually, complete the following steps: - [The `rippled` Server](../../concepts/networks-and-servers/index.md) - [Consensus](../../concepts/consensus-protocol/index.md) - **Tutorials:** - - [`rippled` v1.3.x Migration Instructions](rippled-1-3-migration-instructions.md) - [Troubleshoot rippled](../troubleshooting/index.md) - **References:** - [rippled API Reference](../../references/http-websocket-apis/index.md) diff --git a/docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md b/docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md index d51a019743..b70a9c2fc6 100644 --- a/docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md +++ b/docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md @@ -1,6 +1,4 @@ --- -html: update-rippled-manually-on-ubuntu.html -parent: install-rippled.html seo: description: Manually update rippled on Ubuntu Linux. labels: @@ -9,18 +7,9 @@ labels: --- # Update Manually on Ubuntu or Debian -This page describes how to update manually to the latest release of `rippled` on Ubuntu Linux. These instructions assume you have already [installed `rippled` using the native package](install-rippled-on-ubuntu.md). Ripple recommends setting up [automatic updates](update-rippled-automatically-on-linux.md) instead, where possible. +This page describes how to update manually to the latest release of `rippled` on Ubuntu Linux. You can also up [automatic updates](update-rippled-automatically-on-linux.md). -{% admonition type="warning" name="Caution" %} -Ripple renewed the GPG key used to sign binary packages shortly before the release of v1.7.0. If you are upgrading from a version earlier than 1.7.0, you must first download and manually trust the updated public key as follows: - -``` -wget -q -O - "https://repos.ripple.com/repos/api/gpg/key/public" | \ - sudo apt-key add - -``` - -For more information, see the [`rippled` 1.7.0 release notes](https://xrpl.org/blog/2021/rippled-1.7.0.html#upgrading-special-action-required). -{% /admonition %} +These instructions assume you have already [installed `rippled` on a supported version of Ubuntu using Ripple's `deb` package](install-rippled-on-ubuntu.md). If you are upgrading from `rippled` 1.6.x or older, remove it and perform a fresh install instead. {% admonition type="success" name="Tip" %}To perform these steps all at once, you can run the `/opt/ripple/bin/update-rippled.sh` script, which is included with the `rippled` package and is compatible with Ubuntu and Debian. This script should be run as a `sudo` user.{% /admonition %} @@ -29,25 +18,25 @@ To update manually, complete the following steps: 1. Update repositories: ``` - $ sudo apt -y update + sudo apt -y update ``` 2. Upgrade the `rippled` package: ``` - $ sudo apt -y upgrade rippled + sudo apt -y upgrade rippled ``` 3. Reload the `systemd` unit files: ``` - $ sudo systemctl daemon-reload + sudo systemctl daemon-reload ``` 4. Restart the `rippled` service: ``` - $ sudo service rippled restart + sudo systemctl restart rippled ``` @@ -57,7 +46,6 @@ To update manually, complete the following steps: - [The `rippled` Server](../../concepts/networks-and-servers/index.md) - [Consensus](../../concepts/consensus-protocol/index.md) - **Tutorials:** - - [`rippled` v1.3.x Migration Instructions](rippled-1-3-migration-instructions.md) - [Troubleshoot rippled](../troubleshooting/index.md) - **References:** - [rippled API Reference](../../references/http-websocket-apis/index.md) diff --git a/docs/infrastructure/troubleshooting/diagnosing-problems.md b/docs/infrastructure/troubleshooting/diagnosing-problems.md index f03d8cd5ca..ba69a2b4ff 100644 --- a/docs/infrastructure/troubleshooting/diagnosing-problems.md +++ b/docs/infrastructure/troubleshooting/diagnosing-problems.md @@ -131,7 +131,7 @@ For a more thorough explanation of various types of log messages, see [Understan If you have problems diagnosing the problem, or you are unable to resolve the problem with any of the common fixes, you may want to ask for help in a support forum or the [GitHub issues](https://github.com/XRPLF/rippled/issues). When asking for help, you can use an info collection script to gather information about your system to help others diagnose the issue. -The official package installation (for [Ubuntu/Debian](../installation/install-rippled-on-ubuntu.md) or [CentOS/RedHat](../installation/install-rippled-on-centos-rhel-with-yum.md)) installs such a script by default, to `/opt/ripple/bin/getRippledInfo`. If you compiled `rippled` yourself, you can find the same script [in the `rippled` source code repository](https://github.com/XRPLF/rippled/blob/develop/bin/getRippledInfo). +The official package installation (for [Ubuntu/Debian](../installation/install-rippled-on-ubuntu.md) or [CentOS/RedHat](../installation/install-rippled-on-rhel.md)) installs such a script by default, to `/opt/ripple/bin/getRippledInfo`. If you compiled `rippled` yourself, you can find the same script [in the `rippled` source code repository](https://github.com/XRPLF/rippled/blob/develop/bin/getRippledInfo). To use the script: diff --git a/docs/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/logrotate.md b/docs/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/logrotate.md index a695559a7e..e61f870f6f 100644 --- a/docs/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/logrotate.md +++ b/docs/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/logrotate.md @@ -35,7 +35,7 @@ The following script is a sample that can be created as `/etc/logrotate.d/ripple You can configure parameters such as `minsize` and `rotate` depending on the amount of logs you keep. Use the `log_level` setting in your `rippled.cfg` file to configure how verbose your server's logs are. This sample script is based on standard `log_level` and stores approximately 2 weeks worth of logs in a compressed format. -The official packages [for CentOS/Red Hat](../../../../infrastructure/installation/install-rippled-on-centos-rhel-with-yum.md) and [Ubuntu or Debian](../../../../infrastructure/installation/install-rippled-on-ubuntu.md) provide the script `/etc/logrotate.d/rippled` by default. You can make modifications to this as required. Your modifications will not be overwritten on package upgrades. +The official packages [for CentOS/Red Hat](../../../../infrastructure/installation/install-rippled-on-rhel.md) and [Ubuntu or Debian](../../../../infrastructure/installation/install-rippled-on-ubuntu.md) provide the script `/etc/logrotate.d/rippled` by default. You can make modifications to this as required. Your modifications will not be overwritten on package upgrades. {% admonition type="info" name="Note" %}You should have only one system log rotation script per application. Please ensure that you do not have any other log rotation that handles the same directory.{% /admonition %} diff --git a/redirects.yaml b/redirects.yaml index c7ad335f04..f1ea4e3028 100644 --- a/redirects.yaml +++ b/redirects.yaml @@ -1,3 +1,12 @@ +/docs/infrastructure/installation/rippled-1-3-migration-instructions/: + to: /docs/infrastructure/installation/ + type: 301 +update-rippled-manually-on-centos-rhel/: + to: /docs/infrastructure/installation/update-rippled-manually-on-rhel/ + type: 301 +/docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum/: + to: /docs/infrastructure/installation/install-rippled-on-rhel/ + type: 301 /docs/concepts/xrpl-sidechains/price-oracles/: to: /docs/concepts/decentralized-storage/price-oracles/ type: 301 diff --git a/sidebars.yaml b/sidebars.yaml index d6acf43f65..5fb98a8c2e 100644 --- a/sidebars.yaml +++ b/sidebars.yaml @@ -629,16 +629,14 @@ expanded: false items: - page: docs/infrastructure/installation/system-requirements.md - - page: docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum.md + - page: docs/infrastructure/installation/install-rippled-on-rhel.md - page: docs/infrastructure/installation/install-rippled-on-ubuntu.md - page: docs/infrastructure/installation/install-clio-on-ubuntu.md - page: docs/infrastructure/installation/update-rippled-automatically-on-linux.md - - page: docs/infrastructure/installation/update-rippled-manually-on-centos-rhel.md + - page: docs/infrastructure/installation/update-rippled-manually-on-rhel.md - page: docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md - page: docs/infrastructure/installation/build-on-linux-mac-windows.md - - page: docs/infrastructure/installation/build-run-rippled-in-reporting-mode.md - page: docs/infrastructure/installation/capacity-planning.md - - page: docs/infrastructure/installation/rippled-1-3-migration-instructions.md - page: docs/infrastructure/configuration/index.md expanded: false items: From db03e57b2c359221e368b52a8ae6b769678d51bb Mon Sep 17 00:00:00 2001 From: tequ Date: Mon, 14 Jul 2025 10:37:25 +0900 Subject: [PATCH 04/16] [JA] update community page and top page --- @l10n/ja/translations.yaml | 18 ++++++++++++++---- community/index.page.tsx | 21 +++++++++++---------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/@l10n/ja/translations.yaml b/@l10n/ja/translations.yaml index f84d154ce6..ebe4fba991 100644 --- a/@l10n/ja/translations.yaml +++ b/@l10n/ja/translations.yaml @@ -178,10 +178,10 @@ Automated Market Makers: 自動マーケットメイカー Smart contracts to provide liquidity and earn passive income from facilitating currency exchange, complementary with the order-book DEX already built into the XRPL.: XRPLに組み込み済みのオーダーブックDEXと相互に補完する、流動性を提供し、通貨交換を促進することで受動的な収入を得るためのスマートコントラクト。 Enabled: 利用可能 Non-Fungible Tokens: 非代替性トークン -# Join the Community: XRPL.orgの -# at XRPL.org: コミュニティに参加 +"Join the Community ": XRPL.orgの +" at XRPL.org": コミュニティに参加 'Connect at XRPL.org, a community by and for the developers ': XRPL.orgは、XRPLを利用する開発者と -' and entrepeneurs who rely on the XRPL.': 起業家のためのコミュニティです。 +' and entrepreneurs who rely on the XRPL.': 起業家のためのコミュニティです。 Get Involved: 参加する # about/index.page.tsx @@ -571,7 +571,17 @@ Showcase your blockchain project, application, or product: あなたのブロッ Get featured on the Developer Reflections blog or Ecosystem page, and amplify your innovation within the blockchain community.: 開発者向けブログやエコシステムのページで紹介され、ブロックチェーンコミュニティ内でのイノベーションを広めましょう。 Submit Your Projects: プロジェクトを登録 # TODO: translate project-cards -View Projects: プロジェクトを見る +RippleX Bug Bounty Program: RippleXのバグ報奨金プログラム +community.index.security.subtitle-1: XRP Ledgerのセキュリティへの +community.index.security.subtitle-2: 貢献 +RippleX’s Bug Bounty, part of Ripple's 1 Billion XRP pledge, strengthens XRP Ledger security and supports its ecosystem.: RippleXのバグ報奨金は、Rippleの10億XRPの誓約の一環で、XRP Ledgerのセキュリティを強化し、そのエコシステムをサポートします。 +community.index.security.description-1: このプログラムを利用して RippleX/rippled のバグを報告してください。該当するバグの詳細なレポートを +community.index.security.description-2: 宛に送信し、 +community.index.security.description-3: 公開鍵 +community.index.security.description-4: を使用してください。 +Report a Scam: 詐欺の報告 +Report Scams to Safeguard Our Community: コミュニティの安全のため、詐欺情報を報告してください +In an evolving industry where trust and security are critical, scams continue to impede progress in crypto and blockchain. Help mitigate scammers by reporting scams.: 信頼とセキュリティが極めて重要な進化を続ける業界において、詐欺行為は暗号資産やブロックチェーン技術の発展を妨げ続けています。被害を軽減するため、詐欺行為の報告にご協力ください。 Contribute to Consensus: コンセンサスへの貢献 Run an XRP Ledger network node: XRP Ledgerのノードを実行する Thank you for your interest in contributing to XRP Ledger.: XRP Ledgerへの貢献に興味がありますか? diff --git a/community/index.page.tsx b/community/index.page.tsx index 0589c5a6e5..f364d32306 100644 --- a/community/index.page.tsx +++ b/community/index.page.tsx @@ -828,11 +828,9 @@ const CommunityPage: React.FC = () => { {translate("RippleX Bug Bounty Program")}
- {translate( - "Contribute to the XRP Ledger's" - )} + {translate("community.index.security.subtitle-1", "Contribute to the XRP Ledger's")}
- Security + {translate("community.index.security.subtitle-2", "Security")}

{translate( @@ -840,13 +838,16 @@ const CommunityPage: React.FC = () => { )}

{ - translate("Use this program to report bugs in RippleX/rippled. Send a detailed report of a qualifying bug to ") + translate("community.index.security.description-1", "Use this program to report bugs in RippleX/rippled. Send a detailed report of a qualifying bug to ") + } + bugs@ripple.com + { + translate("community.index.security.description-2", " and use the ") + } + {translate("community.index.security.description-3", "Public Key.")} + { + translate("community.index.security.description-4", " ") } - bugs@ripple.com - { - translate(" and use the ") - } - Public Key.

From 0b589610ae6c88629b9bc1d732734b49f8076b56 Mon Sep 17 00:00:00 2001 From: mDuo13 Date: Mon, 14 Jul 2025 13:59:42 -0700 Subject: [PATCH 05/16] Add missing accepted credentials object snippet --- .../_snippets/accepted-credentials-objects.md | 22 +++++++++++++++++ .../ledger-entry-types/permissioneddomain.md | 24 +------------------ .../types/permissioneddomainset.md | 2 ++ 3 files changed, 25 insertions(+), 23 deletions(-) create mode 100644 docs/_snippets/accepted-credentials-objects.md diff --git a/docs/_snippets/accepted-credentials-objects.md b/docs/_snippets/accepted-credentials-objects.md new file mode 100644 index 0000000000..1d0ee86002 --- /dev/null +++ b/docs/_snippets/accepted-credentials-objects.md @@ -0,0 +1,22 @@ +Each member of the `AcceptedCredentials` array is an inner object named `Credential` with the following nested fields: + +| Field | JSON Type | [Internal Type][] | Required? | Description | +|:-----------------|:---------------------|:------------------|:----------|--------------| +| `Issuer` | String - [Address][] | AccountID | Yes | The issuer of the credential. | +| `CredentialType` | String | Blob | Yes | The type of credential, as hexadecimal. This is an arbitrary value from 1 to 64 bytes that the issuer sets when they issue a credential. | + +{% admonition type="info" name="Note" %} +In the usual JSON format, inner objects are wrapped in an object with one field, whose name defines the inner object type. In this case, the wrapping field is named `Credential`. For example: + +```json +"AcceptedCredentials": [ + { + "Credential": { + "Issuer": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX", + "CredentialType": "6D795F63726564656E7469616C" + } + }, + // ... additional Credential inner objects ... +] +``` +{% /admonition %} diff --git a/docs/references/protocol/ledger-data/ledger-entry-types/permissioneddomain.md b/docs/references/protocol/ledger-data/ledger-entry-types/permissioneddomain.md index b28a05ef21..8d5542d111 100644 --- a/docs/references/protocol/ledger-data/ledger-entry-types/permissioneddomain.md +++ b/docs/references/protocol/ledger-data/ledger-entry-types/permissioneddomain.md @@ -52,31 +52,9 @@ In addition to the [common fields](../common-fields.md), {% code-page-name /%} e | `PreviousTxnLgrSeq` | Number | UInt32 | Yes | The [index of the ledger][Ledger Index] that contains the transaction that most recently modified this object. | | `Sequence` | Number | UInt32 | Yes | The `Sequence` value of the transaction that created this entry. | - ### AcceptedCredentials Objects -Each member of the `AcceptedCredentials` array is an inner object named `Credential` with the following nested fields: - -| Field | JSON Type | [Internal Type][] | Required? | Description | -|:-----------------|:---------------------|:------------------|:----------|--------------| -| `Issuer` | String - [Address][] | AccountID | Yes | The issuer of the credential. | -| `CredentialType` | String | Blob | Yes | The type of credential, as hexadecimal. This is an arbitrary value from 1 to 64 bytes that the issuer sets when they issue a credential. | - -{% admonition type="info" name="Note" %} -In the usual JSON format, inner objects are wrapped in an object with one field, whose name defines the inner object type. In this case, the wrapping field is named `Credential`. For example: - -```json -"AcceptedCredentials": [ - { - "Credential": { - "Issuer": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX", - "CredentialType": "6D795F63726564656E7469616C" - } - }, - // ... additional Credential inner objects ... -] -``` -{% /admonition %} +{% raw-partial file="/docs/_snippets/accepted-credentials-objects.md" /%} ## {% $frontmatter.seo.title %} Flags diff --git a/docs/references/protocol/transactions/types/permissioneddomainset.md b/docs/references/protocol/transactions/types/permissioneddomainset.md index 690dc3e474..050e5c2a0d 100644 --- a/docs/references/protocol/transactions/types/permissioneddomainset.md +++ b/docs/references/protocol/transactions/types/permissioneddomainset.md @@ -40,6 +40,8 @@ _(Requires the [PermissionedDomains amendment][] {% not-enabled /%})_ | `DomainID` | String - [Hash][] | Hash256 | No | The ledger entry ID of an existing permissioned domain to modify. If omitted, creates a new permissioned domain. | | `AcceptedCredentials` | Array | Array | Yes | A list of 1 to 10 [**Accepted Credentials objects**](#accepted-credentials-objects) that grant access to this domain. The list does not need to be sorted, but it cannot contain duplicates. When modifying an existing domain, this list replaces the existing list. | +### AcceptedCredentials Objects + {% raw-partial file="/docs/_snippets/accepted-credentials-objects.md" /%} ## {% $frontmatter.seo.title %} Flags From e1a292ade1d403e20c632f318ecbce289aea01eb Mon Sep 17 00:00:00 2001 From: mDuo13 Date: Mon, 14 Jul 2025 14:00:51 -0700 Subject: [PATCH 06/16] Fix install/update redirects and add redirects for Japanese too --- redirects.yaml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/redirects.yaml b/redirects.yaml index f1ea4e3028..018d10ead0 100644 --- a/redirects.yaml +++ b/redirects.yaml @@ -1,7 +1,7 @@ /docs/infrastructure/installation/rippled-1-3-migration-instructions/: to: /docs/infrastructure/installation/ type: 301 -update-rippled-manually-on-centos-rhel/: +/docs/infrastructure/installation/update-rippled-manually-on-centos-rhel/: to: /docs/infrastructure/installation/update-rippled-manually-on-rhel/ type: 301 /docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum/: @@ -1445,7 +1445,7 @@ system-requirements.html: to: /docs/infrastructure/installation/system-requirements type: 301 install-rippled-on-centos-rhel-with-yum.html: - to: /docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum + to: /docs/infrastructure/installation/install-rippled-on-rhel type: 301 install-rippled-on-ubuntu.html: to: /docs/infrastructure/installation/install-rippled-on-ubuntu @@ -1457,7 +1457,7 @@ update-rippled-automatically-on-linux.html: to: /docs/infrastructure/installation/update-rippled-automatically-on-linux type: 301 update-rippled-manually-on-centos-rhel.html: - to: /docs/infrastructure/installation/update-rippled-manually-on-centos-rhel + to: /docs/infrastructure/installation/update-rippled-manually-on-rhel type: 301 update-rippled-manually-on-ubuntu.html: to: /docs/infrastructure/installation/update-rippled-manually-on-ubuntu @@ -2335,6 +2335,15 @@ code_of_conduct.ja: type: 301 # Japanese +/ja/docs/infrastructure/installation/rippled-1-3-migration-instructions/: + to: /ja/docs/infrastructure/installation/ + type: 301 +/ja/docs/infrastructure/installation/update-rippled-manually-on-centos-rhel/: + to: /ja/docs/infrastructure/installation/update-rippled-manually-on-rhel/ + type: 301 +/ja/docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum/: + to: /ja/docs/infrastructure/installation/install-rippled-on-rhel/ + type: 301 /ja/docs/tutorials/javascript/trade-on-ledger/earn-passive-income-as-a-liquidity-provider: to: /ja/docs/tutorials/javascript/amm/add-assets-to-amm type: 301 @@ -3764,7 +3773,7 @@ code_of_conduct.ja: to: /ja/docs/infrastructure/installation/system-requirements type: 301 /ja/install-rippled-on-centos-rhel-with-yum.html: - to: /ja/docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum + to: /ja/docs/infrastructure/installation/install-rippled-on-rhel type: 301 /ja/install-rippled-on-ubuntu.html: to: /ja/docs/infrastructure/installation/install-rippled-on-ubuntu From d564619d7ee5223f68d2a5bb7a64a01d938e3483 Mon Sep 17 00:00:00 2001 From: Maria Shodunke Date: Wed, 16 Jul 2025 09:55:13 +0100 Subject: [PATCH 07/16] Apply suggestions from code review Co-authored-by: Rome Reginelli --- _code-samples/claim-payment-channel/py/claim_pay_channel.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_code-samples/claim-payment-channel/py/claim_pay_channel.py b/_code-samples/claim-payment-channel/py/claim_pay_channel.py index 6c51eed203..310e9e2f1b 100644 --- a/_code-samples/claim-payment-channel/py/claim_pay_channel.py +++ b/_code-samples/claim-payment-channel/py/claim_pay_channel.py @@ -1,6 +1,6 @@ """ Create, claim and verify a Payment Channel. -Reference: https://xrpl.org/paychannel.html +Reference: https://xrpl.org/docs/references/protocol/ledger-data/ledger-entry-types/paychannel """ from xrpl.clients import JsonRpcClient from xrpl.models import ( @@ -18,6 +18,7 @@ from xrpl.account import get_balance client = JsonRpcClient("https://s.altnet.rippletest.net:51234") # Creating wallets as prerequisite +print("Setting up wallets...") wallet1 = generate_faucet_wallet(client) wallet2 = generate_faucet_wallet(client) From 1cc8a4b3c060f8077e478cd08b14196f61512cbf Mon Sep 17 00:00:00 2001 From: Maria Shodunke Date: Thu, 17 Jul 2025 12:33:48 +0100 Subject: [PATCH 08/16] Update with review comments --- .../js/claimPayChannel.ts | 2 +- .../py/claim_pay_channel.py | 17 ++-- _code-samples/escrow/js/create-escrow.js | 2 +- _code-samples/escrow/js/finish-escrow.js | 6 +- _code-samples/escrow/py/create_escrow.py | 2 +- _code-samples/escrow/py/finish_escrow.py | 4 +- docs/_snippets/wait-for-validation.md | 2 - .../disable-master-key-pair.md | 2 +- .../set-up-multi-signing.md | 2 +- .../use-escrows/cancel-an-expired-escrow.md | 2 +- .../send-a-conditionally-held-escrow.md | 4 +- .../use-escrows/send-a-time-held-escrow.md | 88 ++----------------- 12 files changed, 29 insertions(+), 104 deletions(-) diff --git a/_code-samples/claim-payment-channel/js/claimPayChannel.ts b/_code-samples/claim-payment-channel/js/claimPayChannel.ts index 9fba2216f2..15f7763b29 100644 --- a/_code-samples/claim-payment-channel/js/claimPayChannel.ts +++ b/_code-samples/claim-payment-channel/js/claimPayChannel.ts @@ -1,6 +1,6 @@ /* * Create, claim and verify a Payment Channel. - * Reference: https://xrpl.org/paychannel.html + * Reference: https://xrpl.org/docs/references/protocol/ledger-data/ledger-entry-types/paychannel */ import { AccountObjectsRequest, diff --git a/_code-samples/claim-payment-channel/py/claim_pay_channel.py b/_code-samples/claim-payment-channel/py/claim_pay_channel.py index 310e9e2f1b..e802c194f8 100644 --- a/_code-samples/claim-payment-channel/py/claim_pay_channel.py +++ b/_code-samples/claim-payment-channel/py/claim_pay_channel.py @@ -35,7 +35,7 @@ payment_channel_create = PaymentChannelCreate( public_key=wallet1.public_key, ) -print("Submitting a PaymentChannelCreate transaction...") +print("\nSubmitting a PaymentChannelCreate transaction...") payment_channel_response = submit_and_wait( payment_channel_create, client, @@ -53,15 +53,16 @@ account_objects = account_objects_response.result["account_objects"] # Find the PayChannel object to get the correct channel ID channel_id = None -for obj in account_objects: - if obj["LedgerEntryType"] == "PayChannel": - channel_id = obj["index"] - break +if 'meta' in payment_channel_response.result and 'AffectedNodes' in payment_channel_response.result['meta']: + for node in payment_channel_response.result["meta"]["AffectedNodes"]: + if 'CreatedNode' in node and node["CreatedNode"]["LedgerEntryType"] == 'PayChannel': + channel_id = node['CreatedNode']['LedgerIndex'] + break if not channel_id: - raise Exception("PayChannel not found in account objects") + raise Exception("Payment Channel ID not found in the response.") -print(f"PayChannel ID: {channel_id}") +print(f"Payment Channel ID: {channel_id}") # Destination claims the Payment Channel and we see the balances to verify. payment_channel_claim = PaymentChannelClaim( @@ -70,7 +71,7 @@ payment_channel_claim = PaymentChannelClaim( amount="100", ) -print("Submitting a PaymentChannelClaim transaction...") +print("\nSubmitting a PaymentChannelClaim transaction...") channel_claim_response = submit_and_wait( payment_channel_claim, client, diff --git a/_code-samples/escrow/js/create-escrow.js b/_code-samples/escrow/js/create-escrow.js index 9f48213565..6d557475b6 100644 --- a/_code-samples/escrow/js/create-escrow.js +++ b/_code-samples/escrow/js/create-escrow.js @@ -44,7 +44,7 @@ async function main() { "Destination": wallet.address, "Amount": "6000000", //drops XRP "DestinationTag": 2023, - "Condition": conditionHex, + "Condition": conditionHex, // Omit this for time-held escrows "Fee": "12", "FinishAfter": xrpl.isoTimeToRippleTime(finishAfter.toISOString()), }; diff --git a/_code-samples/escrow/js/finish-escrow.js b/_code-samples/escrow/js/finish-escrow.js index 71f1dabe1b..879aedbf0d 100644 --- a/_code-samples/escrow/js/finish-escrow.js +++ b/_code-samples/escrow/js/finish-escrow.js @@ -35,9 +35,11 @@ const main = async () => { "Owner": wallet.address, // This should equal the sequence number of the escrow transaction "OfferSequence": offerSequence, - // Crypto condition that must be met before escrow can be completed, passed on escrow creation + // Crypto condition that must be met before escrow can be completed, passed on escrow creation. + // Omit this for time-held escrows. "Condition": condition, - // Fulfillment of the condition, passed on escrow creation + // Fulfillment of the condition, passed on escrow creation. + // Omit this for time-held escrows. "Fulfillment": fulfillment, }; diff --git a/_code-samples/escrow/py/create_escrow.py b/_code-samples/escrow/py/create_escrow.py index 9ea2512347..ecd75df9a2 100644 --- a/_code-samples/escrow/py/create_escrow.py +++ b/_code-samples/escrow/py/create_escrow.py @@ -34,7 +34,7 @@ create_txn = EscrowCreate( destination=receiver_addr, finish_after=claim_date, cancel_after=expiry_date, - condition=condition + condition=condition # Omit this for time-held escrows ) # Autofill, sign, then submit transaction and wait for result diff --git a/_code-samples/escrow/py/finish_escrow.py b/_code-samples/escrow/py/finish_escrow.py index a8c0b7821d..f4d58a3f11 100644 --- a/_code-samples/escrow/py/finish_escrow.py +++ b/_code-samples/escrow/py/finish_escrow.py @@ -29,8 +29,8 @@ finish_txn = EscrowFinish( account=sender_wallet.address, owner=escrow_creator, offer_sequence=escrow_sequence, # The sequence number of the escrow transaction - condition=condition, - fulfillment=fulfillment + condition=condition, # Omit this for time-held escrows + fulfillment=fulfillment # Omit this for time-held escrows ) # Autofill, sign, then submit transaction and wait for result diff --git a/docs/_snippets/wait-for-validation.md b/docs/_snippets/wait-for-validation.md index f385e9fd01..d020db203d 100644 --- a/docs/_snippets/wait-for-validation.md +++ b/docs/_snippets/wait-for-validation.md @@ -1,5 +1,3 @@ On a live network (including Mainnet, Testnet, or Devnet), you can wait 4-7 seconds for the ledger to close automatically. If you're running `rippled` in stand-alone mode, use the [ledger_accept method][] to manually close the ledger. - -{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/tutorials/how-tos/manage-account-settings/disable-master-key-pair.md b/docs/tutorials/how-tos/manage-account-settings/disable-master-key-pair.md index b3f8cb3204..e400be100a 100644 --- a/docs/tutorials/how-tos/manage-account-settings/disable-master-key-pair.md +++ b/docs/tutorials/how-tos/manage-account-settings/disable-master-key-pair.md @@ -308,7 +308,7 @@ If the transaction fails with the result `tecNO_ALTERNATIVE_KEY`, your account d ### 4. Wait for validation -{% partial file="/docs/_snippets/wait-for-validation.md" /%} +{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%} ### 5. Confirm Account Flags diff --git a/docs/tutorials/how-tos/manage-account-settings/set-up-multi-signing.md b/docs/tutorials/how-tos/manage-account-settings/set-up-multi-signing.md index 5bbfc29111..bafa6aa94b 100644 --- a/docs/tutorials/how-tos/manage-account-settings/set-up-multi-signing.md +++ b/docs/tutorials/how-tos/manage-account-settings/set-up-multi-signing.md @@ -160,7 +160,7 @@ Make sure that the [Transaction Result](../../../references/protocol/transaction ## 4. Wait for validation -{% partial file="/docs/_snippets/wait-for-validation.md" /%} +{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%} ## 5. Confirm the new signer list diff --git a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md index c1adf3d566..9b11580aa0 100644 --- a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md +++ b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md @@ -91,7 +91,7 @@ Take note of the transaction's identifying `hash` value so you can check its fin ## 4. Wait for validation -{% partial file="/docs/_snippets/wait-for-validation.md" /%} +{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%} ## 5. Confirm final result diff --git a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md index 93f39ba2a9..f2dad19faa 100644 --- a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md +++ b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md @@ -118,7 +118,7 @@ Response: ## 4. Wait for validation -{% partial file="/docs/_snippets/wait-for-validation.md" /%} +{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%} ## 5. Confirm that the escrow was created @@ -178,7 +178,7 @@ Take note of the transaction's identifying `hash` value so you can check its fin ## 7. Wait for validation -{% partial file="/docs/_snippets/wait-for-validation.md" /%} +{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%} ## 8. Confirm final result diff --git a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md index 2cb08fec91..418f399fa7 100644 --- a/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md +++ b/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md @@ -58,54 +58,11 @@ Response: {% /tab %} {% tab label="Javascript" %} -```js -// Prepare EscrowCreate transaction ------------------------------------ -const escrowCreateTransaction = { - "TransactionType": "EscrowCreate", - "Account": wallet.address, - "Destination": wallet.address, - "Amount": "6000000", //drops XRP - "DestinationTag": 2023, - "Fee": "12", - "FinishAfter": xrpl.isoTimeToRippleTime(finishAfter.toISOString()), -}; - -xrpl.validate(escrowCreateTransaction); - -// Sign and submit the transaction ---------------------------------------- -console.log('Signing and submitting the transaction:', - JSON.stringify(escrowCreateTransaction, null, "\t"), "\n" -); -const response = await client.submitAndWait(escrowCreateTransaction, { wallet }); -console.log(`Sequence number: ${response.result.tx_json.Sequence}`); -console.log(`Finished submitting! ${JSON.stringify(response.result, null, "\t")}`); -``` +{% code-snippet file="/_code-samples/escrow/js/create-escrow.js" language="js" from="// Prepare EscrowCreate" before="await client.disconnect" /%} {% /tab %} {% tab label="Python" %} -```python -# Build escrow create transaction -create_txn = EscrowCreate( - account=sender_wallet.address, - amount=xrp_to_drops(10.000), - destination=receiver_addr, - finish_after=claim_date -) - -# Autofill, sign, then submit transaction and wait for result -stxn_response = submit_and_wait(create_txn, client, sender_wallet) - -# Return result of transaction -stxn_result = stxn_response.result - - -# Parse result and print out the neccesary info -print(stxn_result["tx_json"]["Account"]) -print(stxn_result["tx_json"]["Sequence"]) - -print(stxn_result["meta"]["TransactionResult"]) -print(stxn_result["hash"]) -``` +{% code-snippet file="/_code-samples/escrow/py/create_escrow.py" language="py" from="# Build escrow create" /%} {% /tab %} {% /tabs %} @@ -114,7 +71,7 @@ Take note of the transaction's identifying `hash` value so you can check its fin ## 3. Wait for validation -{% partial file="/docs/_snippets/wait-for-validation.md" /%} +{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%} ## 4. Confirm that the escrow was created @@ -191,44 +148,11 @@ Response: {% /tab %} {% tab label="Javascript" %} -```js -// Prepare EscrowFinish transaction --------------------------------- -const escrowFinishTransaction = { - "Account": wallet.address, - "TransactionType": "EscrowFinish", - "Owner": wallet.address, - // This should equal the sequence number of the escrow transaction - "OfferSequence": offerSequence, -}; - -xrpl.validate(escrowFinishTransaction); - -// Sign and submit the transaction ---------------------------------------- -console.log('Signing and submitting the transaction:', JSON.stringify(escrowFinishTransaction, null, "\t")); -const response = await client.submitAndWait(escrowFinishTransaction, { wallet }); -console.log(`Finished submitting! ${JSON.stringify(response.result, null, "\t")}`); -``` +{% code-snippet file="/_code-samples/escrow/js/finish-escrow.js" language="js" from="// Prepare EscrowFinish" before="await client.disconnect" /%} {% /tab %} {% tab label="Python" %} -```python -# Build escrow finish transaction -finish_txn = EscrowFinish( - account=sender_wallet.address, - owner=escrow_creator, - offer_sequence=escrow_sequence, # The sequence number of the escrow transaction -) - -# Autofill, sign, then submit transaction and wait for result -stxn_response = submit_and_wait(finish_txn, client, sender_wallet) - -# Parse response and return result -stxn_result = stxn_response.result - -# Parse result and print out the transaction result and transaction hash -print(stxn_result["meta"]["TransactionResult"]) -print(stxn_result["hash"]) -``` +{% code-snippet file="/_code-samples/escrow/py/finish_escrow.py" language="py" from="# Build escrow finish" /%} {% /tab %} {% /tabs %} @@ -237,7 +161,7 @@ Take note of the transaction's identifying `hash` value so you can check its fin ## 7. Wait for validation -{% partial file="/docs/_snippets/wait-for-validation.md" /%} +{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%} ## 8. Confirm final result From 0aee6fdc3385179125f8e3b56fb7d9d9df4e59dd Mon Sep 17 00:00:00 2001 From: Rome Reginelli Date: Thu, 17 Jul 2025 13:59:27 -0700 Subject: [PATCH 09/16] Update clustering concept Fix #832 --- docs/concepts/networks-and-servers/clustering.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/concepts/networks-and-servers/clustering.md b/docs/concepts/networks-and-servers/clustering.md index a87baed06a..6bc8708087 100644 --- a/docs/concepts/networks-and-servers/clustering.md +++ b/docs/concepts/networks-and-servers/clustering.md @@ -1,6 +1,4 @@ --- -html: clustering.html -parent: networks-and-servers.html seo: description: Run rippled servers in a cluster to share the load of cryptography between them. labels: @@ -8,13 +6,13 @@ labels: --- # Clustering -If you are running multiple `rippled` servers in a single datacenter, you can configure those servers into a cluster to maximize efficiency. Running your `rippled` servers in a cluster provides the following benefits: +Clustering is a configuration operation for `rippled` servers that improves efficiency among mutually trusted servers. Clustering should only be used for servers that are located within the same datacenter and are operated by the same organization. Clustering provides the following benefits: -- Clustered `rippled` servers share the work of cryptography. If one server has verified the authenticity of a message, the other servers in the cluster trust it and do not re-verify. +- Clustered servers share the work of cryptography. If one server has verified the authenticity of a message, the other servers in the cluster trust it and do not re-verify. - Clustered servers share information about peers and API clients that are misbehaving or abusing the network. This makes it harder to attack all servers of the cluster at once. - Clustered servers always propagate transactions throughout the cluster, even if the transaction does not meet the current load-based transaction fee on some of them. -If you are running a validator as a [private peer](peer-protocol.md#private-peers), Ripple recommends using a cluster of `rippled` servers as proxy servers. +If you are running a validator as a [private peer](peer-protocol.md#private-peers), it's recommended to run a cluster of servers as proxies, since a cluster is more resilient to failure than individual servers. ## See Also From 20ef3a4edd4e772dcdf28059fd29f0d6e95a68ef Mon Sep 17 00:00:00 2001 From: Rome Reginelli Date: Thu, 17 Jul 2025 14:02:53 -0700 Subject: [PATCH 10/16] Fix typo on consensus structure page Fix #833 --- docs/concepts/consensus-protocol/consensus-structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/concepts/consensus-protocol/consensus-structure.md b/docs/concepts/consensus-protocol/consensus-structure.md index 790f235b91..e631218447 100644 --- a/docs/concepts/consensus-protocol/consensus-structure.md +++ b/docs/concepts/consensus-protocol/consensus-structure.md @@ -129,7 +129,7 @@ _Figure 7: An XRP Ledger Server Calculates a Ledger Validation — Each server a Validators each relay their results in the form of a signed message containing the hash of the ledger version they calculated. These messages, called _validations_, allow each server to compare the ledger it computed with those of its peers. -[{% inline-svg file="/docs/img/consensus-declare-validation.svg" /%}](/docs/img/consensus-declare-validation.svg "Figure 8: Ledger is Validated When Supermajority of Peers Calculate the Same Result Result") +[{% inline-svg file="/docs/img/consensus-declare-validation.svg" /%}](/docs/img/consensus-declare-validation.svg "Figure 8: Ledger is Validated When Supermajority of Trusted Validators Calculate the Same Result Result") _Figure 8: Ledger is Validated When Supermajority of Peers Calculate the Same Result — Each server compares its calculated ledger with the hashes received from its chosen validators. If not in agreement, the server must recalculate or retrieve the correct ledger._ From c74450f5fb270f99770275908e3184170b4ec21b Mon Sep 17 00:00:00 2001 From: Rome Reginelli Date: Thu, 17 Jul 2025 15:07:37 -0700 Subject: [PATCH 11/16] Apply suggestions from review Co-authored-by: Maria Shodunke --- docs/infrastructure/installation/system-requirements.md | 2 +- .../installation/update-rippled-manually-on-ubuntu.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/infrastructure/installation/system-requirements.md b/docs/infrastructure/installation/system-requirements.md index ac94d8e046..27a89826f5 100644 --- a/docs/infrastructure/installation/system-requirements.md +++ b/docs/infrastructure/installation/system-requirements.md @@ -28,7 +28,7 @@ For testing purposes, you can run an XRP Ledger server on commodity hardware wit - Operating System: macOS, Windows (64-bit), or most Linux distributions (Red Hat, Ubuntu, and Debian supported). - CPU: 64-bit x86_64, 4+ cores. - - For development purposes, is also possible to compile `rippled` for some Apple Silicon or ARM processors. See the [Build instructions](https://github.com/XRPLF/rippled/blob/develop/BUILD.md) for guidance. However, architectures other than x86_64 are not officially supported and are not recommended for production. + - For development purposes, it is also possible to compile `rippled` for some Apple Silicon or ARM processors. See the [Build instructions](https://github.com/XRPLF/rippled/blob/develop/BUILD.md) for guidance. However, architectures other than x86_64 are not officially supported and are not recommended for production. - Disk: SSD / NVMe (10,000 IOPS sustained - not burst or peak - or better). Minimum 50 GB for the database partition. Do not use Amazon Elastic Block Store (AWS EBS) because its latency is too high to sync reliably. - RAM: 16 GB+. diff --git a/docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md b/docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md index b70a9c2fc6..e9ec1af9fb 100644 --- a/docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md +++ b/docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md @@ -7,7 +7,7 @@ labels: --- # Update Manually on Ubuntu or Debian -This page describes how to update manually to the latest release of `rippled` on Ubuntu Linux. You can also up [automatic updates](update-rippled-automatically-on-linux.md). +This page describes how to manually update to the latest release of `rippled` on Ubuntu Linux. You can also set up [automatic updates](update-rippled-automatically-on-linux.md). These instructions assume you have already [installed `rippled` on a supported version of Ubuntu using Ripple's `deb` package](install-rippled-on-ubuntu.md). If you are upgrading from `rippled` 1.6.x or older, remove it and perform a fresh install instead. From b21252f4994a17eb93c49be8c45455445a87554f Mon Sep 17 00:00:00 2001 From: tequ Date: Fri, 18 Jul 2025 22:53:57 +0900 Subject: [PATCH 12/16] Fix DevTool links to use Link component --- index.page.tsx | 2 +- resources/dev-tools/index.page.tsx | 19 ++++++++++--------- sidebars.yaml | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/index.page.tsx b/index.page.tsx index 2add1e04e2..001ff11d2c 100644 --- a/index.page.tsx +++ b/index.page.tsx @@ -24,7 +24,7 @@ const cards = [ id: 'low-cost', title: 'Low Cost', description: <> - At fractions of a penny per transaction, costs are inexpensive enough to enable a wide variety of blockchain use cases + At fractions of a penny per transaction, costs are inexpensive enough to enable a wide variety of blockchain use cases }, { diff --git a/resources/dev-tools/index.page.tsx b/resources/dev-tools/index.page.tsx index f536661b3c..6c0b096d1d 100644 --- a/resources/dev-tools/index.page.tsx +++ b/resources/dev-tools/index.page.tsx @@ -1,5 +1,6 @@ import * as React from "react"; import { useThemeHooks } from '@redocly/theme/core/hooks'; +import { Link } from "@redocly/theme/components/Link/Link"; export const frontmatter = { seo: { @@ -192,9 +193,9 @@ export default function DevTools() {

{translate("Explorers")}

{explorers_tools.map((card) => ( - {translate(card.description)}

 
-
+ ))}
@@ -221,9 +222,9 @@ export default function DevTools() {

{translate("API Access")}

{api_access_tools.map((card) => ( - {translate(card.description)}

 
-
+ ))} @@ -251,9 +252,9 @@ export default function DevTools() {

{translate("Other")}

{other.map((card) => ( - {translate(card.description)}

 
-
+ ))} diff --git a/sidebars.yaml b/sidebars.yaml index d6acf43f65..fe018515fc 100644 --- a/sidebars.yaml +++ b/sidebars.yaml @@ -699,7 +699,7 @@ labelTranslationKey: sidebar.resources.codesamples page: resources/code-samples.page.tsx - group: Dev Tools - labelTranslationKey: sidebar.resources.dev-tools + groupTranslationKey: sidebar.resources.dev-tools page: resources/dev-tools/index.page.tsx expanded: false items: From 9d45d8564104d16089fd415cdd437e316f071604 Mon Sep 17 00:00:00 2001 From: akcodez Date: Mon, 21 Jul 2025 09:17:29 -0700 Subject: [PATCH 13/16] add proper link for gemwallet --- about/xrp.page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/about/xrp.page.tsx b/about/xrp.page.tsx index dca92d84c9..ae50852e11 100644 --- a/about/xrp.page.tsx +++ b/about/xrp.page.tsx @@ -27,7 +27,7 @@ const softwallets = [ alt: "Gatehub", imgclasses: "invertible-img", }, - { href: "https://gemwallet.com/", id: "wallet-gem", alt: "Gem Wallet" }, + { href: "https://gemwallet.app/", id: "wallet-gem", alt: "Gem Wallet" }, { href: "https://coin.space/", id: "wallet-coin", alt: "Coin Space" }, { href: "https://crossmark.io/", id: "wallet-crossmark", alt: "Crossmark Wallet" }, ]; From fda88826ea5bf5b4a12cd45c16e920c069906a97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 16:51:03 +0000 Subject: [PATCH 14/16] Bump axios from 1.10.0 to 1.11.0 Bumps [axios](https://github.com/axios/axios) from 1.10.0 to 1.11.0. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.10.0...v1.11.0) --- updated-dependencies: - dependency-name: axios dependency-version: 1.11.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a95856d2e..c93596e5f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3228,20 +3228,20 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "node_modules/axios/node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", From 0c45223a1c8b716edbe71338b4dd6c26d450b44c Mon Sep 17 00:00:00 2001 From: Rome Reginelli Date: Wed, 23 Jul 2025 13:22:56 -0700 Subject: [PATCH 15/16] Fix unparsed ref link to Object in Binary reference --- docs/references/protocol/binary-format.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/protocol/binary-format.md b/docs/references/protocol/binary-format.md index 6efb50805c..4381f16fb3 100644 --- a/docs/references/protocol/binary-format.md +++ b/docs/references/protocol/binary-format.md @@ -338,7 +338,7 @@ Some fields specify a _type_ of asset, which could be XRP or a fungible [token]( ### Object Fields -[STObject]: #object-fields +[Object]: #object-fields Some fields, such as `SignerEntry` (in [SignerListSet transactions][]), and `Memo` (in `Memos` arrays) are objects (called the "STObject" type). The serialization of objects is very similar to that of arrays, with one difference: **object members must be placed in canonical order** within the object field, where array fields have an explicit order already. From 6ab4c2991665a706b114f4b5fe36b8d936044584 Mon Sep 17 00:00:00 2001 From: amarantha-k Date: Wed, 23 Jul 2025 15:12:20 -0700 Subject: [PATCH 16/16] Add blog with Frii Pay case study --- ...xrpl-case-study-crypto-payment-solution.md | 79 +++++++++++++++++++ blog/sidebars.yaml | 1 + 2 files changed, 80 insertions(+) create mode 100644 blog/2025/frii-pay-xrpl-case-study-crypto-payment-solution.md diff --git a/blog/2025/frii-pay-xrpl-case-study-crypto-payment-solution.md b/blog/2025/frii-pay-xrpl-case-study-crypto-payment-solution.md new file mode 100644 index 0000000000..cece50f5dc --- /dev/null +++ b/blog/2025/frii-pay-xrpl-case-study-crypto-payment-solution.md @@ -0,0 +1,79 @@ +--- +category: 2025 +date: "2025-07-23" +template: '../../@theme/templates/blogpost' +seo: + description: Learn how Frii Pay built a crypto payment solution on the XRP Ledger (XRPL). This case study details their journey, technical integration, and market impact. +labels: + - Case Study +markdown: + editPage: + hide: true +--- +# Frii Pay & XRPL: Next-Gen Crypto Payment Solution + +One of the promising players leveraging XRPL's payment capabilities is [Frii Pay](https://friipay.io/) — a crypto-native payment solution, focused on widening access to low-cost, [real-time digital payments](/docs/use-cases/payments) at point of sale, and introducing the benefits of blockchain finance to mainstream businesses and consumers alike. + +This case study explores how Frii Pay utilizes XRPL technology, its value proposition, and the business interest and traction it has achieved, serving as a model for payment businesses building on the XRP Ledger (XRPL). + + + + + + +## How Frii Pay Utilizes XRPL Technology for Payments + +Frii Pay’s core infrastructure is purpose-built on the XRP Ledger, leveraging its decentralized, fast, and scalable blockchain environment to deliver seamless payment experiences. + +### Key ways Frii Pay leverages XRPL + +* **[Stablecoin Payments](/docs/use-cases/tokenization/stablecoin-issuer)**: Frii Pay issues and supports [multiple stablecoins](https://ripple.com/insights/the-rise-of-global-stablecoins-on-the-xrpl/) (e.g. RLUSD) directly on the XRPL, ensuring price-stable crypto payments while maintaining high transaction speed and low fees. + +* **Instant Settlement Layer**: Utilizing XRPL's average settlement time of 3-5 seconds, Frii Pay enables real-time cross-border and domestic payments without intermediaries. + +* **On-Ledger Tokenization**: Frii Pay uses [XRPL’s native tokenization features](/docs/use-cases/tokenization/real-world-assets) to issue coupons and loyalty rewards in the form of merchant-specific tokens or digital money, creating new and engaging consumer interactions by unlocking the programmable finance capabilities of the XRPL. + +* **Real-time Currency Conversion**: Frii Pay utilizes the XRPL’s [Decentralized Exchange (DEX)](/docs/concepts/tokens/decentralized-exchange) to enable consumers to pay using any tradable currency in their wallet, while ensuring the merchant receives the exact currency and amount they have requested. + +* **Compliance**: Frii Pay’s architecture incorporates XRPL’s compliance-ready infrastructure, facilitating KYC/AML-integrated payment rails that can interact with traditional financial systems to on and off ramp funds for all users. + + +## Benefits of XRPL for Payment Companies like Frii Pay + +Frii Pay’s value proposition revolves around providing frictionless, stable, and cost-effective payment infrastructure to businesses, powered by XRPL. + +In addition, the application leverages consumer spending data with the real-time, cross-border capabilities of XRPL to introduce new and interesting payment experiences that benefit merchants, consumers, and even brands. + +Imagine spending $100 on a meal and having your $10 loyalty discount sent instantly to a wallet on the other side of the world to pay for a gift, medical treatment, or education. + + +### How XRPL Adds Value to Frii Pay’s Crypto Payment Solution + + + +Frii Pay abstracts blockchain complexity for businesses by providing merchant SDKs, customer-facing wallets, payment APIs, settlement & reconciliation dashboards. This allows merchants to accept crypto payments without technical blockchain expertise while tapping into XRPL’s efficiency. They have also expanded their solution to support payments online and via unattended kiosks. + +## Frii Pay's Business Traction and Impact with XRPL + +Since the launch of its XRPL-based payment ecosystem, Frii Pay has achieved significant traction. + +Key results of the partnership include: +* **Payment Terminal Compatibility**: Frii Pay has developed its terminal software to be compatible with **50+ million existing card payment terminals worldwide**. +* **Merchants & Acquiring Bank Relationships**: Frii Pay has established relationships with a number of acquiring banks covering the UK and Europe to offer crypto acceptance, digital loyalty and digital couponing on XRPL alongside traditional card payments through existing POS terminals. +* **Merchant Network**: In the UK, Frii Pay has established a **network of over 900 merchants** who can accept crypto payments once regulation allows. +* **Consumer Engagement**: Frii Pay has initiated a program to educate **250 million university students worldwide** on using digital wallets and digital currencies. +* **Student POC Deployment**: Frii Pay has successfully launched a Proof-of-Concept (POC) with The University of Birmingham, providing students with a free mobile wallet powered by XRPL, offering coupons for free products, and loyalty discounts at merchants in and around the university campus. The service received **100% uptake** by their pilot cohort, who have been providing feedback to refine the solution and will open up to all **40,000 students** in the 2024-2025 academic year. +* **Merchant & Consumer Early Adopter Feedback Includes**: + * A smooth transaction experience – validation only takes 3-5 seconds. + * Interest in new methods to engage with each other, pay, and get paid. + * Enthusiasm for saving and spending in digital assets or other currencies. + * A need for lower transaction fees offered by XRPL compared to card networks. + * Immediate settlement (seconds instead of days). + * Increased customer engagement via loyalty rewards issued on XRPL. + +## Driving Innovation in the Crypto Payment Ecosystem + +Frii Pay illustrates the real-world use case of XRPL technology in payments. By building an accessible, stablecoin payment infrastructure on XRPL, Frii Pay has addressed the core challenges of legacy payment systems: cost, speed, transparency, and global reach. + +To find out more about XRPL’s payment capabilities and start building, visit [XRP Ledger Developer Resources](https://xrpl.org/docs). + diff --git a/blog/sidebars.yaml b/blog/sidebars.yaml index c06020441f..b83d345b42 100644 --- a/blog/sidebars.yaml +++ b/blog/sidebars.yaml @@ -6,6 +6,7 @@ - group: '2025' expanded: false items: + - page: 2025/frii-pay-xrpl-case-study-crypto-payment-solution.md - page: 2025/fixes-enabled-dnfts-expected.md - page: 2025/clio-2.4.1.md - page: 2025/integrating-dia-oracles-on-xrpl.md