Kava (Cosmos)

Overview

KAVA is the native asset of the Kava Chain blockchain. It utilizes:

  • Account model
  • EcDSA signature algorithm

The Kava Chain is a Cosmos SDK-based Layer 1 blockchain that co-chains a Cosmos SDK environment with an EVM-compatible environment. It uses CometBFT (Tendermint) consensus with a delegated proof-of-stake (DPoS) model. KAVA is used to pay transaction fees, secure the network through staking, and participate in on-chain governance.

Explorer

https://www.mintscan.io/kava/

Wallets Types

BitGo enables holding KAVA in the following wallet types:

Multisig ColdMultisig HotMPC ColdMPC Hot
Custodial
Self Managed

Ticker Symbols

MainnetTestnet
kavacosmostkavacosmos

Faucet

Testnet KAVA can be requested from the Kava testnet faucet.

Units

KAVA is divisible by 10-6 and the base unit is ukava (microkava):

  • 1 KAVA = 1,000,000 ukava
  • 1 ukava = 0.000001 KAVA

KAVA balances can be in either integer or string format. However, BitGo recommends using string format to ensure values don't exceed the programmable number limit.

Tokens

The Kava Chain blockchain doesn't natively support tokens.

Fees

Kava Chain fees are dynamic - there are no minimum or default fee rates.

Address Format

Kava Chain addresses follow the format: kava1<38-character-bech32-body>. All addresses are exactly 43 characters in length and begin with the fixed prefix kava1. This format adheres to the following regular expression:

/^(kava)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38})$/

Memo ID Support

  • Optionally, a ?memoId=<n> query parameter can be appended to the address for use cases such as identifying transaction metadata. Here, <n> can be any integer.
  • Using memoId-based addressing eliminates the need to generate multiple deposit addresses per user. A single static address can be reused safely across users and use cases, with the memoId serving as the unique identifier.
  • Since the Kava Chain uses memoId-based receive addresses, manual consolidation is not required.

Create Wallet

export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tkavacosmos"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export LABEL="<DESIRED_WALLET_NAME>"
export PASSPHRASE="<YOUR_BITGO_LOGIN_PASSPHRASE>"
export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"

curl -X POST \
  http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/generate \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "label": "'"$LABEL"'",
    "passphrase": "'"$PASSPHRASE"'",
    "enterprise": "'"$ENTERPRISE_ID"'",
    "disableTransactionNotifications": true,
    "disableKRSEmail": true
}'
const { BitGo } = require('bitgo');

const accessToken = '<YOUR_ACCESS_TOKEN>';

// Initialize the SDK
const bitgo = new BitGo({
  accessToken: accessToken,
  env: 'test',
});

// Generate hot wallet
async function createHotWalletSimple() {
  const newWallet = await bitgo.coin('tkavacosmos').wallets().generateWallet({
    label: '<DESIRED_WALLET_NAME>',
    passphrase: '<YOUR_BITGO_LOGIN_PASSWORD>',
  });

  console.log(JSON.stringify(newWallet, undefined, 2));
}

Create Address

export COIN="tkavacosmos"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"

curl -X POST \
  https://app.bitgo-test.com/api/v2/$COIN/wallet/$WALLET_ID/address \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN"
const { BitGo } = require('bitgo');
const accessToken = '<YOUR_ACCESS_TOKEN>';

// Initialize the SDK
const bitgo = new BitGo({
  accessToken: accessToken,
  env: 'custom',
  customRootURI: 'https://app.bitgo.com',
});

// Create address
const wallet = await bitgo.coin('tkavacosmos').wallets().generateWallet({
  label: '<DESIRED_WALLET_NAME>',
  passphrase: '<YOUR_BITGO_LOGIN_PASSPHRASE>',
});

const address = await wallet.createAddress();

// Print address details
console.log(JSON.stringify(address, undefined, 2));

Estimate Fee

export COIN="tkavacosmos"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"

curl -X GET \
  https://app.bitgo-test.com/api/v2/$COIN/tx/fee \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN"
const BitGoJS = require('bitgo');
const bitgo = new BitGoJS.BitGo({ env: 'test' });
const accessToken = '<YOUR_ACCESS_TOKEN>';
const coin = 'tkavacosmos';

async function getFeeEstimate() {
  try {
    await bitgo.authenticateWithAccessToken({ accessToken });
    const res = await bitgo.coin(coin).feeEstimate({ numBlocks: 2 });
    console.dir(res);
  } catch (err) {
    console.error('Error fetching fee estimate:', err);
  }
}
getFeeEstimate();

Transact

export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tkavacosmos"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export ADDRESS="<DESTINATION_ADDRESS>"
export AMOUNT="<AMOUNT_IN_BASE_UNITS>"
export WALLET_PASSPHRASE="<YOUR_WALLET_PASSPHRASE>"

curl -X POST \
  http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/$WALLET_ID/sendcoins \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "address": "'"$ADDRESS"'",
    "amount": "'"$AMOUNT"'",
    "walletPassphrase": "'"$WALLET_PASSPHRASE"'"
}'
export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tkavacosmos"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export ADDRESS_1="<DESTINATION_ADDRESS_1>"
export ADDRESS_2="<DESTINATION_ADDRESS_2>"
export AMOUNT_1="<AMOUNT_1_IN_BASE_UNITS>"
export AMOUNT_2="<AMOUNT_2_IN_BASE_UNITS>"
export WALLET_PASSPHRASE="<YOUR_WALLET_PASSPHRASE>"

curl -X POST \
  http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/$WALLET_ID/sendmany \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "recipients": [
      {
        "address": "'"$ADDRESS_1"'",
        "amount": "'"$AMOUNT_1"'"
      },
      {
        "address": "'"$ADDRESS_2"'",
        "amount": "'"$AMOUNT_2"'"
      }
    ],
    "walletPassphrase": "'"$WALLET_PASSPHRASE"'"
}'
const tx = await fundedWallet.send({
  address: `<DESTINATION_ADDRESS>`,
  amount: `<AMOUNT>`,
  walletPassphrase: process.env.PASSWORD as string,
});
let params = {
  recipients: [
    {
      amount: "<AMOUNT_1>",
      address: "<DESTINATION_ADDRESS_1>",
    },
    {
      amount: "<AMOUNT_2>",
      address: "<DESTINATION_ADDRESS_2>",
    },
  ],
  walletPassphrase: "<YOUR_WALLET_PASSPHRASE>",
};
wallet.sendMany(params).then(function (transaction) {
  // Print transaction details
  console.dir(transaction);
});