← Protocols
Kava
01Description

Kava is a Cosmos SDK Layer-1 with a co-chain architecture: a Cosmos co-chain (CosmWasm + Cosmos modules) and an EVM co-chain (Solidity + Ethereum JSON-RPC) running in parallel and bridged by an internal Translator module. Developers can target either environment from a single chain, share liquidity, and pay gas in KAVA on either side.

02Best for
  • 01deploying Solidity contracts inside a Cosmos chain
  • 02bridging EVM dApps into the Cosmos IBC ecosystem
  • 03DeFi protocols needing both Cosmos and EVM access
  • 041-block-finality EVM execution (~6s blocks)
  • 05EVM apps that consume Cosmos IBC assets natively
03Install
  • pnpm add viem @cosmjs/stargate @cosmjs/proto-signing ethers
04Environment variables
VariableScopeDescription
KAVA_EVM_RPC_URLClientKava EVM JSON-RPC endpoint (e.g., `https://evm.kava.io`, chainId `2222`). Used by viem/ethers/wagmi for the EVM co-chain.
KAVA_COSMOS_RPC_URLClientKava Cosmos Tendermint RPC endpoint (e.g., `https://rpc.kava.io`). Used by CosmJS for the Cosmos co-chain.
05Prompt snippet
For the EVM co-chain (chainId `2222`) treat Kava as a normal EVM chain: use `viem` with `createPublicClient({ transport: http(process.env.KAVA_EVM_RPC_URL), chain: { id: 2222, name: 'Kava EVM', nativeCurrency: { symbol: 'KAVA', decimals: 18 }, rpcUrls: { default: { http: [...] } } } })` and standard wagmi connectors. For the Cosmos co-chain use `@cosmjs/stargate`: `SigningStargateClient.connectWithSigner(rpcEndpoint, signer, { gasPrice: GasPrice.fromString('0.025ukava') })`. To move assets between co-chains, send to the Translator module: from EVM, send KAVA to the precompiled `0x...cosmos-conversion` address with a Cosmos bech32 recipient encoded in calldata; from Cosmos, use `MsgConvertCoin` / `MsgConvertERC20` from the `x/evmutil` module. EVM-side ERC-20 reps of Cosmos coins use module-account precompiles — read mappings from `x/evmutil` queries before assuming an address.
06Gotchas
  • Cosmos-coin → ERC-20 conversions are NOT 1:1 in decimals: native Cosmos `ukava` is 6 decimals, EVM-side `wKAVA` is 18 decimals. The Translator handles scaling, but if you read raw values you'll be off by 12 orders of magnitude. Always use `evmutil` query helpers, never raw arithmetic.
  • Two address formats: same private key produces a Cosmos `kava1...` bech32 AND an EVM `0x...` hex address that map to the SAME account via Eth-Secp256k1 keys. Show both in UI; users frequently confuse them and send to wrong-format counterparties.
  • Chain upgrades coordinate BOTH co-chains atomically. After an upgrade (e.g., Kava 14, 15, 16), bump RPC client versions; old viem chain configs may have stale fee or precompile addresses.
  • IBC channel maintenance: Kava is IBC-connected as a Cosmos chain; channels to Hub/Osmosis/etc follow the standard 14-day trusting period. Light-client expiry freezes IBC (and any EVM dApp depending on IBC-routed assets) until governance unfreezes.
  • Slashing on KAVA validators: 5% double-sign, downtime jail with 0.01% slash — affects only Cosmos-staked KAVA, NOT EVM-side balances. Diversify validator selection.
  • Gas token is `ukava` (Cosmos) / `KAVA` 18-decimal native (EVM). EVM dApps cannot pay gas with IBC tokens directly without first converting to KAVA. Prefund users with KAVA dust (often via faucet integration) to avoid stuck txs.
  • EIP-1559 support on Kava EVM is enabled but base-fee dynamics differ from Ethereum mainnet — fee estimation libs that hard-code Ethereum constants (e.g., fixed priority fee floors) over-pay; query `eth_maxPriorityFeePerGas` directly.
  • CosmWasm is supported on the Cosmos co-chain since Kava 14; pin `cosmwasm-std` to the version listed in `docs.kava.io/cosmwasm` per chain release.
07Alternatives