Skip to content

ZIGChain v6.0.0 - Whirlpool

Latest

Choose a tag to compare

@cosmic-vagabond cosmic-vagabond released this 26 Oct 21:02
3d15f26

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/evm v0.6.4-rc4) alongside CosmWasm. Consensus-breaking — the v6 upgrade adds the x/vm, x/feemarket, x/erc20 and x/wasmx modules.
    • 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] enable in app.toml; it also needs the gRPC server ([grpc] enable), because eth_call, eth_estimateGas and debug_trace* are served over gRPC only.
    • After: JSON-RPC queries are bounded. eth_call and eth_estimateGas run on at most json-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 refuses enableMemory and enableReturnData, records at most 16 MiB, and traces a block of at most 64 transactions; larger traces need a tracer such as callTracer. 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: CREATE succeeds only when the signer or the contract executing it is on the x/vm CREATE 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), and x/wasmx adds MsgExecuteContractEIP712, a wrapper around MsgExecuteContract that MetaMask can render, so CosmWasm contracts can be called from MetaMask. A transaction signed this way is rejected if it sets timeout_timestamp, unordered or 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-prices in app.toml set the fee it accepted; the chain had no minimum of its own.
    • After: a transaction's fee must be a single azig coin of at least gas limit × current base fee. The base fee starts at, and never falls below, 2.5e9 azig per gas (2.5 gwei, the same cost in ZIG as the pre-v5 0.0025 uzig), and moves by up to 1/8 per block toward a target of half the block gas limit. The node-local minimum-gas-prices no 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, or eth_gasPrice over JSON-RPC) and price above it.
  • 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-limit in app.toml was 0 (the default), and abci_query served /store/<name>/subspace scans of a whole prefix.
    • After: with query-gas-limit at 0, a query is capped at 50,000,000 gas; set a value to override it. /store/<name>/subspace is refused; single-key /store/<name>/key lookups, 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.
  • 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_callback memo 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_callback whose address is not the contract sending the packet. A plain account or a different contract set as src_callback now makes the send fail instead of locking the funds.
  • 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 power on every path (tx, authz, wasm, ICA, EVM precompile), and the delegator's stake still follows its validator's vote.
  • Change: Bank - The gov and x/factory module accounts are blocked as send recipients. Consensus-breaking — a send that v5 accepted now fails.
    • Before: gov was deliberately left open to receive funds; x/factory was 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 gov or x/factory module address must stop doing so.
  • Change: Vesting - Vesting accounts can be created only by a top-level MsgCreateVestingAccount, MsgCreatePeriodicVestingAccount or MsgCreatePermanentLockedAccount in a transaction. Consensus-breaking — those messages are rejected on paths that v5 accepted.
    • Before: they could also arrive inside authz MsgExec, be dispatched by a CosmWasm contract, or be executed by the ICA host.
    • After: on those three paths they fail.
  • 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 ValidateBasic and the circuit-breaker check, and the router's gas accounting and error messages apply. The x/factory denom query response keeps its v5 fields, so contracts already deployed with zbindings 0.1.0 still decode it; the remaining budget is minting_cap - minted.
    • Impact: contracts that match on binding error strings or rely on exact gas use should be re-tested.
  • Feat: CosmWasm - New x/factory bindings disable_denom_admin (permanently removes a denom's bank admin) and withdraw_module_fees (withdraws the factory module fees to a receiver). Consensus-breaking — new contract messages.
  • Feat: IBC - The 08-wasm light client is enabled, so IBC light clients compiled to Wasm can be used. Consensus-breaking — the v6 upgrade adds the 08-wasm store and module. Light client code is pinned when the node starts and is included in state sync snapshots.
  • Chore: Dependencies - go.opentelemetry.io/otel/sdk v1.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.mod declares go 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 zigchaind from source needs Go 1.26.9 or later. An older go downloads 1.26.9 by itself, unless GOTOOLCHAIN=local is set, in which case the build fails.
  • Fix: Security - Bumped cosmos/evm from v0.6.3 to v0.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.0 release binaries. The source of this release is not public yet, so it cannot be built from source.
  • Change: Keys - keys add now derives at coin type 60 with eth_secp256k1 by default, so one mnemonic gives the same key and address in zigchaind and MetaMask. Not consensus-breaking — client-side derivation only. No chain state, no existing account and no existing keyring entry is affected.
    • Before: keys add derived at coin type 118 with secp256k1.
    • After: keys add derives at coin type 60 with eth_secp256k1. --legacy selects the old derivation (coin type 118 and secp256k1).
    • 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.
  • Fix: x/factory - The minting cap is now a lifetime issuance budget, charged once when a token is minted. Consensus-breaking and state-migrating — factory ConsensusVersion 3 → 4, applied by the v6 upgrade handler's existing RunMigrations.
  • 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-v5 uint32 descriptions for dex.Params.creation_fee and factory.Params.create_fee_amount, and carried none of the v5 proto documentation (the azig widening notes, the sorted-denom warning on MsgAddLiquidityResponse.actual_base/actual_quote). The two creation_fee type lines had been hand-patched to string rather 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) and x/erc20 (token pairs, convert_coin, convert_erc20) — plus the v6 chain protos zigchain.wasmx.MsgExecuteContractEIP712 and zigchain.factory.MsgRegisterNativeERC20. docs/static/openapi_full.yml and docs/static/openapi.yml stay byte-identical.
    • Also corrected: /ibc/apps/transfer/v1/denoms/{denom}/total_escrow becomes /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/*, which app/evm.go leaves unwired, plus protocolpool, epochs, the SDK's benchmark/counter test 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.

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