Skip to main content

Cosmos (ATOM)

Sign Cosmos SDK transactions from an Amino SignDoc. The bridge accepts the Amino input, re-encodes its fields as a Protobuf SignDoc and signs in SIGN_MODE_DIRECT. Fetch account_number / sequence from a REST endpoint yourself — the bridge never does. DCENT signs the amounts, addresses, account_number, sequence and chain_id exactly as sent (a non-string chain_id is signed as an empty string), so placeholder values produce a signature that cannot be broadcast (see the field table). chain_id is not checked against your request chainId — keep them consistent. The fee denom and a native transfer denom are not read: the bridge always uses the chain's base denom (uatom / ucore / ahp; utestcore on Coreum testnet); a token denom (any denom containing /, such as ibc/… or factory/…, or an AssetFT subunit-issuer) is used as the token, and it must resolve to a token DCENT supports (or a Coreum form-D descriptor), otherwise -32602.

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

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.21.0 or higher1.0.0 or higher
signTransaction2.21.0 or higher1.0.0 or higher
info

Firmware versions above 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 (the pubkey field may be empty — use getPublicKey for the 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
body.parameter.addressstringbech32 account address (cosmos1… on the Hub)
body.parameter.pubkeyhex0x-prefixed. DCENT X returns it empty ("0x") — do not rely on it; use getPublicKey for the public key
{
"header": {
"version": "1.0",
"status": "success",
"response_from": "getAddress"
},
"body": {
"command": "getAddress",
"parameter": {
"address": "cosmos1…",
"pubkey": "0x"
}
}
}

signTransaction — Amino SignDoc​

payload.transaction:

{
"chain_id": "cosmoshub-4",
"account_number": "12345",
"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_idRequired-RealApp—e.g. cosmoshub-4. Not validated — signed as sent (an omitted or non-string value is signed as an empty string)
account_number / sequenceRequired-RealApp—Real, current values — the app must supply them; sender must exist on-chain
msgs[].value.from_addressRequired-RealWallet—Device cosmos account
msgs[].typeRequiredApp—cosmos-sdk/MsgSend or /cosmos.bank.v1beta1.MsgSend — another type, or more than one message, → -32601; missing → -32602
msgs[].value.to_addressRequiredApp—Recipient (cosmos1…). Missing → -32602
amount[].amountRequiredAppuatom1 ATOM = 1e6. Exactly one coin — more than one → -32602
amount[].denom / fee.amount[].denom—App—Not read for a native transfer — uatom is always used
fee.amount[].amountOptionalAppuatomTotal fee. If omitted, the fee is signed as 0 — send a real fee
fee.gasRequiredApp—Gas limit. Missing → -32602
memoOptionalApp—

Response

FieldTypeNotes
header.statusstring"success" on completion
body.parameter.signaturestringDot-joined string <signature>.<pubkey>.<txRaw> from a SIGN_MODE_DIRECT (Protobuf SignDoc) signature, not a bare signature. The last part is the signed Protobuf TxRaw in hex — convert it to base64 and send it as tx_bytes to /cosmos/tx/v1beta1/txs to broadcast. The pubkey part can be empty
{
"header": {
"version": "1.0",
"status": "success",
"response_from": "signTransaction"
},
"body": {
"command": "signTransaction",
"parameter": {
"signature": "<signature>.<pubkey>.<txRaw hex>"
}
}
}

signTransaction — other networks & tokens​

The same Amino MsgSend envelope signs other Cosmos SDK chains and AssetFT tokens — the chain_id, the address prefix (cosmos1 / core1 / hippo1) and the token denom change. Fees stay in each chain’s native denom. Custom (unregistered) tokens use a compact token descriptor on Coreum only — an unregistered token on Cosmos Hub or Hippo Protocol is rejected with -32602.

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 — native (TX) transfer​

chainId cosmos:coreum-mainnet-1/slip44:990 · coinType 990 · keyPath m/44'/990'/0'/0/0 · denom ucore (1 TX = 1e6 ucore) · MsgSend

payload.transaction:

{
"chain_id": "coreum-mainnet-1",
"account_number": "12345",
"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_idstringRequired-RealCosmos SDK chain id (bare, not CAIP), e.g. coreum-mainnet-1. Not validated — an omitted or non-string value is signed as an empty string.
account_number / sequencestringRequired-RealReal, current values — the app must supply them; not auto-filled.
fee.amount[].denomstring—Not read — the fee is always in native ucore.
fee.amount[].amount / fee.gasstringfee.gas Required (-32602 if missing); amount Optional (signed as 0 if omitted)Fee amount and gas limit, base units.
msgs[].typestringRequiredcosmos-sdk/MsgSend — bank send.
msgs[].value.from_addressstringRequired-RealDevice Coreum account that signs (core1…; testcore1… on Coreum testnet).
msgs[].value.to_addressstringRequiredRecipient address (core1…; testcore1… on Coreum testnet).
msgs[].value.amount[].denomstring—Not read for a native transfer — ucore is always used (1 TX = 1e6 ucore). A token denom makes it a token transfer (below).
msgs[].value.amount[].amountstringRequiredValue in base units.
memostringOptionalOptional Cosmos memo; empty string by default.

Coreum AssetFT (smart-token) transfer​

info

Token model: registered AssetFT denom. A token denom on DCENT's supported list is resolved from the registry and signed with its registered symbol and decimals. For a token that is not on the list, use the form-D descriptor below with decimals (Coreum only). 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 native 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": "12345",
"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_idstringRequired-Realcoreum-mainnet-1. Not validated — signed as sent (a non-string value is signed as an empty string).
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…; testcore1… on Coreum testnet).
msgs[].value.amount[].denomstringRequired-RealAssetFT token denom (subunit-issuer, e.g. test-core14ljz…) — non-native; the bridge resolves it to the registered smart-token. If omitted, the amount is signed as a native ucore transfer instead.
msgs[].value.amount[].amountstringRequiredToken amount in base units ("1000000" = 1 token @ 6 decimals).
fee.amount[].denomstring—Not read — the fee 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": "12345",
"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_idstringRequired-RealCosmos SDK chain id (bare, not CAIP), e.g. hippo-protocol-1. Not validated — an omitted or non-string value is signed as an empty string.
account_number / sequencestringRequired-RealReal, current values — the app must supply them; not auto-filled.
fee.amount[].denomstring—Not read — the fee is always in native ahp.
fee.amount[].amount / fee.gasstringfee.gas Required (-32602 if missing); amount Optional (signed as 0 if omitted)Fee 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[].denomstring—Not read for a native transfer — ahp is always used.
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). Coreum only — coreum-mainnet-1 or coreum-testnet-1; an unregistered token on Cosmos Hub or Hippo Protocol is rejected with -32602.

payload.transaction:

{
"token": {
"contract": "txd-core1pjt5jvv7dwmr5pfk5ecc5mc38rahas7d90vklk",
"to": "core1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdcyqx",
"amount": "1000000",
"decimals": 6,
"symbol": "TXD"
},
"from": "core1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdcyqx",
"chain_id": "coreum-mainnet-1",
"account_number": "12345",
"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…; testcore1… on Coreum testnet).
token.amountstringRequiredAmount in base units (not rescaled by decimals).
token.decimalsnumberOptional (Required for an unregistered token)Base-unit exponent; enables descriptor resolution (no on-chain RPC). An unregistered token without token.decimals is rejected with -32602.
token.symbolstringOptionalDisplay metadata only.
fromstringRequired-RealDevice Coreum account that signs (read-only signer).
chain_idstringRequired-Realcoreum-mainnet-1 (Coreum mainnet) or coreum-testnet-1 (Coreum testnet). Not validated — signed as sent (a non-string value is signed as an empty string).
account_number / sequencestringRequired-RealReal, current values — the app must supply them; not auto-filled.
fee.amount[].amount / fee.gasstringfee.gas Required (-32602 if missing); amount Optional (signed as 0 if omitted)Fee in the native denom — ucore, or utestcore on testnet (the fee denom is not read).
memostringOptionalOptional.
info

Signable scope — single bank MsgSend only. The bridge signs exactly one /cosmos.bank.v1beta1.MsgSend. It takes an Amino StdSignDoc (message type cosmos-sdk/MsgSend or /cosmos.bank.v1beta1.MsgSend) and signs it in SIGN_MODE_DIRECT. Protobuf SignDoc input (bodyBytes / authInfoBytes) is not supported: a message that is not a single MsgSend is rejected with -32601, and otherwise the request is rejected with -32602 unless you also send top-level account_number, sequence and fee.gas — in which case it is signed with sequence 0 and fee 0, which is not a valid transaction. Send an Amino StdSignDoc with top-level account_number / sequence. Token transfers reuse the same MsgSend, carrying the token's denom — DCENT's supported list holds Coreum AssetFT (subunit-issuer) tokens; any other denom needs a Coreum form-D descriptor. 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 msgs, missing from/to/amount) returns -32602, and a payload with neither msgs nor bodyBytes, and no string sender field, returns -32601. 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).