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.
| Field | Value |
|---|---|
| Family | XRP (Ripple) |
| coinType | 144 |
| keyPath | m/44'/144'/<accountIdx>'/0/0 |
| amount unit | drops (1 XRP = 1e6) |
| chainId | xrpl:0/slip44:144 |
Supported Methods
| Method | Supported |
|---|---|
| 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.
| Method | DCENT Biometric Wallet | DCENT X |
|---|---|---|
getAddress | 2.4.0 or higher | 1.0.0 or higher |
signTransaction | 2.4.0 or higher — plain transferApp (WalletConnect) requests require 2.35.0 | 1.0.0 or higher |
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…).
| Field | Type | Required | Source | Description |
|---|---|---|---|---|
chainId | string | Required | App | Always xrpl:0/slip44:144 |
keyPath | string | Required | App | BIP-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
| Field | Type | Description |
|---|---|---|
address | string | Classic XRP Ledger address in base58check format (r…) |
header.status | string | "success" on completion |
{
"header": {
"version": "1.0",
"status": "success"
},
"body": {
"command": "getAddress",
"parameter": {
"address": "r…"
}
}
}
signTransaction — Payment
Variant — native XRP
| Field | Type | Required | Source | Description |
|---|---|---|---|---|
TransactionType | enum | Required | App | Always "Payment" |
Account | string | Required-Real | Wallet | Device XRP address (r…); must be a funded account |
Destination | string | Required-Real | App | Recipient address (r…) |
Amount | string | Required | App | Drops as a string (e.g. "1000000" = 1 XRP) |
Fee | string | Required-Real | App | Drops; must be a real, current network fee — not auto-filled |
Sequence | number | Required-Real | App | Real account sequence from account_info — must be current, not auto-filled |
LastLedgerSequence | number | Required-Real | App | Highest 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) |
Flags | number | Required | App | 2147483648 = 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
| Field | Type | Description |
|---|---|---|
signature | hex string | The broadcast-ready signed transaction blob (canonical XRPL serialization) — not a bare signature. Submit it as the tx_blob in a submit request. |
header.status | string | "success" on completion |
body.command | string | "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.
| Field | Type | Required | Source | Description |
|---|---|---|---|---|
Amount.currency | string | Required | App | Currency code (e.g. "USD") |
Amount.issuer | string | Required-Real | App | Issuer address (r…) — e.g. Bitstamp USD |
Amount.value | string | Required | App | Token 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
Source: connector xrpTxType (18 types). Not supported: NFToken* (Mint / Burn / CreateOffer / CancelOffer / AcceptOffer) and TicketCreate.
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
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.