Skip to main content

XRP (XRP)

Sign XRP Ledger transactions. Provide a Payment transaction object; the device signs the canonical serialization by its keyPath. Native XRP amounts are drops strings, while issued-currency (IOU) amounts are { currency, issuer, value } objects.

FieldValue
FamilyXRP (Ripple)
coinType144
keyPathm/44'/144'/<accountIdx>'/0/0
amount unitdrops (1 XRP = 1e6)
chainIdxrpl:0/slip44:144

Supported Methods

MethodSupported
getAddress
signTransaction
signMessage
signTypedData

Requirements

Minimum firmware for each method. The two models are on different version lines, so DCENT Biometric Wallet and DCENT X are listed separately (the numbers are not comparable across models). Below this the request returns the firmware-update error (5005) and the bridge prompts to update.

MethodDCENT Biometric WalletDCENT X
getAddress2.4.0 or higher1.0.0 or higher
signTransaction2.4.0 or higher — plain transfer
App (WalletConnect) requests require 2.35.0
1.0.0 or higher
info

Firmware versions below are for the DCENT Biometric Wallet line — DCENT X supports them from 1.0.0. The App (WalletConnect) signTransaction path requires firmware 2.35.0+ and is supported — arbitrary XRPL transaction types (AccountSet, OfferCreate, EscrowCreate, TrustSet, …) sign through the same wire path.

getAddress — account address

Retrieves the XRP account address. Returns a classic XRP Ledger address in base58check format (r…).

FieldTypeRequiredSourceDescription
chainIdstringRequiredAppAlways xrpl:0/slip44:144
keyPathstringRequiredAppBIP-44 path; default m/44'/144'/0'/0/0

Request

await dcent.getAddress({
chainId: 'xrpl:0/slip44:144',
keyPath: "m/44'/144'/0'/0/0"
})

Response

FieldTypeDescription
addressstringClassic XRP Ledger address in base58check format (r…)
header.statusstring"success" on completion
{
"header": {
"version": "1.0",
"status": "success"
},
"body": {
"command": "getAddress",
"parameter": {
"address": "r…"
}
}
}

signTransaction — Payment

Variant — native XRP

FieldTypeRequiredSourceDescription
TransactionTypeenumRequiredAppAlways "Payment"
AccountstringRequired-RealWalletDevice XRP address (r…); must be a funded account
DestinationstringRequired-RealAppRecipient address (r…)
AmountstringRequiredAppDrops as a string (e.g. "1000000" = 1 XRP)
FeestringRequired-RealAppDrops; must be a real, current network fee — not auto-filled
SequencenumberRequired-RealAppReal account sequence from account_info — must be current, not auto-filled
LastLedgerSequencenumberRequired-RealAppHighest ledger index this transaction is valid for — required so a stale transaction fails closed instead of lingering; a current ledger index plus a small buffer (e.g. +20)
FlagsnumberRequiredApp2147483648 = tfFullyCanonicalSig (0x80000000) — OR it with the transaction type's own flags. The wire gate no longer rejects a missing Flags, but any transaction the structured path cannot model falls back to blind-signing, and that path does require the canonical-signature flag

Request

await dcent.sign({
method: 'signTransaction',
chainId: 'xrpl:0/slip44:144',
payload: {
keyPath: "m/44'/144'/0'/0/0",
transaction: {
"TransactionType": "Payment",
"Account": "rrrrrrrrrrrrrrrrrrrputRj8Lyv",
"Destination": "rrrrrrrrrrrrrhbyxFUyg4pJeFLCBn",
"Amount": "1000000",
"Fee": "12",
"Sequence": 1,
"LastLedgerSequence": 85000000,
"Flags": 2147483648
}
}
})

Response

FieldTypeDescription
signaturehex stringThe broadcast-ready signed transaction blob (canonical XRPL serialization) — not a bare signature. Submit it as the tx_blob in a submit request.
header.statusstring"success" on completion
body.commandstring"signTransaction"
{
"header": {
"status": "success"
},
"body": {
"command": "signTransaction",
"parameter": {
"signature": "<signed tx blob hex>"
}
}
}

Variant — issued currency (IOU)

For non-XRP tokens, replace the Amount string with an object. The recipient must already hold a TrustSet trustline to that issuer, otherwise the Payment fails on-ledger.

FieldTypeRequiredSourceDescription
Amount.currencystringRequiredAppCurrency code (e.g. "USD")
Amount.issuerstringRequired-RealAppIssuer address (r…) — e.g. Bitstamp USD
Amount.valuestringRequiredAppToken amount as a decimal string (not drops)

Request

await dcent.sign({
method: 'signTransaction',
chainId: 'xrpl:0/slip44:144',
payload: {
keyPath: "m/44'/144'/0'/0/0",
transaction: {
"TransactionType": "Payment",
"Account": "rrrrrrrrrrrrrrrrrrrputRj8Lyv",
"Destination": "rrrrrrrrrrrrrhbyxFUyg4pJeFLCBn",
"Amount": {
"currency": "USD",
"issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
"value": "10"
},
"Fee": "12",
"Sequence": 1,
"LastLedgerSequence": 85000000,
"Flags": 2147483648
}
}
})

Supported transaction types

The transaction payload is a standard XRPL transaction object (same shape as xrpl.js). Set TransactionType and that type’s fields. DCENT signs all 18 XRPL transaction types:

Payment · AccountSet · AccountDelete · TrustSet · SetRegularKey · SignerListSet · DepositPreauth · OfferCreate · OfferCancel · CheckCreate · CheckCash · CheckCancel · EscrowCreate · EscrowFinish · EscrowCancel · PaymentChannelCreate · PaymentChannelClaim · PaymentChannelFund

info

Source: connector xrpTxType (18 types). Not supported: NFToken* (Mint / Burn / CreateOffer / CancelOffer / AcceptOffer) and TicketCreate.

info

Multi-signature is not supported (and not planned). SignerListSet above is a connector tx-type enum — an on-ledger transaction that configures a signer list, not the act of multi-signing.

Common Mistakes

danger

Missing tfFullyCanonicalSig — set Flags to 2147483648 (0x80000000). A Flags: 0 Payment can be rejected as Invalid Unsigned by stricter validators. Native amount not a drops string — XRP Amount must be a string of drops ("1000000"), not a number and not whole XRP. IOU without a trustline — issued-currency Payments fail unless the Destination holds a TrustSet for that issuer. Unfunded Account — the source must exist on-ledger (reserve met) before Sequence can be fetched.