Two tracks, one release
v0.18.0 is the first Shell Chain release to ship a user-visible protocol feature and deep infrastructure hardening in the same cycle. The two tracks are designed to be independent — you can use AA without caring about storage profiles, and you can upgrade a node to get Prometheus metrics without touching any wallet code.
This post covers both.
Track 1 — Native Account Abstraction Phase 1
What shipped
Atomic batch transactions. A new transaction type (tx_type = 0x7E)
carries a bundle of inner calls. One ML-DSA-65 signature authorizes the
whole batch. If any inner call reverts, the entire batch is atomically
reverted. Gas and nonce are deducted once for the bundle.
BatchTransaction {
tx_type: 0x7E,
nonce: u64,
gas: u64,
inner_calls: Vec<InnerCall>, // max 16 calls
paymaster: Option<Address>,
paymaster_signature: Option<Bytes>,
signature: PqSignature, // ML-DSA-65 over the bundle hash
}
Sponsored gas (Paymaster). The paymaster and paymaster_signature
fields let a third party pay gas on behalf of the sender. The paymaster's
ML-DSA-65 signature over (bundle_hash, validity_window) is verified at
mempool admission time. Execution debits gas from the paymaster account.
This is a "native paymaster account" design — no contract stack required.
New RPC endpoints:
| Method | Description |
|---|---|
shell_estimateBatch |
Simulate a bundle and return per-call gas estimates |
shell_getPaymasterPolicy |
Query a paymaster's sponsorship policy |
shell_isSponsored |
Check whether a confirmed tx was sponsored |
shell_getWitness |
Return full Merkle proof + state root for a block |
Hash domain isolation
The bundle signing hash uses domain byte 0x42:
bundle_hash = keccak256(0x42 || RLP(tx) || RLP(bundle_fields))
This is explicitly distinct from the v0.17.0 single-tx domain (0x01),
preventing cross-version signature replay.
Backward compatibility
All AA fields are optional. A wallet that has never heard of v0.18.0 can still submit normal transactions without any change.
What is not in Phase 1
- Contract-based paymasters (ERC-4337-style EntryPoint logic) → v0.19.0
- Session keys / guardian recovery → v0.19.0
- Cross-chain AA → roadmap
Track 2 — Operations & Stability Hardening
OPS-1: Storage Profiles
Nodes now expose a declared storage profile — archive, full, or light
— via CLI flag and config, and via the shell_getStorageProfile RPC.
| Profile | What is retained |
|---|---|
archive |
Full history: all blocks, all state trie nodes, all tx bodies |
full |
Recent state + block headers; pruned history beyond configured depth |
light |
Headers only; relies on witness proofs for state queries |
The node validates that its on-disk data is consistent with the declared
profile on startup. Switching between archive and full is supported at
runtime; downgrading to light requires a re-sync.
The wallet now shows the connected node's profile as a badge. Explorers can surface it on the node info page.
OPS-2: Witness Endpoint Hardening
shell_getWitness was previously a 501 Not Implemented stub on full nodes
and silently missing on light clients. It now:
- Returns a complete Merkle proof, state root, and block context on all node types.
- Includes the PQ witness bundle (aggregated validator signatures) so light clients can independently verify block finality.
- Is tested with unit tests in
crates/light-client/.
OPS-3: Observability
A Prometheus-compatible /metrics endpoint is now served on the RPC port
(configurable). Key exported metrics:
shell_mempool_size
shell_blocks_per_second
shell_peer_count
shell_rpc_latency_seconds{method="..."}
shell_libp2p_errors_total{error="..."}
/healthz (liveness) and /readyz (readiness) HTTP endpoints are also
available. Tracing spans cover the full critical path: RPC handler →
execution → consensus tick. Level is controlled with SHELL_LOG env var.
See docs/observability.md for a starter Grafana dashboard JSON.
OPS-4: RPC Stability & Documentation
All JSON-RPC error codes are now defined in crates/rpc/src/error.rs as a
single authoritative table. The -32xxx space is audited; ambiguous codes
were resolved. docs/rpc-reference.md is auto-generated from handler
annotations and included in the repository.
Batch JSON-RPC ({"jsonrpc":"2.0","method":"..."} arrays) is now formally
tested for both eth_* and shell_* namespaces.
Ecosystem updates
| Component | Version | Key changes |
|---|---|---|
| shell-sdk | 0.4.0 | AA builders, ML-DSA-65 canonical naming, new RPC types |
| shella-chrome-wallet | 0.18.0 | Batch approval UI, sponsored badge, storage profile display |
| shell-explorer | 0.18.0 | Batch tx inner calls, sponsored indicator, /node page |
Upgrading
- Nodes: update
shell-chainbinary; set--storage-profile=full(orarchive) in your start script. First boot will validate existing data. - SDK users:
npm install shell-sdk@0.4.0. The AA builders are additive; existing code compiles without changes. - Wallet: Extension auto-updates on Chrome Web Store (dev channel). No user action required.
Full release notes and migration guide: docs/CHANGELOG.md