Xahau (XAH)
Sign Xahau transactions. Xahau is an XRPL-derived sidechain, so the payload reuses the XRP Ledger transaction shape — provide the standard Payment fields and the device signs the serialized transaction.
| Field | Value |
|---|---|
| Family | Xahau (XRPL-derived) |
| coinType | 144 |
| keyPath | m/44'/144'/<accountIdx>'/0/0 (legacy Xahau account: m/44'/21337'/<accountIdx>'/0/0) |
| amount unit | drops (1 XAH = 1e6) |
| chainId | xahau:mainnet/slip44:144 |
| chainId · Testnet | xahau:testnet/slip44:21337 (keyPath m/44'/21337'/<accountIdx>'/0/0) |
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.32.0 or higher | 1.0.0 or higher |
signTransaction | 2.32.0 or higher — structured Payment / TrustSet / AccountSetblind-signed transactions require 2.35.0 | 1.0.0 or higher |
getAddress
Retrieves the Xahau account address. Returns an XRPL-style classic address (r…).
| Field | Type | Required | Source | Notes |
|---|---|---|---|---|
chainId | string | Required | App | Full CAIP-19 — xahau:mainnet/slip44:144 |
keyPath | string | Required | App | BIP-44 — default m/44'/144'/0'/0/0. A legacy Xahau account (coin type 21337) is selected with m/44'/21337'/0'/0/0 |
Request
await dcent.getAddress({
chainId: 'xahau:mainnet/slip44:144',
keyPath: "m/44'/144'/0'/0/0"
})
Response
| Field | Type | Description |
|---|---|---|
body.parameter.address | string | XRPL-style classic address (r…) for this Xahau account. Xahau uses the same classic address format as the XRP Ledger. |
header.status | string | success on completion |
{
"header": {
"version": "1.0",
"status": "success",
"response_from": "getAddress"
},
"body": {
"command": "getAddress",
"parameter": {
"address": "rrrrrrrrrrrrrrrrrrrputRj8Lyv"
}
}
}
signTransaction — Payment
Signs a Xahau transaction. The bridge serializes and signs the XRPL-style transaction and returns the signed tx_blob ready to submit.
payload.transaction:
{
"TransactionType": "Payment",
"Account": "rrrrrrrrrrrrrrrrrrrputRj8Lyv",
"Destination": "rrrrrrrrrrrrrhbyxFUyg4pJeFLCBn",
"Amount": "1000000",
"Fee": "12",
"Sequence": 1,
"LastLedgerSequence": 85000000,
"Flags": 2147483648
}
| Field | Type | Required | Source | Description |
|---|---|---|---|---|
TransactionType | string | Required | App | Payment for a value transfer |
Account | address | Required-Real | Wallet | Device Xahau account (sender) — must be the address getAddress returns for the same keyPath (otherwise -32602), and must exist and be funded on-chain |
Destination | address | Required-Real | App | Recipient classic address (r…) |
Amount | string | object | Required | App | Native XAH: value in drops; "1000000" = 1 XAH. Issued currency: { currency, issuer, value } |
Fee | string | Required | App | Transaction cost in drops, taken from the network's current fee |
Sequence | number | Required-Real | App | Real, current per-account sequence — the app must supply it, 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 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: 'xahau:mainnet/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 tx_blob — the fully, canonically serialized signed XRPL transaction for Xahau, ready to submit. This is a complete signed transaction blob, not a bare signature. |
body.command | string | signTransaction |
header.status | string | success on completion |
{
"header": {
"version": "1.0",
"status": "success",
"response_from": "signTransaction"
},
"body": {
"command": "signTransaction",
"parameter": {
"signature": "<signed tx_blob hex>"
}
}
} // signed tx_blob
Xahau shares the XRP Ledger transaction format. The same Payment shape applies; the device signs the canonically serialized transaction and returns the signed tx_blob. When a Payment, TrustSet or AccountSet is built on the structured path, the wallet adds NetworkID itself. A transaction is blind-signed when its type is not Payment, TrustSet or AccountSet, or when it carries fields the structured path does not rebuild (for example Memos, SourceTag, SendMax, Paths). A blind-signed transaction is signed as-is, so include NetworkID: 21337 (Xahau Testnet: 21338) in it yourself.
Common Mistakes
Missing tfFullyCanonicalSig — on the structured path (Payment / TrustSet / AccountSet) the wallet adds the bit (2147483648) itself. A blind-signed transaction (see the note above) without it is rejected with -32602 before signing. Amounts not in drops — a native Amount and Fee are integer-string drops, not XAH. 1 XAH = "1000000" drops. Unfunded / non-existent Account — the sender must already exist on-chain and meet the base reserve; otherwise sequence lookup and submission fail. Stale Sequence — fetch the account's current sequence immediately before signing; a reused value is rejected on submit.