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
chainId · Testnetxrpl:1/slip44:144

Supported Methods​

MethodSupported
getAddress✓
signTransaction✓
signMessage✗
signTypedData✗
signData✗

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 — structured Payment / TrustSet / AccountSet
blind-signed transactions require 2.35.0
1.0.0 or higher
info

Firmware versions above are for the DCENT Biometric Wallet line — DCENT X supports them from 1.0.0. A blind-signed transaction (any type other than Payment / TrustSet / AccountSet, or a payload the structured path does not rebuild — see Supported transaction types) is sent to the device with the WalletConnect signing command and only its 32-byte signing hash; that path requires firmware 2.35.0+.

getAddress — account address​

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

FieldTypeRequiredSourceDescription
chainIdstringRequiredAppxrpl:0/slip44:144 (mainnet) or xrpl:1/slip44:144 (testnet)
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
body.parameter.addressstringClassic XRP Ledger address in base58check format (r…)
header.statusstring"success" on completion
{
"header": {
"version": "1.0",
"status": "success",
"response_from": "getAddress"
},
"body": {
"command": "getAddress",
"parameter": {
"address": "r…"
}
}
}

signTransaction — Payment​

Variant — native XRP​

FieldTypeRequiredSourceDescription
TransactionTypeenumRequiredAppAlways "Payment"
AccountstringRequired-RealWalletDevice XRP address (r…) — must be the address getAddress returns for the same keyPath (otherwise -32602), and a funded account
DestinationstringRequired-RealAppRecipient address (r…)
Amountstring | objectRequiredAppNative XRP: drops as a string (e.g. "1000000" = 1 XRP). Issued currency: { currency, issuer, value }
DestinationTagnumber | stringOptionalAppUInt32 (a decimal string is also accepted). Needed by recipients that require a destination tag (e.g. exchange deposits). A non-integer or out-of-range value → -32602
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)
FlagsnumberOptionalApp2147483648 = tfFullyCanonicalSig (0x80000000), ORed with the transaction type's own flags. When the transaction is built on the structured path (Payment / TrustSet / AccountSet), the wallet adds the canonical bit itself. A blind-signed transaction (see Supported transaction types) must include it — without it the request fails with -32602. A TrustSet sent without Flags is also signed with tfSetNoRipple (0x00020000) — send Flags explicitly to control it.

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
body.parameter.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": {
"version": "1.0",
"status": "success",
"response_from": "signTransaction"
},
"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. Payment, TrustSet and AccountSet are built and signed on the structured path. Any other type the XRPL binary codec can encode is blind-signed: the wallet serializes your object as-is, so it must be complete and include the tfFullyCanonicalSig bit in Flags. A Payment, TrustSet or AccountSet that carries fields the structured path does not rebuild (for example Memos, SourceTag, SendMax, Paths) is blind-signed the same way. The connector's xrpTxType export names these 18 types:

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

info

xrpTxType is a list of type names, not a list of what can be signed — signing does not check TransactionType against it.

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 — on the structured path (Payment / TrustSet / AccountSet) the wallet adds the bit (2147483648, 0x80000000) itself. A blind-signed transaction without it is rejected with -32602 before signing. Native amount not a drops string — XRP Amount is in drops ("1000000" = 1 XRP), 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.