Skip to main content

Kaia (Klaytn) (KAIA)

Kaia (formerly Klaytn) is an EVM chain (eip155:8217/slip44:60). It signs through the standard EVM path; Klaytn-native features (fee-delegation, KCT) are wired — see the note below.

FieldValue
FamilyKlaytn / Kaia
coinType60
keyPathm/44'/60'/<accountIdx>'/0/0
chainId · Mainneteip155:8217/slip44:60
Testnet (Kairos)eip155:1001/slip44:60

Supported Methods

MethodSupported
getAddress
signTransaction
signMessage
signTypedData EIP-712

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
getAddress1.5.1 or higher1.0.0 or higher
signTransaction1.5.1 or higher1.0.0 or higher
signMessage1.5.1 or higher1.0.0 or higher
signTypedData2.11.1 or higher1.0.0 or higher
tip

Kaia routes to the Klaytn family. Plain EVM transfer, message, and EIP-712 typed-data all work, and Klaytn-native features are now wired: fee-delegation (sender side, typeInt: 9) returns the sender-partial RLP (senderTxHashRLP) for an external fee payer, and KIP-7 (KCT) tokens sign via the standard 0xa9059cbb calldata. Only fee-payer mode (kaia_signTransactionAsFeePayer — signing as the payer) is still not implemented.

getAddress — account address

Retrieves the Kaia address. Returns a checksummed 0x address, identical to EVM.

FieldTypeRequiredNotes
chainIdstringRequiredFull CAIP-19 — eip155:8217/slip44:60
keyPathstringRequiredBIP-44 path — default m/44'/60'/0'/0/0

Request

await dcent.getAddress({
chainId: 'eip155:8217/slip44:60',
keyPath: "m/44'/60'/0'/0/0"
})

Response

{
"header": {
"version": "1.0",
"status": "success"
},
"body": {
"command": "getAddress",
"parameter": {
"address": "0x…"
}
}
}

signTransaction

Signs a Kaia transaction. Today Kaia uses the EVM transaction shape (legacy or EIP-1559) and returns an RLP-encoded signed raw transaction — identical to Ethereum / EVM. Use chainId: 'eip155:8217/slip44:60'.

await dcent.sign({
method: 'signTransaction',
chainId: 'eip155:8217/slip44:60',
payload: {
keyPath: "m/44'/60'/0'/0/0",
transaction: {
type: 2,
to: '0x000000000000000000000000000000000000dEaD',
value: '0x…',
gasLimit: '0x…',
maxFeePerGas: '0x…',
maxPriorityFeePerGas: '0x…',
nonce: '0x0',
data: '0x'
}
}
})
FieldTypeRequiredSourceNotes
typenumberOptionalApp2 = EIP-1559 (recommended), 0 = legacy
tohex addrRequired-RealAppRecipient
valuehexRequiredAppAmount in peb (1 KAIA = 1e18)
gasLimithexRequired-RealApp
maxFeePerGashexRequired-RealAppEIP-1559 fee
maxPriorityFeePerGashexRequired-RealAppEIP-1559 tip
noncehexRequired-RealAppAccount nonce
datahexOptionalApp0x for native; calldata for contracts

Response

FieldTypeNotes
body.parameter.signaturehexBroadcast-ready RLP-encoded signed raw transaction
body.commandstring"signTransaction"
header.statusstring"success" on completion
info

Payload fields and the response envelope match the Ethereum / EVM page. For Klaytn-native fee-delegation and KIP-7 (KCT) payloads, see the sections below.

Fee-delegation (sender)

For an externally fee-delegated transfer (a service pays the fee), the user signs as the sender. Set typeInt: 9 (FeeDelegatedValueTransfer); the response is the sender-partial RLP (senderTxHashRLP) that the fee payer counter-signs. This is a native value transfer, so to is the recipient.

payload.transaction:

{
"typeInt": 9,
"to": "0x<recipient>",
"value": "0x2386f26fc10000",
"gasLimit": "0x186a0",
"maxFeePerGas": "0x5d21dba00",
"maxPriorityFeePerGas": "0x0",
"nonce": "0x0",
"chainId": 8217,
"data": "0x"
}
FieldTypeRequiredNotes
typeIntnumberRequired9 = FeeDelegatedValueTransfer
tohex addrRequired-RealRecipient (native transfer — to is the recipient)
valuehexRequiredAmount in peb
chainIdnumberRequired8217
gasLimit · maxFeePerGas · maxPriorityFeePerGas · noncehexRequired-RealFee + nonce (from RPC)
datahexOptional0x for native
info

Response: body.parameter.signature is the sender-partial RLP (senderTxHashRLP), not a broadcast-ready tx — hand it to the fee payer to counter-sign.

info

Change before sending: to → the real recipient address, and value → the real amount (here 0x2386f26fc10000 = 0.01 KAIA). For a native value transfer the tx to is the recipient.

KIP-7 (KCT) token transfer

info

Token model: EVM-family (form-E). KIP-7 (KCT) transfers use raw ERC-20 calldata like EVM. Unlike EVM, the form-D transaction.token descriptor path is not yet routed for Kaia — the device can only show a friendly label if it recognizes the token locally; otherwise it still signs, showing the raw contract call. See Core Concepts → Token descriptors.

KIP-7 uses the same transfer(address,uint256) selector as ERC-20 (0xa9059cbb). Here to is the token contract — leave it — and the recipient + amount live inside data.

payload.transaction:

{
"type": 2,
"to": "0x<token-contract>",
"value": "0x0",
"gasLimit": "0x186a0",
"maxFeePerGas": "0x77359400",
"maxPriorityFeePerGas": "0x3b9aca00",
"nonce": "0x0",
"data": "0xa9059cbb<recipient 32B><amount 32B>"
}
FieldTypeRequiredNotes
typenumberOptional2 = EIP-1559
tohex addrRequired-RealThe KIP-7 token contract (not the recipient)
valuehexRequired0x0 (amount lives in data)
datahexRequired0xa9059cbb + recipient (32B) + amount (32B)
info

Change before sending: keep to = the KIP-7 token contract. The real recipient is the 32 bytes after 0xa9059cbb in data (the preset ships all-zero) and the amount is the last 32 bytes (…03e8 = 1000 base units). Set both to real values so the device shows the correct KCT remap screen.

Common Mistakes

danger

Fee-payer mode — signing as the fee payer (kaia_signTransactionAsFeePayer) is not implemented; only the sender side (typeInt: 9) is supported. KIP-7 recipient in to — for a KIP-7 transfer, to is the token contract; the recipient + amount go inside data (see the KIP-7 section above).