Skip to main content

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.

FieldValue
FamilyXahau (XRPL-derived)
coinType144
keyPathm/44'/144'/<accountIdx>'/0/0 (legacy Xahau account: m/44'/21337'/<accountIdx>'/0/0)
amount unitdrops (1 XAH = 1e6)
chainIdxahau:mainnet/slip44:144
chainId · Testnetxahau:testnet/slip44:21337 (keyPath m/44'/21337'/<accountIdx>'/0/0)

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.32.0 or higher1.0.0 or higher
signTransaction2.32.0 or higher — structured Payment / TrustSet / AccountSet
blind-signed transactions require 2.35.0
1.0.0 or higher

getAddress​

Retrieves the Xahau account address. Returns an XRPL-style classic address (r…).

FieldTypeRequiredSourceNotes
chainIdstringRequiredAppFull CAIP-19 — xahau:mainnet/slip44:144
keyPathstringRequiredAppBIP-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

FieldTypeDescription
body.parameter.addressstringXRPL-style classic address (r…) for this Xahau account. Xahau uses the same classic address format as the XRP Ledger.
header.statusstringsuccess 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
}
FieldTypeRequiredSourceDescription
TransactionTypestringRequiredAppPayment for a value transfer
AccountaddressRequired-RealWalletDevice Xahau account (sender) — must be the address getAddress returns for the same keyPath (otherwise -32602), and must exist and be funded on-chain
DestinationaddressRequired-RealAppRecipient classic address (r…)
Amountstring | objectRequiredAppNative XAH: value in drops; "1000000" = 1 XAH. Issued currency: { currency, issuer, value }
FeestringRequiredAppTransaction cost in drops, taken from the network's current fee
SequencenumberRequired-RealAppReal, current per-account sequence — the app must supply it, 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 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

FieldTypeDescription
body.parameter.signaturehex stringThe 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.commandstringsignTransaction
header.statusstringsuccess on completion
{
"header": {
"version": "1.0",
"status": "success",
"response_from": "signTransaction"
},
"body": {
"command": "signTransaction",
"parameter": {
"signature": "<signed tx_blob hex>"
}
}
} // signed tx_blob
info

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​

danger

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.