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 |
| chainId · Testnet | xrpl:1/slip44:144 |
Supported Methods
| Method | Supported |
|---|---|
| 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.
| Method | DCENT Biometric Wallet | DCENT X |
|---|---|---|
getAddress | 2.4.0 or higher | 1.0.0 or higher |
signTransaction | 2.4.0 or higher — structured Payment / TrustSet / AccountSetblind-signed transactions require 2.35.0 | 1.0.0 or higher |
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…).
| Field | Type | Required | Source | Description |
|---|---|---|---|---|
chainId | string | Required | App | xrpl:0/slip44:144 (mainnet) or xrpl:1/slip44:144 (testnet) |
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 |
|---|---|---|
body.parameter.address | string | Classic XRP Ledger address in base58check format (r…) |
header.status | string | "success" on completion |
{
"header": {
"version": "1.0",
"status": "success",
"response_from": "getAddress"
},
"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 the address getAddress returns for the same keyPath (otherwise -32602), and a funded account |
Destination | string | Required-Real | App | Recipient address (r…) |
Amount | string | object | Required | App | Native XRP: drops as a string (e.g. "1000000" = 1 XRP). Issued currency: { currency, issuer, value } |
DestinationTag | number | string | Optional | App | UInt32 (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 |
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 | Optional | App | 2147483648 = 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
| Field | Type | Description |
|---|---|---|
body.parameter.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": {
"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.
| 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. 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
xrpTxType is a list of type names, not a list of what can be signed — signing does not check TransactionType against it.
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 — 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.