> ## Documentation Index
> Fetch the complete documentation index at: https://monadfoundation-40611fb6-v0-16-0.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# v0.16.0 Upgrade Instructions

<Warning>
  These instructions are only applicable to **testnet**. These can be ignored for **mainnet**.
</Warning>

## Upgrade notes

No breaking changes to `node.toml` config for `v0.16.0`.

**Metrics endpoint enabled by default.** The Prometheus metrics endpoint is now enabled by default (previously opt-in) on port `9143/TCP`, listening on `0.0.0.0`. If you have firewall rules restricting the metrics port, verify they are configured as expected.

<Warning>
  **MONAD\_TEN activation (MIP-8: page-encoded storage)**

  v0.16.0 activates MONAD\_TEN on testnet at timestamp `1786545000` (2026-08-12 14:30 UTC). Mainnet activation is not yet set.

  All nodes **must** be in dual-db mode (Phase A complete) before the activation timestamp. See [MIP-8 Activation and Page Storage Migration](/node-ops/upgrade-instructions/page-storage-mip-8-migration) for details.

  **Nodes that have not completed Phase A (dual-db activation) will fail to start on v0.16.0.** The node enforces a page-encoded timeline assertion on testnet — if neither a page-encoded primary nor an active secondary timeline is detected, the node will abort at startup.
</Warning>

## 1. SSH into the node as `root` user

## 2. Verify dual-db mode (Phase A)

Before upgrading, confirm your node has completed Phase A (dual-db activation). Nodes without an active page-encoded timeline will fail to start on v0.16.0.

```bash theme={null}
monad-mpt --storage /dev/triedb
```

You should see both Primary and Secondary timelines:

```
Active timelines:
     Primary:
        State machine kind: ethereum
     Secondary:
        State machine kind: monad
```

If you only see a single `ethereum` Primary timeline, complete the [Phase A migration](/node-ops/upgrade-instructions/page-storage-mip-8-migration#phase-a-page-activation) before proceeding.

## 3. Stop services

```bash theme={null}
sudo systemctl stop monad-bft monad-execution monad-rpc
```

## 4. Upgrade monad package

<Warning>
  If you encounter issues with the GPG signature (e.g. signatures were invalid), please renew the keys with the command below.
</Warning>

```bash theme={null}
curl -fsSL https://pkg.category.xyz/keys/public-key.asc \
  | gpg --dearmor --yes -o /etc/apt/keyrings/category-labs.gpg
```

```bash theme={null}
sudo apt update && sudo apt install --reinstall monad=0.16.0 -y --allow-downgrades --allow-change-held-packages
sudo apt-mark hold monad
```

<Warning>
  The `apt-mark hold monad` command prevents the monad package from being upgraded automatically by `apt-get upgrade`. Without it, unattended system upgrades can install a newer version of monad that has not been approved for your network, causing version mismatch issues.
</Warning>

## 5. Start services and verify

```bash theme={null}
sudo systemctl start monad-bft monad-execution monad-rpc
sudo systemctl status monad-bft monad-execution monad-rpc --no-pager -l
```

All services should show `Active: active (running)`. Confirm the node rejoins and advances blocks.

## 6. Verify the correct version is running

```bash theme={null}
monad-rpc -V
```

Expected output:

```json theme={null}
monad-rpc {"commit":"c616743d1358186605e1c1b74a3d6c4fdd9dd48c","tag":"v0.16.0","branch":"","modified":true}
```
