ZIGChain Accounts
TL;DR: ZIGChain accounts are on-chain identities backed by a mnemonic, private and public keys, and a Bech32 address. This page explains how they work, how to create and recover them with
zigchaind, and how to query balances and send tokens safely.
Overview
ZIGChain accounts are the on-chain identities that hold tokens, sign transactions, and vote on governance. Each ZIGChain account links a mnemonic backup to private and public keys and to a Bech32 address peers use on chain. Builders usually start from a named key in the local keyring, then use the printed address in queries and sends.
This guide covers ZIGChain accounts end to end, from key parts and address prefixes to zigchaind create, recover, balance, and send flows. You can find command examples for mainnet, testnet, or local RPC. A dedicated section on security best practices covers mnemonic custody, key storage, and safe signing for production wallets.
For chain background see ZIGChain - What and Why?. For send fees see Gas Fees on ZIGChain. For the native asset see The ZIG Token. For shared vocabulary see ZIGChain Glossary. Those pages pair with ZIGChain accounts when you need economics, fee fields, or terminology outside this file.
Key Concepts
- Mnemonic phrase: A 12–24 word backup that can restore the private key and account if keys are lost.
- Private key: Signs transactions and proves control of the account; never share it or commit it to source control.
- Public key: Derived from the private key; used to build the account address and verify signatures.
- Bech32 address: The
zig1…identifier peers use for sends and balance queries on ZIGChain. - Keyring: Local key storage in
zigchaind; holds named keys created withkeys addor--recover. - HD wallet (BIP-32): Hierarchical scheme that derives multiple key pairs from one mnemonic seed.
ZIGChain Account Functionalities
Users can utilize their ZIGChain accounts for the following purposes:
- Digital Asset Management: Hold, send, and receive tokens and other digital assets.
- Staking: Stake tokens to participate in network governance and earn rewards while securing the network.
- Governance: Vote on proposals that shape the future of the ZIGChain ecosystem.
- Smart Contracts: Create and interact with on-chain applications (smart contracts) to enable decentralized functionalities.
- DApps: Engage with decentralized applications built on top of ZIGChain.
Core Components of ZIGChain Accounts
See Key Concepts above for definitions. The analogy below shows how mnemonic, keys, address, and keyring fit together on ZIGChain.
🔥 Example: Understanding account components
Consider the following analogy:
Imagine that you are the owner of a hotel, and you have a master key and the instructions to create the master key.
- The Mnemonic Phrase is like a set of instructions to recreate the master key for all rooms.
- The Private Master Key is the actual master key, giving you access to all rooms.
With the private master key you can create pairs of keys and locks (public and private keys) for each room in the hotel:
- The Public Key functions like a lock for each room.
- The Private Key acts as the key to open the lock.
- The Address represents the unique room number identifying each room.
Create ZIGChain Accounts With the CLI
🧑💻 To create a ZIGChain account using the ZIGChain CLI, run the following command:
zigchaind keys add <key-name>
Response example:
- address: zig1dtlhdqsmrwwc9t0es9pwh04x86rfh7c60d2222
name: <key-name>
pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AieWTW5gggcC4X43tZxE3fpaa/f0EiY666+cy8PPzzi"}'
type: local
Important: Store your Mnemonic Phrase securely. It is the only way to recover your account if you lose access.
Mnemonic: "word1 word2 word3 ... word24"
🧑💻 Extra Info: Accounts and HD System
ZIGChain uses a Hierarchical Deterministic (HD) system to generate the keys. Starting from a single seed, the HD system allows users to create multiple key pairs (public and private keys) with their addresses.
This enables:
- Efficient Key Management: HD wallets allow the generation of multiple keys from a single seed, requiring only one seed backup instead of storing individual keys.
- Privacy and Security: Generate unique keys for each transaction, enhancing privacy while maintaining easy recovery through the seed phrase.
- Structured Organization: Hierarchical design enables systematic key organization for different accounts and purposes.
ZIGChain Account Address Format
Every account on ZIGChain is identified by a unique address structured as follows:
zig1<account-address-38-characters>
Example:
zig1wze8mn5nsgl9qrgazq6a92fvh7m5e6psjcx2du
ZIGChain distinguishes between different address types using specific Bech32 prefixes:
- Account Address: identify users. Address Prefix:
zig1 - Validator Address: identify a validator node. Address Prefix:
zigvaloper1 - Consensus Address: identify a consensus node. Address Prefix:
zigvalcons1
Cryptography and Transaction Hashes
This section covers the algorithms that keep an account secure.
Your wallet handles all of it. Keplr, Ledger, and zigchaind apply these algorithms when you create an account or sign a transaction, so there is nothing for you to choose or set up. You may still come across the names in your wallet or in an explorer, so the table below explains what each one is for.
🧑💻 Extra Info: Which algorithm does what
| Role | Algorithm | What it is for |
|---|---|---|
| User account keys | secp256k1 | Signs the transactions you broadcast (sends, stakes, votes). Your private key stays in the wallet; validators check the signature against your public key and zig1 address. Wallets derive Cosmos accounts with BIP-44 coin type 118 — the same path Keplr and zigchaind use, so one mnemonic yields the same address across those tools. |
| Validator consensus keys | ed25519 | Used by validator nodes for CometBFT block proposal and voting. This is infrastructure cryptography, not the key in your everyday wallet. |
| Transaction hashing | SHA-256 | Produces the unique transaction ID (hash) after you sign and broadcast. Explorers, CLI, and RPC use that hash to look up status, events, and confirmation. |
Transaction hashes on ZIGChain are 64-character uppercase hexadecimal strings — the SHA-256 digest of the raw transaction bytes. The CLI, RPC, and explorers display them without a 0x prefix.
Transaction Signing Fields
Every signed transaction binds to a specific account state and network:
- Account number and sequence: The sequence is an account nonce. It must match the next unused value on chain or the transaction is rejected. Query both fields with
zigchaind q auth account <ADDRESS>— see the CLI Commands Quick Sheet for examples. - Chain ID: The target network (
zigchain-1orzig-test-2). This prevents replaying the same signed transaction on another chain. - Expiry (optional): A transaction can carry
timeout_timestamp, after which the chain will no longer include it. On the CLI, set it with--timeout-durationtogether with--unordered. Expiry is always opt-in — no chain parameter forces transactions to expire, so a signed transaction with no timeout stays valid as long as its sequence is still unused.
--timeout-height (the block-height form, timeout_height) is deprecated in the Cosmos SDK release ZIGChain runs and cannot be combined with --timeout-duration. Use --timeout-duration for new scripts and wallets.
- Mainnet
- Testnet
- Local
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--from <KEY-NAME> \
--chain-id zigchain-1 --node https://public-zigchain-rpc.numia.xyz \
--unordered --timeout-duration 10m \
--gas auto --gas-prices 0.0025uzig
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--from <KEY-NAME> \
--chain-id zig-test-2 --node https://public-zigchain-testnet-rpc.numia.xyz \
--unordered --timeout-duration 10m \
--gas auto --gas-prices 0.0025uzig
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--from <KEY-NAME> \
--chain-id zigchain-1 --node http://localhost:26657 \
--unordered --timeout-duration 10m \
--gas auto --gas-prices 0.0025uzig
For replay protection in the fee context, see Gas Fees on ZIGChain — Common Questions. For multisig sequence handling, see Multisig Transactions on ZIGChain.
Offline (Air-Gapped) Signing
You can build a transaction on an online machine, sign it on an offline machine that holds the key, and broadcast the signed result from an online machine. The key never touches a networked host.
- Build the unsigned transaction (online):
--generate-onlyprints the transaction JSON instead of signing or broadcasting it.
- Mainnet
- Testnet
- Local
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--chain-id zigchain-1 --node https://public-zigchain-rpc.numia.xyz \
--gas 200000 --gas-prices 0.0025uzig \
--generate-only > unsigned.json
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--chain-id zig-test-2 --node https://public-zigchain-testnet-rpc.numia.xyz \
--gas 200000 --gas-prices 0.0025uzig \
--generate-only > unsigned.json
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--chain-id zigchain-1 --node http://localhost:26657 \
--gas 200000 --gas-prices 0.0025uzig \
--generate-only > unsigned.json
- Sign offline: Transfer
unsigned.jsonto the offline machine and sign it there. Because the offline machine cannot query the chain, pass the account number and sequence explicitly (read them on the online machine withzigchaind q auth account <ADDRESS>).
- Mainnet
- Testnet
- Local
zigchaind tx sign unsigned.json \
--from <KEY-NAME> --chain-id zigchain-1 \
--account-number <ACCOUNT_NUMBER> --sequence <SEQUENCE> \
--offline > signed.json
zigchaind tx sign unsigned.json \
--from <KEY-NAME> --chain-id zig-test-2 \
--account-number <ACCOUNT_NUMBER> --sequence <SEQUENCE> \
--offline > signed.json
zigchaind tx sign unsigned.json \
--from <KEY-NAME> --chain-id zigchain-1 \
--account-number <ACCOUNT_NUMBER> --sequence <SEQUENCE> \
--offline > signed.json
- Broadcast (online): Transfer
signed.jsonback and submit it.
- Mainnet
- Testnet
- Local
zigchaind tx broadcast signed.json \
--chain-id zigchain-1 --node https://public-zigchain-rpc.numia.xyz
zigchaind tx broadcast signed.json \
--chain-id zig-test-2 --node https://public-zigchain-testnet-rpc.numia.xyz
zigchaind tx broadcast signed.json \
--chain-id zigchain-1 --node http://localhost:26657
Notes:
- Ledger: Add
--ledgerto the signing step to sign with a hardware wallet instead of a keyring key. The device confirms the transaction contents on its own screen. To set the device up first, see Set Up Ledger Wallet for ZIGChain. - Multisig: Each signer produces a signature file with
zigchaind tx sign --multisig <MULTISIG-ADDRESS>, and the signatures are combined withzigchaind tx multisign. See Multisig Transactions on ZIGChain for the full flow. - The signature commits to the chain ID, account number, and sequence you supplied. If any of them is stale by the time you broadcast, the transaction is rejected and you must rebuild and re-sign it.
Recover ZIGChain Accounts With a Mnemonic Phrase
If you lose access to your ZIGChain account, you can recover it using your 12-24 word mnemonic phrase that serves as a backup for your private key.
Recover an Account With the CLI
🧑💻 To restore a ZIGChain account using a previously saved mnemonic phrase:
zigchaind keys add <key-name> --recover
Follow the prompt to enter your 12-24 word mnemonic phrase. Once validated, your account will be restored, displaying the associated details.
Security Best Practices for ZIGChain Accounts
Protect your ZIGChain accounts and assets by following these essential security practices:
1. Mnemonic Phrase Protection
- Use a Hardware Wallet: Store your mnemonic phrase on a hardware wallet (like Ledger or Trezor). These physical devices are designed to keep your keys safe from online threats.
- Offline Backups: Write down your mnemonic phrase on paper or store it on an encrypted USB drive that’s kept offline. Avoid digital storage on computers or clouds.
- Split Backups for Safety: Split your phrase into two or more parts and store them in separate, secure places. This way, losing one part won’t compromise your account.
2. Private Key Security
- Encryption: If you must store your private key on your device, use encryption tools (like GPG or BitLocker) and strong passwords to protect them.
- Unique Keys for Different Uses: Use separate keys for different accounts or DApps to minimize risk if one key is compromised.
- Two-Factor Authentication (2FA): Enable 2FA on all accounts and devices accessing your ZIGChain wallet. Hardware keys (like YubiKeys) offer the strongest security.
3. Using Multisig Accounts
- Shared Control for Important Accounts: For accounts with significant funds, implement multisig (multi-signature) setups that require multiple people to approve each transaction. This safeguards against unauthorized transfers.
- Cold Storage Multisig: Store your multisig keys on hardware wallets or offline devices to protect against remote hacking attempts.
4. Avoiding Phishing and Scams
- Check URLs Carefully: Only use the official ZIGChain website and trusted DApps. Bookmark the official URL to avoid fake sites.
- Verify Transactions Before Signing: Always double-check the details of any transaction before approving it in your wallet. Malicious contracts can trick you into sending funds.
CLI Commands Quick Sheet
This section provides a comprehensive reference for common ZIGChain CLI commands for account management, balance queries, and transactions.
zigchaind keys list
zigchaind keys delete <WALLET-NAME>
- Mainnet
- Testnet
- Local
zigchaind q bank balances <WALLET-ADDRESS> \
--chain-id zigchain-1 --node https://public-zigchain-rpc.numia.xyz
zigchaind q bank balances <WALLET-ADDRESS> \
--chain-id zig-test-2 --node https://public-zigchain-testnet-rpc.numia.xyz
zigchaind q bank balances <WALLET-ADDRESS> \
--chain-id zigchain-1 --node http://localhost:26657
- Mainnet
- Testnet
- Local
for addr in "<WALLET-ADDRESS1>" "<WALLET-ADDRESS2>"; do
echo "balance: $addr"
zigchaind q bank balances $addr \
--chain-id zigchain-1 --node https://public-zigchain-rpc.numia.xyz
done
for addr in "<WALLET-ADDRESS1>" "<WALLET-ADDRESS2>"; do
echo "balance: $addr"
zigchaind q bank balances $addr \
--chain-id zig-test-2 --node https://public-zigchain-testnet-rpc.numia.xyz
done
for addr in "<WALLET-ADDRESS1>" "<WALLET-ADDRESS2>"; do
echo "balance: $addr"
zigchaind q bank balances $addr \
--chain-id zigchain-1 --node http://localhost:26657
done
- Mainnet
- Testnet
- Local
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--fees <AMOUNT>uzig \
--from <ADDRESS> \
--chain-id zigchain-1 --node https://public-zigchain-rpc.numia.xyz \
--yes
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--fees <AMOUNT>uzig \
--from <ADDRESS> \
--chain-id zig-test-2 --node https://public-zigchain-testnet-rpc.numia.xyz \
--yes
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--fees <AMOUNT>uzig \
--from <ADDRESS> \
--chain-id zigchain-1 --node http://localhost:26657 \
--yes
- Mainnet
- Testnet
- Local
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--chain-id zigchain-1 --node https://public-zigchain-rpc.numia.xyz \
--fees <AMOUNT>uzig \
--gas <AMOUNT> \
--from <ADDRESS>
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--chain-id zig-test-2 --node https://public-zigchain-testnet-rpc.numia.xyz \
--fees <AMOUNT>uzig \
--gas <AMOUNT> \
--from <ADDRESS>
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--chain-id zigchain-1 --node http://localhost:26657 \
--fees <AMOUNT>uzig \
--gas <AMOUNT> \
--from <ADDRESS>
- Mainnet
- Testnet
- Local
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--chain-id zigchain-1 --node https://public-zigchain-rpc.numia.xyz \
--gas-prices <AMOUNT>uzig \
--gas <AMOUNT> \
--from <ADDRESS>
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--chain-id zig-test-2 --node https://public-zigchain-testnet-rpc.numia.xyz \
--gas-prices <AMOUNT>uzig \
--gas <AMOUNT> \
--from <ADDRESS>
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--chain-id zigchain-1 --node http://localhost:26657 \
--gas-prices <AMOUNT>uzig \
--gas <AMOUNT> \
--from <ADDRESS>
- Mainnet
- Testnet
- Local
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--fees <AMOUNT>uzig \
--chain-id zigchain-1 --node https://public-zigchain-rpc.numia.xyz \
--dry-run \
--yes
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--fees <AMOUNT>uzig \
--chain-id zig-test-2 --node https://public-zigchain-testnet-rpc.numia.xyz \
--dry-run \
--yes
zigchaind tx bank send <FROM-ADDRESS> <TO-ADDRESS> <AMOUNT>uzig \
--fees <AMOUNT>uzig \
--chain-id zigchain-1 --node http://localhost:26657 \
--dry-run \
--yes
- Mainnet
- Testnet
- Local
zigchaind q auth account <ADDRESS> \
--chain-id zigchain-1 --node https://public-zigchain-rpc.numia.xyz
zigchaind q auth account <ADDRESS> \
--chain-id zig-test-2 --node https://public-zigchain-testnet-rpc.numia.xyz
zigchaind q auth account <ADDRESS> \
--chain-id zigchain-1 --node http://localhost:26657
account:
type: /cosmos.auth.v1beta1.BaseAccount
value:
account_number: "60"
address: zig126kn23lxurns83w2n59a7e0v2wprjdrrfv4xw8
public_key:
type: /cosmos.crypto.secp256k1.PubKey
value: A6lb4ADv8XZVw/T+wqLZzobnj0vkAarcpJrjb7y5zvTQ
sequence: "148"
Related Topics
- About ZIGChain
- ZIGChain - What and Why?
- The ZIG Token
- Gas Fees on ZIGChain
- Multisig Transactions on ZIGChain
- Set Up Ledger Wallet for ZIGChain
- ZIGChain Glossary