Gas & fees
The numbers
| Parameter | Value |
|---|---|
| Minimum gas price | 5000000bkc per gas (5 × 10⁻¹² BKC) |
| Fee-market base fee | starts at 5,000,000 and never falls below it (EIP-1559 floor) |
| Max gas per transaction | 30,000,000 |
| Max gas per block | 200,000,000 |
| ML-DSA signature verification | 6,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 key | 1,952 B |
| Signature | 3,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.
| Operation | Gas 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 witheth_estimateGasand 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.
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:
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