Skip to main content

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).

FieldValue
FamilyCosmos
coinType118
keyPathm/44'/118'/<accountIdx>'/0/0
chainIdcosmos:cosmoshub-4/slip44:118

Supported Methods

MethodSupported
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.

MethodDCENT Biometric WalletDCENT X
getAddress2.21.0 or higher1.0.0 or higher
signTransaction2.21.0 or higher1.0.0 or higher
info

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).

FieldTypeRequiredSourceNotes
chainIdstringRequiredAppFull CAIP-19, e.g. cosmos:cosmoshub-4/slip44:118
keyPathstringRequiredAppBIP-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

FieldTypeNotes
addressstringbech32 account address (cosmos1… on the Hub)
pubkeyhex (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": ""
}
FieldRequiredSourceUnitNotes
chain_idRequiredAppe.g. cosmoshub-4
account_number / sequenceRequired-RealAppReal, current values — the app must supply them; sender must exist on-chain
msgs[].value.from_addressRequired-RealWalletDevice cosmos account
amount[].amountRequiredAppuatom1 ATOM = 1e6

Response

FieldTypeNotes
header.statusstring"success" on completion
body.parameter.signaturestringBroadcast-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.

info

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": ""
}
FieldTypeRequiredNotes
chain_idstringRequiredCosmos SDK chain id (bare, not CAIP), e.g. coreum-mainnet-1.
account_number / sequencestringRequired-RealReal, current values — the app must supply them; not auto-filled.
fee.amount[].denomstringRequiredFee denom — always native ucore, never a token.
fee.amount[].amount / fee.gasstringRequiredFee amount and gas limit, base units.
msgs[].typestringRequiredcosmos-sdk/MsgSend — bank send.
msgs[].value.from_addressstringRequired-RealDevice Coreum account that signs (core1…).
msgs[].value.to_addressstringRequiredRecipient address (core1…).
msgs[].value.amount[].denomstringRequiredNative transfer denom ucore (1 CORE = 1e6).
msgs[].value.amount[].amountstringRequiredValue in base units.
memostringOptionalOptional Cosmos memo; empty string by default.

Coreum AssetFT (smart-token) transfer

info

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": ""
}
FieldTypeRequiredNotes
chain_idstringRequiredcoreum-mainnet-1.
msgs[].typestringRequiredcosmos-sdk/MsgSend — bank send is reused for AssetFT tokens.
msgs[].value.from_addressstringRequired-RealDevice Coreum account that signs.
msgs[].value.to_addressstringRequiredRecipient (core1…).
msgs[].value.amount[].denomstringRequiredAssetFT token denom (subunit-issuer, e.g. test-core14ljz…) — non-native; the bridge resolves it to the registered smart-token.
msgs[].value.amount[].amountstringRequiredToken amount in base units ("1000000" = 1 token @ 6 decimals).
fee.amount[].denomstringRequiredFee is always paid in native ucore, not the token.
account_number / sequencestringRequired-RealReal, current values — the app must supply them; not auto-filled.
memostringOptionalOptional.

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": ""
}
FieldTypeRequiredNotes
chain_idstringRequiredCosmos SDK chain id (bare, not CAIP), e.g. hippo-protocol-1.
account_number / sequencestringRequired-RealReal, current values — the app must supply them; not auto-filled.
fee.amount[].denomstringRequiredFee denom — native ahp.
fee.amount[].amount / fee.gasstringRequiredFee amount and gas limit, base units.
msgs[].typestringRequiredcosmos-sdk/MsgSend — bank send.
msgs[].value.from_addressstringRequired-RealDevice Hippo account that signs (hippo1…).
msgs[].value.to_addressstringRequiredRecipient address (hippo1…).
msgs[].value.amount[].denomstringRequiredNative transfer denom ahp.
msgs[].value.amount[].amountstringRequiredValue in base units.
memostringOptionalOptional 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": ""
}
FieldTypeRequiredNotes
token.contractstringRequiredAssetFT denom / contract to send; used verbatim as the MsgSend denom. Unregistered tokens allowed.
token.tostringRequiredRecipient (core1…).
token.amountstringRequiredAmount in base units (not rescaled by decimals).
token.decimalsnumberRequiredBase-unit exponent; enables descriptor resolution (no on-chain RPC).
token.symbolstringOptionalDisplay metadata only.
fromstringRequired-RealDevice Coreum account that signs (read-only signer).
chain_idstringRequiredcoreum-mainnet-1 — Coreum mainnet (slip44:990) required.
account_number / sequencestringRequired-RealReal, current values — the app must supply them; not auto-filled.
fee.amount[].denom / amount / gasstringRequiredFee in native ucore.
memostringOptionalOptional.
info

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

danger

Sender not on-chain — REST lookup 404s for unfunded accounts. Amounts not in micro-units (uatom).