Testnet Validator Volunteers for [monad-version-agent]

I’m looking for testnet validators to help validate the monad-version-agent flow ahead of the next Monad client release.

The goal is to get a clean and sequential test of the contract flow:

  • attestFirst — before the release
  • attestUpdate — after the release

The agent is a Rust one-shot binary that reads the local monad-rpc version, validates validator identity through staking, and writes to the on-chain VersionRegistry only if required. The code is fully open source and available for inspection.


What this agent does

validator-version-agent compares the local monad-rpc --version output with the on-chain VersionRegistry state and performs exactly one reconciliation pass per launch. If no record exists yet for the validator tuple, it submits attestFirst. If a record exists and the version changed, it submits attestUpdate. If the registry is already up to date, it exits without writing.

The on-chain registry is keyed by the validator identity tuple:

  • validatorId
  • secpPubKey

For each write, the contract verifies the staking mapping, signature validity, nonce, deadline, and for attestUpdate, a strictly increasing timestamp.


Quick Start

  1. Install
  2. Copy configuration files
  3. Add private key in agent.env
  4. Add contract address 0xfb14Eb3cEB82C176AFd8718B0C27c0d17a1BDDb6 in agent.env
  5. Change the chain_gateway_mode in bootstrap-state.json to rpc
  6. Run once

FULL Validator testing flow

1. Prepare a fresh EVM address

Prepare a private key for a new EVM address and fund it with at least 1 $MON on testnet.

You can do this either:

  • from any faucet
  • by claiming your testnet validator rewards using staking-sdk-cli

This address will be used as the gas-paying tx sender.

2. Install dependencies and build the agent

2.1. Install required packages

sudo apt update
sudo apt install -y git curl build-essential pkg-config libssl-dev ca-certificates

2.2. Install Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"

2.3. Clone the repository

git clone https://github.com/GO2Pro-xyz/monad-version-agent.git
cd monad-version-agent

2.4. Build the binary

cargo build --release

The project runbook documents this host preparation and build flow.

3. Install runtime files and configure the agent

Create the runtime directory and copy the runtime files:

mkdir -p /home/monad/.monad-version-agent
chmod 700 /home/monad/.monad-version-agent

cp .env.example /home/monad/.monad-version-agent/agent.env
cp bootstrap/agent-bootstrap-state.json /home/monad/.monad-version-agent/bootstrap-state.json
cp contracts/version-registry.abi.json /home/monad/.monad-version-agent/version-registry.abi.json

chmod 600 /home/monad/.monad-version-agent/agent.env

3.1. Then update agent.env:

  • add the private key for the funded testnet EVM address:
    • TX_SENDER_PRIVATE_KEY=...
  • add the registry contract address:
    • REGISTRY_CONTRACT_ADDRESS=0xfb14Eb3cEB82C176AFd8718B0C27c0d17a1BDDb6

3.2. Change the mode for rpc in bootstrap-state.json.

nano /home/monad/.monad-version-agent/bootstrap-state.json

4. First run before the release

4.1. Install the built binary:

sudo install -m 0755 target/release/validator-version-agent /usr/local/bin/validator-version-agent

4.2. Run agent

AGENT_RUN_ONCE=true /usr/local/bin/validator-version-agent

Expected result: attestFirst.

5. Next Monad client release

After the next Monad client release, update your validator and run again:

AGENT_RUN_ONCE=true /usr/local/bin/validator-version-agent

Expected result: attestUpdate.


The idea behind monad-version-agent is to support long-term operational transparency across the network and build a verifiable operational layer around client upgrades and validator behavior.

Proposed plan

  1. Test the binary and contract flow on testnet
  2. Collect feedback from participants
  3. Prepare a MIP

2 Likes

First part done with no issues (attestFirst): https://testnet.monadvision.com/tx/0xa1f645e24542facdad7101e8f74c208a36ad1f835df91b4716ce639aeaf8b56a

Ran as mock and then as rpc np

1 Like

Phase 1 (attestFirst) completed successfully on my end too. Here is my tx: 0xacf27cf21305076682c580a2e7e6482fe549a4e09cb46f97a9a9b93903785902 . Waiting for the next client release for the attestUpdate phase! :rocket:

1 Like