Cosmos (ATOM)
Sign Cosmos SDK transactions via an Amino SignDoc. Fetch account_number / sequence from a REST endpoint yourself — the bridge never does. DCENT signs the transaction exactly as sent, so placeholder values produce a signature that cannot be broadcast (see the field table).
| Field | Value |
|---|---|
| Family | Cosmos |
| coinType | 118 |
| keyPath | m/44'/118'/<accountIdx>'/0/0 |
| chainId | cosmos:cosmoshub-4/slip44:118 |
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.21.0 or higher | 1.0.0 or higher |
signTransaction | 2.21.0 or higher | 1.0.0 or higher |
Firmware versions below are for the DCENT Biometric Wallet line — DCENT X supports them from 1.0.0. COREUM smart-token support was added in firmware 2.28.1.
getAddress — account address
Retrieves the Cosmos account address and its public key. Cosmos uses bech32 addresses with a chain-specific prefix (cosmos1… on the Hub).
| Field | Type | Required | Source | Notes |
|---|---|---|---|---|
chainId | string | Required | App | Full CAIP-19, e.g. cosmos:cosmoshub-4/slip44:118 |
keyPath | string | Required | App | BIP-44, e.g. m/44'/118'/0'/0/0 |
Request
await dcent.getAddress({
chainId: 'cosmos:cosmoshub-4/slip44:118',
keyPath: "m/44'/118'/0'/0/0"
})
Response
| Field | Type | Notes |
|---|---|---|
address | string | bech32 account address (cosmos1… on the Hub) |
pubkey | hex (optional) | Compressed secp256k1 public key for this keyPath |
{
"header": {
"version": "1.0",
"status": "success"
},
"body": {
"command": "getAddress",
"parameter": {
"address": "cosmos1…",
"pubkey": "02…"
}
}
}
signTransaction — Amino SignDoc
payload.transaction:
{
"chain_id": "cosmoshub-4",
"account_number": "0",
"sequence": "0",
"fee": {
"amount": [
{
"denom": "uatom",
"amount": "5000"
}
],
"gas": "200000"
},
"msgs": [
{
"type": "cosmos-sdk/MsgSend",
"value": {
"from_address": "cosmos1<sender>",
"to_address": "cosmos1<recipient>",
"amount": [
{
"denom": "uatom",
"amount": "1000000"
}
]
}
}
],
"memo": ""
}
| Field | Required | Source | Unit | Notes |
|---|---|---|---|---|
chain_id | Required | App | — | e.g. cosmoshub-4 |
account_number / sequence | Required-Real | App | — | Real, current values — the app must supply them; sender must exist on-chain |
msgs[].value.from_address | Required-Real | Wallet | — | Device cosmos account |
amount[].amount | Required | App | uatom | 1 ATOM = 1e6 |
Response
| Field | Type | Notes |
|---|---|---|
header.status | string | "success" on completion |
body.parameter.signature | string | Broadcast-ready serialized signed transaction for Cosmos (Amino-encoded), not a bare signature |
{
"header": {
"version": "1.0",
"status": "success"
},
"body": {
"command": "signTransaction",
"parameter": {
"signature": "<signed tx>"
}
}
}
signTransaction — other networks & tokens
The same Amino MsgSend envelope signs other Cosmos SDK chains and AssetFT tokens — only chain_id and the token denom change. Fees stay in each chain’s native denom. Custom (unregistered) tokens use a compact token descriptor.
Testnet variants share the same shape: Coreum testnet cosmos:coreum-testnet-1/slip44:990 (denom utestcore), Hippo testnet cosmos:hippo-protocol-testnet-1/slip44:118 (denom ahp).
Coreum — CORE native transfer
chainId cosmos:coreum-mainnet-1/slip44:990 · coinType 990 · keyPath m/44'/990'/0'/0/0 · denom ucore (1 CORE = 1e6) · MsgSend
payload.transaction:
{
"chain_id": "coreum-mainnet-1",
"account_number": "0",
"sequence": "0",
"fee": {
"amount": [
{
"denom": "ucore",
"amount": "5000"
}
],
"gas": "200000"
},
"msgs": [
{
"type": "cosmos-sdk/MsgSend",
"value": {
"from_address": "core1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdcyqx",
"to_address": "core1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdcyqx",
"amount": [
{
"denom": "ucore",
"amount": "1000000"
}
]
}
}
],
"memo": ""
}
| Field | Type | Required | Notes |
|---|---|---|---|
chain_id | string | Required | Cosmos SDK chain id (bare, not CAIP), e.g. coreum-mainnet-1. |
account_number / sequence | string | Required-Real | Real, current values — the app must supply them; not auto-filled. |
fee.amount[].denom | string | Required | Fee denom — always native ucore, never a token. |
fee.amount[].amount / fee.gas | string | Required | Fee amount and gas limit, base units. |
msgs[].type | string | Required | cosmos-sdk/MsgSend — bank send. |
msgs[].value.from_address | string | Required-Real | Device Coreum account that signs (core1…). |
msgs[].value.to_address | string | Required | Recipient address (core1…). |
msgs[].value.amount[].denom | string | Required | Native transfer denom ucore (1 CORE = 1e6). |
msgs[].value.amount[].amount | string | Required | Value in base units. |
memo | string | Optional | Optional Cosmos memo; empty string by default. |
Coreum AssetFT (smart-token) transfer
Token model: form-D descriptor. Always send the token's symbol and decimals under transaction.token — the bridge signs with no network access and uses the decimals you supply directly, so the device shows the correct token name and amount. See Core Concepts → Token descriptors.
Same bank MsgSend, but msgs[].value.amount[].denom is the AssetFT token denom (subunit-issuer) instead of native ucore — the bridge resolves it to the registered smart-token and signs a token transfer, not a CORE transfer. The fee is always paid in native ucore. amount "1000000" = 1 token at 6 decimals.
payload.transaction:
{
"chain_id": "coreum-mainnet-1",
"account_number": "0",
"sequence": "0",
"fee": {
"amount": [
{
"denom": "ucore",
"amount": "5000"
}
],
"gas": "200000"
},
"msgs": [
{
"type": "cosmos-sdk/MsgSend",
"value": {
"from_address": "core1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdcyqx",
"to_address": "core1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdcyqx",
"amount": [
{
"denom": "test-core14ljz7w9lc2yrg66gtfklk94p4jzzmla32ft2s8",
"amount": "1000000"
}
]
}
}
],
"memo": ""
}
| Field | Type | Required | Notes |
|---|---|---|---|
chain_id | string | Required | coreum-mainnet-1. |
msgs[].type | string | Required | cosmos-sdk/MsgSend — bank send is reused for AssetFT tokens. |
msgs[].value.from_address | string | Required-Real | Device Coreum account that signs. |
msgs[].value.to_address | string | Required | Recipient (core1…). |
msgs[].value.amount[].denom | string | Required | AssetFT token denom (subunit-issuer, e.g. test-core14ljz…) — non-native; the bridge resolves it to the registered smart-token. |
msgs[].value.amount[].amount | string | Required | Token amount in base units ("1000000" = 1 token @ 6 decimals). |
fee.amount[].denom | string | Required | Fee is always paid in native ucore, not the token. |
account_number / sequence | string | Required-Real | Real, current values — the app must supply them; not auto-filled. |
memo | string | Optional | Optional. |
Hippo Protocol — HP transfer
chainId cosmos:hippo-protocol-1/slip44:118 · coinType 118 · keyPath m/44'/118'/0'/0/0 · denom ahp · MsgSend
payload.transaction:
{
"chain_id": "hippo-protocol-1",
"account_number": "0",
"sequence": "0",
"fee": {
"amount": [
{
"denom": "ahp",
"amount": "5000"
}
],
"gas": "200000"
},
"msgs": [
{
"type": "cosmos-sdk/MsgSend",
"value": {
"from_address": "hippo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqztkyex",
"to_address": "hippo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqztkyex",
"amount": [
{
"denom": "ahp",
"amount": "1000000"
}
]
}
}
],
"memo": ""
}
| Field | Type | Required | Notes |
|---|---|---|---|
chain_id | string | Required | Cosmos SDK chain id (bare, not CAIP), e.g. hippo-protocol-1. |
account_number / sequence | string | Required-Real | Real, current values — the app must supply them; not auto-filled. |
fee.amount[].denom | string | Required | Fee denom — native ahp. |
fee.amount[].amount / fee.gas | string | Required | Fee amount and gas limit, base units. |
msgs[].type | string | Required | cosmos-sdk/MsgSend — bank send. |
msgs[].value.from_address | string | Required-Real | Device Hippo account that signs (hippo1…). |
msgs[].value.to_address | string | Required | Recipient address (hippo1…). |
msgs[].value.amount[].denom | string | Required | Native transfer denom ahp. |
msgs[].value.amount[].amount | string | Required | Value in base units. |
memo | string | Optional | Optional Cosmos memo; empty string by default. |
AssetFT — form-D descriptor
Skip hand-built messages: pass a compact token object { contract, to, amount, decimals } and the bridge wraps it into an Amino MsgSend whose denom is the contract. from identifies the signer; amount is in base units (not rescaled by decimals). Requires Coreum mainnet (slip44:990).
payload.transaction:
{
"token": {
"contract": "txd-core1pjt5jvv7dwmr5pfk5ecc5mc38rahas7d90vklk",
"to": "core1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdcyqx",
"amount": "1000000",
"decimals": 6,
"symbol": "TXD"
},
"from": "core1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdcyqx",
"chain_id": "coreum-mainnet-1",
"account_number": "0",
"sequence": "0",
"fee": {
"amount": [
{
"denom": "ucore",
"amount": "5000"
}
],
"gas": "200000"
},
"memo": ""
}
| Field | Type | Required | Notes |
|---|---|---|---|
token.contract | string | Required | AssetFT denom / contract to send; used verbatim as the MsgSend denom. Unregistered tokens allowed. |
token.to | string | Required | Recipient (core1…). |
token.amount | string | Required | Amount in base units (not rescaled by decimals). |
token.decimals | number | Required | Base-unit exponent; enables descriptor resolution (no on-chain RPC). |
token.symbol | string | Optional | Display metadata only. |
from | string | Required-Real | Device Coreum account that signs (read-only signer). |
chain_id | string | Required | coreum-mainnet-1 — Coreum mainnet (slip44:990) required. |
account_number / sequence | string | Required-Real | Real, current values — the app must supply them; not auto-filled. |
fee.amount[].denom / amount / gas | string | Required | Fee in native ucore. |
memo | string | Optional | Optional. |
Signable scope — single bank MsgSend only. The bridge signs exactly one /cosmos.bank.v1beta1.MsgSend, in either Amino (cosmos-sdk/MsgSend) or Protobuf (SIGN_MODE_DIRECT) form. Token transfers reuse the same MsgSend, carrying an AssetFT (subunit-issuer) / IBC (ibc/…) / tokenfactory (factory/…) denom. Any other message type — CW20 MsgExecuteContract, IBC MsgTransfer, staking / governance — and any multi-message tx are rejected with -32601 ("Method not found"); a malformed SignDoc (empty/undecodable messages, missing from/to/amount) returns -32602. CW20 / IBC transfer messages are not yet wired.
Common Mistakes
Sender not on-chain — REST lookup 404s for unfunded accounts. Amounts not in micro-units (uatom).