Monitors validator uptime on the Sui network by subscribing to checkpoint data. Features a modern terminal user interface (TUI) with real-time updates.
- Real-time monitoring of validator signatures on checkpoints
- Dual progress bars: validator count and voting-power participation per checkpoint
- Interactive TUI with progress bars and formatted tables
- Plain text mode for logging or scripting use cases
- Automatic terminal resizing support
- Graceful shutdown handling for clean exits
The application can be configured using environment variables:
SUI_NODE: The gRPC endpoint for Sui node subscriptions (e.g.,fullnode.mainnet.sui.io:443).SUI_JSON_RPC_URL: The JSON-RPC endpoint for Sui fullnode (e.g.,https://fullnode.mainnet.sui.io).DEFAULT_RPC_TIMEOUT_SECONDS: Timeout for JSON-RPC calls in seconds (default: 15).GRPC_USE_TLS: Set totrueorfalseto enable/disable TLS for gRPC (default:true).GRPC_INSECURE_SKIP_VERIFY: Set totrueorfalseto skip TLS certificate verification for gRPC (default:true).SUBSCRIBER_RETRY_DELAY_MS: Delay in milliseconds before retrying gRPC subscription (default: 1000).PLAIN_MODE: Set totrueto use plain text output instead of TUI (default:false).NO_ALT_SCREEN: Set totrueto run inside current terminal buffer (default:false).LOG_TO_FILE: Set totrueto write logs to a file (default:false).LOG_FILE_PATH: Path to log file (default:~/.suitop/logs/suitop.log).GENERATE_DATASET: Enable dataset generation mode (default:false).DATASET_FOLDER: Folder to store dataset files (default:./data).
These flags override the corresponding environment variables:
--plain: Use plain text output instead of TUI--no-alt-screen: Run inside current terminal buffer (useful for tmux logs)--log-to-file: Write logs to a file--log-file [path]: Path to log file--generate-dataset: Enable dataset generation mode
go build -o suitop cmd/suitop/main.goTo embed version information:
go build -ldflags "-X suitop/internal/version.GitCommit=$(git rev-parse HEAD) -X suitop/internal/version.BuildTime=$(date -u +%Y-%m-%dT%H:%M:%SZ) -X suitop/internal/version.Version=0.1.0" -o suitop cmd/suitop/main.go# Run with default TUI mode
./suitop
# Run for testnet
./suitop --network testnet
# Run with plain text output
./suitop --plain
# Run inside current terminal buffer (good for tmux sessions)
./suitop --no-alt-screen
# Run with logging to a file
./suitop --log-to-file --log-file /path/to/logfile.log
# Generate dataset in plain mode
./suitop --generate-datasetWhen --generate-dataset (or GENERATE_DATASET=true) is enabled the tool runs
in plain mode and keeps validator signatures in memory until you press q then
Enter.
Every epoch is flushed to a JSON file inside DATASET_FOLDER (defaults to
./data). Files are named epoch_<epoch>_<start>-<end>.json where <start> and
<end> are the first and last checkpoint sequence numbers recorded.
The JSON structure contains an array of validators with a bitmap of all checkpoints in order:
{
"epoch": 42,
"start_checkpoint": 10000,
"end_checkpoint": 10100,
"validators": [
{
"name": "Validator A",
"address": "0x...",
"signed": 90,
"total": 101,
"bitmap": "...base64 bytes..."
}
]
}The bitmap field is base64‑encoded. When decoded, each bit corresponds to a
checkpoint starting from the least significant bit of the first byte. A set bit
(value 1) means the validator signed that checkpoint.
Progress is printed every 10 checkpoints with a reminder that you can press q
to finish recording.
- Press
qorCtrl+Cto quit the application - Terminal resizing is automatically handled
- Use
SIGINT(Ctrl+C) orSIGTERMfor graceful shutdown
(Details of the project structure as provided in the refactoring request can be added here.)
suitop/
├── go.mod
├── go.sum
│
├── cmd/ │ └── suitop/
│ └── main.go │
├── internal/ │ ├── config/ │ │ └── config.go
│ ├── rpc/ │ │ ├── client.go │ │ ├── committee.go │ │ └── systemstate.go │ ├── grpc/ │ │ ├── subscriber.go │ │ └── interceptors.go │ ├── checkpoint/ │ │ ├── bitmap.go │ │ ├── processor.go │ │ └── stats.go │ ├── validator/ │ │ ├── model.go │ │ └── loader.go │ ├── tui/ │ │ ├── messages.go │ │ ├── model.go │ │ ├── update.go │ │ ├── view.go │ │ └── style.go │ ├── types/ │ │ └── common.go │ ├── util/ │ │ ├── logger.go │ │ ├── retry.go │ │ └── signalctx.go │ └── version/ │ └── version.go
│
├── pb/ │ ├── sui/rpc/v2alpha/*.go
│ └── sui/rpc/v2beta/*.go
│
└── README.md
