Developers

Build on MSG through Agent APIs, the CosmWasm contract lifecycle, AI constitution and communications pages, source autonomy and resource lifecycle pages, guidance for the future Node Manager and private control, machine-readable whitepaper exports, and L1 or L2 expansion paths. Principal authority follows the subject-neutral rule: permissions come from role and delegation, not subject type. AI-side governance and asset authority are still being built, and signing, deployment or moving assets in production still requires human approval.

Agent API Surface Contract Runtime

Dev Tools

CLI, SDKs, and automation entry points make up today's developer tooling, letting you trace on-chain upgrades, execution boundaries, and the newer autonomy and resource pages. Stricter detail lives in the whitepaper.

Smart Contracts

The CosmWasm runtime now supports contract migration (wasm_migrate), reply_on / reply, and atomic rollback. This site gives the capability direction, and the whitepaper carries the stricter boundary detail.

API & RPC

JSON-RPC, gRPC, REST, the indexer, Agent APIs, whitepaper machine entries, communications pages, and source pages together make up today's integration surface. Data-retention rules, service-availability targets and release boundaries, stricter explorer exports, and retrieval-ready references are all public.

Chain Integration Facts

These are the values an integrator must align before writing any client code. Getting any one of them wrong is enough to make a client silently incompatible.

Item Value
Chain ID msg-chain-1 (numeric meaning: chain 1)
Native denom umsg, 9 decimals. The 18-decimal unit is used for gas pricing arithmetic only and is not the user-facing denomination. The msg_token_cw20 CW20 token is a separate asset with 18 decimals, so state which asset you are quoting.
Address format msg + 40 hex characters + 1 checksum character = 44 characters. It is not bech32, so a bech32 prefix or a standard Cosmos address validator will not accept it.
Contract address format A contract address is a 42-character bech32 string with human-readable part msg (msg1...) and a 20-byte payload. The two formats must not be mixed: the account form fails the SDK's isValidMsgContractAddress and the bech32 contract form fails isValidMsgAddress.
Client signing & hash requirements Signatures are CRYSTALS-Dilithium-5 round-3 (cloudflare/circl mode5). FIPS-204 ML-DSA-87 (signature 4627 bytes) is not wire-compatible. hash, signature and public_key are hex, never base64, and a client-produced transaction must set hash_profile to msgchain_tx_hash_v2 (an empty value is read as the legacy v1 hash and fails the node check). The node re-derives the sender address from the Dilithium-5 public key.
Default node ports RPC 13148 / Agent API 13197 / Health 15197 / REST 16197 / gRPC 19197 / P2P 19238 (metrics 17197, pprof 18197 and operator console 20197 are not exposed by default)
Route ownership /api/v1/* belongs to RPC 13148; /cosmos/* and /cosmwasm/* belong to REST 16197; /agent/v1/* belongs to Agent API 13197. The REST port also carries a production-readiness gate, so business paths should use the canonical owner above.
Transaction model A JSON-serialized types.Transaction, not a protobuf TxRaw. Signatures are CRYSTALS-Dilithium-5 (signature 4595 bytes, public key 2592 bytes) and are bound to the chain ID for replay protection. Broadcast accepts MSG native signed transactions only; a standard Cosmos or CosmJS signed transaction is rejected.
Nonce source The nonce is per sender and per transaction domain. For a default-domain transaction the authoritative value comes from GET /agent/v1/query/account/{address} (port 13197, returns a number; on the mainnet deployment that route set sits behind a trusted gateway and requires the header X-MSG-Agent-Gateway-Key). The sequence returned by GET /api/v1/auth/accounts/{address} (port 13148) is a domain-agnostic running count and is a reference only — do not use it as a domain nonce and do not conflate it with the agent-API nonce. Not every domain has a read-only endpoint. A read-only integration does not need the agent gateway: the frozen-contract public_reads on 13148 (/api/v1/*) and 16197 (/cosmos/*, /cosmwasm/*) need no gateway header and no API key; the agent API (13197) is required only for agent-only functions such as the WebSocket events/subscribe.
Signing client Only the official SDK (@msg-chain/sdk) can sign, because MSG requires native Dilithium-5 signatures. Keplr, CosmJS and MetaMask cannot sign and are read-only on this chain.
Current availability A local development network and a frozen API contract are available, together with the SDK and a conformance self-test. No public endpoint is published yet, so do not point a client at a public address and do not treat a local address as production.
Event subscription & TLS Event subscription uses the WebSocket path /agent/v1/events/subscribe. TLS is off by default, so a client must not assume an encrypted transport.
Contract-issued instantiation (factory pattern) Contract-issued WasmMsg::Instantiate / Instantiate2 sub-messages are not supported, so the factory pattern (one contract creating another at runtime) is not currently available. The affected surface is narrow: among the registered contracts only dex_factory_v1 depends on it directly (and that contract is not locally implemented), i.e. the DEX factory pool-creation path; dex_pair_v1 / dex_router_v1 use Execute only, and personal_token_v1 instantiates cw20_base in-process, so none of them is affected. Uniform wording: a factory contract can only register and validate; a CW20 must be deployed by its own separate transaction. Do not attribute other contracts' unfinished status to this limit.
Contract admin changes There is no top-level wasm_update_admin transaction type; update_admin / clear_admin are only handled as sub-messages emitted in a contract execution response, so a client must not send an admin change as its own transaction (the top-level execute path recognises only wasm_store / wasm_instantiate / wasm_execute / wasm_migrate). It is also not one of the controlled types in the third-party allowlist, which covers the signers of wasm_store / wasm_instantiate / contract_deploy / contract_instantiate.
Lifecycle nonce domain & failed transactions The contract-lifecycle domain admin_wasm_lifecycle tracks its high-water mark per sender and per domain: a brand-new address starts at 0, and while a lifecycle window is open the node accepts high_water < nonce ≤ high_water + 16. There is no read-only endpoint for that domain's high-water mark, so a client must treat it as a range and re-derive the next value after a rejection. A transaction that was included in a block but failed is still discoverable read-only through GET /api/v1/receipts/{txHash} (success:false), which separates "never included" from "included and failed".
Deploy admission, admin immutability & how window parameters are published The third-party deploy allowlist validates the signer only and does not carry the contract admin: read the real admin back from the wasm_instantiate data.admin. A missing or null admin produces an immutable instance (immutable=true); the two supported strategies are data.admin=<a long-lived address> or admin:null. The public allowlist artifact keeps the development-network name third_party_deploy_allowlist.json, ships with a one-file SHA256SUMS and inline sha256 values, and is loaded once at node startup — updating it requires a restart. The window parameters are delivered as a separate official document through the three-project return channel (with machine-readable attachments); it is not a repository path and is not shipped inside a node release package. The trigger is: window close-out → collector PASS → both nodes connect and activate the allowlist → publication. Current state: not published, so neither the artifact nor the window parameters are obtainable yet. The only reliable admin read-back: GET /api/v1/txs/{hash} → data (hex → JSON) → .admin. contract_info.admin is a hard-coded empty string and must not be used; a read-only admin endpoint is a long-term candidate with no schedule.

The same facts are published in machine-readable form, so a tool or agent can read them instead of parsing this page.

Open chain_integration_facts.json