Repository navigation
Binaries for ZIGChain v6.0.0. The commit and tree hash below are in its source repository, which is not public yet.
What's Changed
- Feat: EVM - The chain runs an Ethereum Virtual Machine (
cosmos/evmv0.6.4-rc4) alongside CosmWasm. Consensus-breaking — the v6 upgrade adds thex/vm,x/feemarket,x/erc20andx/wasmxmodules.- Before: contracts were CosmWasm only, and there was no Ethereum JSON-RPC.
- After: the EVM chain ID is 944 on mainnet (
zigchain-1) and 2061 on testnet (zig-test-2). Native ZIG is the EVM's native coin at 18 decimals, so an account has one balance on both sides. - After: Ethereum JSON-RPC is off by default. Enable it with
[json-rpc] enableinapp.toml; it also needs the gRPC server ([grpc] enable), becauseeth_call,eth_estimateGasanddebug_trace*are served over gRPC only. - After: JSON-RPC queries are bounded.
eth_callandeth_estimateGasrun on at mostjson-rpc.gas-cap(25,000,000 by default), whatever gas the request asks for, and a trace may execute at most the larger of that cap and the block gas limit.debug_trace*with the default struct logger refusesenableMemoryandenableReturnData, records at most 16 MiB, and traces a block of at most 64 transactions; larger traces need a tracer such ascallTracer. The trace timeout is at most 5 s. - After: precompiles let Solidity call bank, staking, distribution, gov, slashing, ICS-20, bech32, p256 and
x/factory. The factory precompile covers create, mint, burn and the admin and metadata changes (updateDenomURI,updateDenomMintingCap,updateDenomMetadataAuth,setDenomMetadata), with the same authorisation and limits as the Cosmos message. - After: every factory denom gets an ERC-20 twin when it is created. Existing denoms get one from a curated list in the v6 upgrade or through governance; IBC transfers never create one. Wrapped ZIG (WZIG) is an ERC-20 over the native ZIG balance, so there is nothing to wrap or unwrap.
- After: deploying an EVM contract is allowlisted:
CREATEsucceeds only when the signer or the contract executing it is on thex/vmCREATE allowlist, which the v6 upgrade sets per network and governance can change. Transactions signed without a chain ID (pre-EIP-155) are rejected. - After: Ethereum wallets can sign Cosmos transactions with EIP-712 (
eth_signTypedData_v4), andx/wasmxaddsMsgExecuteContractEIP712, a wrapper aroundMsgExecuteContractthat MetaMask can render, so CosmWasm contracts can be called from MetaMask. A transaction signed this way is rejected if it setstimeout_timestamp,unorderedor a fee granter, because those fields are not part of the signed typed data. - Impact: integrators can use Ethereum wallets and tooling (MetaMask, Foundry, Hardhat). Operators who serve JSON-RPC must enable it together with the gRPC server.
- Change: Fees - Cosmos (non-EVM) transactions pay the EIP-1559 base fee from
x/feemarket, which rises when blocks are busy, instead of a fixed minimum gas price. Consensus-breaking — the fee check now runs against on-chain parameters.- Before: each validator's
minimum-gas-pricesinapp.tomlset the fee it accepted; the chain had no minimum of its own. - After: a transaction's fee must be a single
azigcoin of at least gas limit × current base fee. The base fee starts at, and never falls below, 2.5e9azigper gas (2.5 gwei, the same cost in ZIG as the pre-v5 0.0025uzig), and moves by up to 1/8 per block toward a target of half the block gas limit. The node-localminimum-gas-pricesno longer applies. - Impact: wallets and clients that set a fixed gas price at the floor will see transactions rejected when blocks are busy. Read the current base fee (
/cosmos/evm/feemarket/v1/base_fee, oreth_gasPriceover JSON-RPC) and price above it.
- Before: each validator's
- Change: Queries - Queries are bounded so that they cannot stall block processing. Not consensus-breaking — query serving only, no state change.
- Before: a query's gas was unbounded when
query-gas-limitinapp.tomlwas 0 (the default), andabci_queryserved/store/<name>/subspacescans of a whole prefix. - After: with
query-gas-limitat 0, a query is capped at 50,000,000 gas; set a value to override it./store/<name>/subspaceis refused; single-key/store/<name>/keylookups, which IBC relayers use, still work. - Impact: API and indexer clients that page through very large result sets in one request, or use subspace store queries, must use smaller pages, and subspace scans must switch to the gRPC queries.
- Before: a query's gas was unbounded when
- Change: IBC - ICS-20 sends now go through the IBC callbacks middleware. Consensus-breaking — the send path runs a new check.
- Before: sends skipped the callbacks middleware, but acks and timeouts went through it, so a transfer with a malformed
src_callbackmemo locked its funds in escrow when its ack or timeout failed there. - After: a malformed callback memo fails at send, and wasmd rejects any
src_callbackwhose address is not the contract sending the packet. A plain account or a different contract set assrc_callbacknow makes the send fail instead of locking the funds.
- Before: sends skipped the callbacks middleware, but acks and timeouts went through it, so a transfer with a malformed
- Change: Governance - Voting needs at least 1 ZIG bonded to active validators, or operating a bonded validator. Consensus-breaking — votes below the threshold are rejected.
- Before: any account with 1 azig bonded could vote, so spam votes cost one delegation each and every one was walked in the tally block.
- After: a voter needs 1 ZIG delegated to bonded validators, summed across them, as Gaia v15 requires 1 ATOM. Operators of bonded validators vote regardless of their self-bond, since their vote carries their delegators' stake. Below the threshold, a vote fails with
no voting poweron every path (tx, authz, wasm, ICA, EVM precompile), and the delegator's stake still follows its validator's vote.
- Change: Bank - The
govandx/factorymodule accounts are blocked as send recipients. Consensus-breaking — a send that v5 accepted now fails.- Before:
govwas deliberately left open to receive funds;x/factorywas not blocked either. - After: a bank send, IBC transfer or contract message that credits either account fails. Deposits and fees that the modules collect themselves are unaffected.
- Impact: anything that sends funds directly to the
govorx/factorymodule address must stop doing so.
- Before:
- Change: Vesting - Vesting accounts can be created only by a top-level
MsgCreateVestingAccount,MsgCreatePeriodicVestingAccountorMsgCreatePermanentLockedAccountin a transaction. Consensus-breaking — those messages are rejected on paths that v5 accepted.- Before: they could also arrive inside
authzMsgExec, be dispatched by a CosmWasm contract, or be executed by the ICA host. - After: on those three paths they fail.
- Before: they could also arrive inside
- Change: CosmWasm - Contract binding messages (
x/factory,x/dex) are dispatched through the message router, like any other Cosmos message. Consensus-breaking — gas use and results of contract executions change.- Before: a binding message called the module's Msg server directly, skipping the router.
- After: each binding message runs
ValidateBasicand the circuit-breaker check, and the router's gas accounting and error messages apply. Thex/factorydenom query response keeps its v5 fields, so contracts already deployed withzbindings0.1.0 still decode it; the remaining budget isminting_cap - minted. - Impact: contracts that match on binding error strings or rely on exact gas use should be re-tested.
- Feat: CosmWasm - New
x/factorybindingsdisable_denom_admin(permanently removes a denom's bank admin) andwithdraw_module_fees(withdraws the factory module fees to a receiver). Consensus-breaking — new contract messages. - Feat: IBC - The
08-wasmlight client is enabled, so IBC light clients compiled to Wasm can be used. Consensus-breaking — the v6 upgrade adds the08-wasmstore and module. Light client code is pinned when the node starts and is included in state sync snapshots. - Chore: Dependencies -
go.opentelemetry.io/otel/sdkv1.44.0→v1.45.0(CVE-2026-81870). Not consensus-breaking — no state-machine code path changes. - Chore: Toolchain - Go
1.25.13→1.26.9.go.moddeclaresgo 1.26.9, and the release binaries are built with it. Not consensus-breaking on its own — no state-machine code path changes, and every validator moves to it with the v6 binary at the upgrade height.- Impact: building
zigchaindfrom source needs Go 1.26.9 or later. An oldergodownloads 1.26.9 by itself, unlessGOTOOLCHAIN=localis set, in which case the build fails.
- Impact: building
- Fix: Security - Bumped
cosmos/evmfromv0.6.3tov0.6.4-rc4, a security release. Consensus-breaking — ships with the v6 upgrade. The details follow once upstream publishes its advisories.- Impact: run the
v6.0.0release binaries. The source of this release is not public yet, so it cannot be built from source.
- Impact: run the
- Change: Keys -
keys addnow derives at coin type 60 witheth_secp256k1by default, so one mnemonic gives the same key and address inzigchaindand MetaMask. Not consensus-breaking — client-side derivation only. No chain state, no existing account and no existing keyring entry is affected.- Before:
keys addderived at coin type 118 withsecp256k1. - After:
keys addderives at coin type 60 witheth_secp256k1.--legacyselects the old derivation (coin type 118 andsecp256k1). - Impact: to recover a key created before v6, add
--legacy(zigchaind keys add <name> --recover --legacy). Without it the same mnemonic recovers a different, empty address.
- Before:
- Fix:
x/factory- The minting cap is now a lifetime issuance budget, charged once when a token is minted. Consensus-breaking and state-migrating — factoryConsensusVersion3 → 4, applied by the v6 upgrade handler's existingRunMigrations. - Docs: Regenerate the OpenAPI/Swagger spec (
docs/static/openapi.yml, served at/static/openapi.yml) from the v6 protos, including the EVM stack, and make the regeneration reproducible. Not consensus-breaking — documentation and tooling only, no Go code path changes.- Before: the spec last matched the protos in December 2025. It documented no EVM endpoint at all, missed
/zigchain/factory/proposed_denom_auth/{denom}, still carried the pre-v5uint32descriptions fordex.Params.creation_feeandfactory.Params.create_fee_amount, and carried none of the v5 proto documentation (theazigwidening notes, the sorted-denom warning onMsgAddLiquidityResponse.actual_base/actual_quote). The twocreation_feetype lines had been hand-patched tostringrather than regenerated. - After: 448 paths and 897 definitions, generated by
sh/generate_openapi.sh. 52 paths added, none dropped. The additions include 32 EVM paths —x/vm(eth_call,estimate_gas,trace_*, account/storage/code queries),x/feemarket(base_fee,block_gas, params) andx/erc20(token pairs,convert_coin,convert_erc20) — plus the v6 chain protoszigchain.wasmx.MsgExecuteContractEIP712andzigchain.factory.MsgRegisterNativeERC20.docs/static/openapi_full.ymlanddocs/static/openapi.ymlstay byte-identical. - Also corrected:
/ibc/apps/transfer/v1/denoms/{denom}/total_escrowbecomes/ibc/apps/transfer/v1/total_escrow/{denom}. This is not a route change in this release — ibc-go renamed it upstream and the committed spec had never been regenerated against it, so the old spec advertised a route the node does not serve. - Known gap: ignite emits every proto in a discovered dependency, not only the modules this app wires. The spec therefore documents
/cosmos/evm/precisebank/*, whichapp/evm.goleaves unwired, plusprotocolpool,epochs, the SDK'sbenchmark/countertest modules and/cosmos/group/v1/*(removed in v5), none of which this chain serves. That predates this change and is left for a follow-up decision on a prune list.
- Before: the spec last matched the protos in December 2025. It documented no EVM endpoint at all, missed
Source
Built from commit 81af3b281338487d1c6e17993754f45f9fd974db at v6.0.0. zigchaind version --long lists github.com/cosmos/evm v0.6.3 replaced by v0.6.4-rc4: the replacement is the cosmos/evm security release this binary is built with, so seeing v0.6.3 there is expected.
Source tree hash: 9a84bbe48256b62d365ccc5776ef8387993abe91
Verifying this release
The source of this release is not public yet. With access to it, reproduce the tree with:
git clone --depth 1 --branch v6.0.0 git@github.com:ZIGChain/zigchain-private.git
git -C zigchain-private rev-parse 'HEAD^{tree}'
Expected: 9a84bbe48256b62d365ccc5776ef8387993abe91
Checksums
ceff75bf49772b5eca8f4d27e3d468530f7fbb03c06e341556736b49757dc95f zigchaind-v6.0.0-darwin-amd64
e37dc2a8b12a2d2d226bb766651b0342bc71d6cccd424bb13b10f22240951b8f zigchaind-v6.0.0-darwin-amd64.tar.gz
b18d8dcaf8c90a23cc5cfb1d0abbcf2b1c6cb5d90435e04c3b62237a62d9c498 zigchaind-v6.0.0-darwin-arm64
7233dd163f6f5e04aaecc3b63091b96babb03d265ea432fa140579ccdf6842d1 zigchaind-v6.0.0-darwin-arm64.tar.gz
71fd297f03f0c5be7121a6cd17a74d75e71126c928b8834f4a3f3d2cfe97a152 zigchaind-v6.0.0-linux-amd64
4373e53d7a05ff0f50037a1cd83801d5f0d972207e7ff50f3cc5d8ded62867a4 zigchaind-v6.0.0-linux-amd64.tar.gz