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

Thank you everyone who participated.

The test can be considered successful, because its main goal was to prove that the overall approach is valid.

Since the test was conducted on version 1.0.0, the application has been significantly improved. I completely redesigned how the application works, integrated the color code framework, and moved the whole logic to a FIFO queue model.

I also made the integration into the current release update process much simpler. Now it is only necessary to update the release metadata in the file and then run the version-agent itself.

As a result, the current version 1.4.0 is fully ready.