Skip to content

Gas & fees ​

The numbers ​

ParameterValue
Minimum gas price5000000bkc per gas (5 × 10⁻¹² BKC)
Fee-market base feestarts at 5,000,000 and never falls below it (EIP-1559 floor)
Max gas per transaction30,000,000
Max gas per block200,000,000
ML-DSA signature verification6,000 gas

The fee is gas_limit × gas_price, paid in bkc on the Cosmos side and charged at the gas limit you declare, not the gas used. Declare a sensible limit.

SDK constant

bkcChain.gasPrice in @bkc-network-lib/sdk (66,666,666,667) is a stale default, about 13,000× the chain minimum, and the SDK uses it whenever you omit gasPrice. Transactions still go through — they just cost that much more. Pass the network's minimum explicitly: gasPrice: "5000000bkc" (Hardhat) or GasPrice.fromString("5000000bkc") (SDK). The node's minimum can change when the chain is rebuilt; bkc-doctor (Hardhat) prints the price in use.

Why gas numbers look large ​

Gas is charged per transaction byte, and an ML-DSA-65 transaction is big:

Size
Public key1,952 B
Signature3,309 B
Typical signed transfer~5.5 KB

So even a native transfer uses about 230,000–285,000 gas, against 21,000 on Ethereum. The price per gas is low to compensate.

OperationGas used (measured)Fee at the minimum price
Native transfer (MsgSend)~257,000~0.0000013 BKC
Undelegate~447,000~0.0000022 BKC
ERC-20 deployment (wrapped)~670,000~0.0000034 BKC
ERC-721 deployment with metadata (wrapped)~1,970,000~0.0000099 BKC

Budgeting a wrapped EVM call ​

A MsgExecuteEvmCall needs two gas figures:

  • EVM gas_limit — what the contract execution may use; estimate it with eth_estimateGas and add headroom (withGasHeadroom() in the SDK).
  • Cosmos gas — must cover the signed envelope plus the EVM budget. The SDK's cosmosGasForEvmCall(evmGas) adds a 600,000 base.
ts
import { cosmosGasForEvmCall, withGasHeadroom } from "@bkc-network-lib/sdk";

const evmGas = withGasHeadroom(await provider.estimateGas(tx));
const cosmosGas = cosmosGasForEvmCall(evmGas);

Gas cannot be simulated on BKC: the chain rejects SIGN_MODE_UNSPECIFIED, which Cosmos simulation uses. --gas auto in the CLI does not work; budget explicitly (bkcChain.isSimulable === false).

What a receipt shows ​

receipt.gasUsed is the EVM gas used. receipt.fee is 0, because nothing was paid on the EVM side. The real charge:

ts
import { getEvmTransactionCost } from "@bkc-network-lib/sdk";

const cost = await getEvmTransactionCost(receipt.hash, "https://api.bkc.network");
// fee actually charged, the Cosmos tx hash and its gas

BKC testnet is unaudited. Do not hold value on it.