Deploying Smart Contracts to Cronos
Cronos is an EVM-compatible blockchain from Crypto.com built on Cosmos SDK with a Proof of Authority (transitioning to PoS) consensus mechanism. From a contract deployment perspective, it's a standard EVM chain, but there are nuances around the native token (CRO), RPC endpoints, and verification.
Network Parameters
| Parameter | Mainnet | Testnet |
|---|---|---|
| Chain ID | 25 | 338 |
| RPC | https://evm.cronos.org |
https://evm-t3.cronos.org |
| Explorer | cronoscan.com | testnet.cronoscan.com |
| Native token | CRO | TCRO |
| Block time | ~5.6 seconds | ~5.6 seconds |
Hardhat Configuration
// hardhat.config.ts
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import "@nomicfoundation/hardhat-verify";
const config: HardhatUserConfig = {
solidity: {
version: "0.8.20",
settings: {
optimizer: { enabled: true, runs: 200 },
},
},
networks: {
cronos: {
url: process.env.CRONOS_RPC ?? "https://evm.cronos.org",
chainId: 25,
accounts: [process.env.DEPLOYER_PRIVATE_KEY!],
gasPrice: 5000000000000, // 5000 gwei — Cronos uses high values
},
"cronos-testnet": {
url: "https://evm-t3.cronos.org",
chainId: 338,
accounts: [process.env.DEPLOYER_PRIVATE_KEY!],
},
},
etherscan: {
apiKey: {
cronos: process.env.CRONOSCAN_API_KEY!,
},
customChains: [
{
network: "cronos",
chainId: 25,
urls: {
apiURL: "https://api.cronoscan.com/api",
browserURL: "https://cronoscan.com",
},
},
],
},
};
Important about gasPrice: Cronos uses unusually high numeric values for gas price. Typical values of 5000+ gwei in Wei are normal, don't be alarmed. The actual transaction cost in USD is low due to CRO's price.
Getting Test Tokens
For Cronos Testnet (chainId 338), testnet TCRO is obtained through the official faucet: https://cronos.org/faucet. Limitation: one request per day per address.
Deployment and Verification
# Deploy via Hardhat
npx hardhat run scripts/deploy.ts --network cronos
# Verification
npx hardhat verify --network cronos DEPLOYED_ADDRESS "Constructor Arg"
# Foundry configuration
# foundry.toml
[profile.default]
solc_version = "0.8.20"
[rpc_endpoints]
cronos = "${CRONOS_RPC}"
cronos_testnet = "https://evm-t3.cronos.org"
[etherscan]
cronos = { key = "${CRONOSCAN_API_KEY}", url = "https://api.cronoscan.com/api" }
forge create src/MyContract.sol:MyContract \
--rpc-url cronos \
--private-key $DEPLOYER_PRIVATE_KEY \
--verify \
--etherscan-api-key $CRONOSCAN_API_KEY
Cronos Specifics
CRO as native token — in EVM contracts, CRO behaves like ETH. msg.value, address.transfer(), payable functions work standardly. Wrapped CRO (WCRO) is analogous to WETH.
Cosmos IBC integration — Cronos can receive assets from the Cosmos ecosystem via IBC. If a contract works with bridged Cosmos assets, note that addresses may be in Bech32 format at the Cosmos level, but in the EVM layer these are standard 0x addresses.
Finality — blocks finalize quickly (~5-6 seconds). For most dApps, 1-2 confirmations are sufficient.
Compatibility — full EVM equivalence. OpenZeppelin contracts, Uniswap v2/v3 forks, Chainlink Price Feeds (available on Cronos mainnet) — everything works without modifications.
Common Deployment Issues
Nonce issues — if a previous transaction got stuck, the next deployment fails with a nonce error. Solution: send an empty transaction with the same nonce and increased gas price to replace it.
RPC instability — the public RPC evm.cronos.org sometimes lags. For production, use paid nodes from Alchemy (Cronos support available) or Ankr.
Contract size limit — 24KB limit as on Ethereum. If exceeded, use the Diamond pattern (EIP-2535) or split into multiple contracts.







