A testnet orchestration system for Cosmos SDK and EVM chains deployed geodistributed on Digital Ocean or locally via Docker.
Ironbird consists of four main components:
- Exposes gRPC API for workflow management
- Handles workflow submission and state management
- Stores workflow history in SQLite database
- Dockerfile:
server.Dockerfile - Config:
conf/server.yaml
- Executes Temporal workflow activities
- Manages the core
LaunchTestnetworkflow with the following activities:- BuildDockerImage - Builds chain binaries into Docker images using BuildKit
- Accepts custom dependency versions for:
- Chain repository (e.g., Cosmos EVM) at a specific Git SHA
- Cosmos SDK version (optional override via
CosmosSdkSha) - CometBFT version (optional override via
CometBFTSha)
- Automatically injects
go mod edit -replacecommands during the build process to swap dependencies - Allows flexible version combinations (e.g., latest EVM with older SDK, or specific CometBFT with any SDK)
- Dependency conflict handling: Build will fail if Go module resolution detects incompatibilities
- Checks for existing images in ECR (or local Docker) to avoid redundant builds
- Tags images with dependency versions to ensure cache correctness
- Accepts custom dependency versions for:
- CreateProvider - Initializes infrastructure provider (Docker or DigitalOcean)
- LaunchTestnet - Provisions and configures the blockchain network
- Infrastructure Provisioning: Creates compute resources (containers or droplets) for validators and full nodes
- Node Distribution: Supports multi-region deployment for DigitalOcean or local Docker networks
- Genesis Generation:
- Creates initial validator keys and wallets
- Configures genesis accounts with initial token balances
- Applies custom genesis modifications (staking params, gov params, etc.)
- Collects and processes validator gentxs
- Configuration Management: Writes and customizes
app.toml,config.toml, andclient.toml - Peer Setting: Configures peer discovery (persistent peers or seed nodes)
- Wallet Provisioning: Derives specified number of funded wallets from base mnemonic for load testing
- LaunchLoadBalancer (optional, DigitalOcean only) - Sets up SSL-enabled load-balanced public endpoints
- Creates a DigitalOcean load balancer droplet with HAProxy
- Generates domain endpoints for each protocol:
{chain-name}-rpc.{domain}- Tendermint RPC (HTTPS){chain-name}-grpc.{domain}- Cosmos gRPC (gRPC over TLS){chain-name}-lcd.{domain}- Cosmos REST API (HTTPS){chain-name}-evmrpc.{domain}- EVM JSON-RPC (HTTPS, for EVM chains only){chain-name}-evmws.{domain}- EVM WebSocket (WSS, for EVM chains only)
- Load balances requests across all validators and full nodes in the testnet
- RunLoadTest (optional) - Executes load tests via Catalyst
- TeardownProvider - Cleans up all provisioned resources
- BuildDockerImage - Builds chain binaries into Docker images using BuildKit
- Dockerfile:
worker.Dockerfile - Config:
conf/worker.yaml - Chain Dockerfiles: Located in
hack/directory (these need to be updated separately in ironbird-manifests for dev and prod):hack/simapp.Dockerfile- Cosmos SDK simapphack/gaia.Dockerfile- Cosmos Hubhack/evm.Dockerfile- EVM-compatible chains
- React-based UI for workflow creation and monitoring
- Built with Vite and TypeScript
- Communicates with server via gRPC-Web
- Location:
frontend/
- Runs as a scheduled cron job (currently scheduled in manifests to be daily at midnight)
- Identifies and deletes dangling DigitalOcean resources:
- Droplets older than 30 minutes
- Associated firewalls
- Respects LONG_RUNNING tag - resources tagged with
LONG_RUNNINGare never deleted - Dockerfile:
cleanup.Dockerfile
All Kubernetes manifests and Helm charts are located in the ironbird-manifests/ repository
Ironbird supports two deployment modes:
- Local Docker Mode: Run testnets locally using Docker (no cloud dependencies required)
- Full Mode (DigitalOcean): Deploy testnets to DigitalOcean droplets (requires AWS, Tailscale, and DigitalOcean)
For running local Docker workflows with zero cloud dependencies:
make first-time-setupThis installs required dependencies (Docker, Temporal, mprocs, etc.) and generates SSL certificates.
make local-dockerThe frontend will be available at http://localhost:5173
For deploying testnets to DigitalOcean droplets:
make first-time-setupcp env.example .envSet the required environment variables (ICL secrets can be found in Bitwarden under note "Ironbird"):
set -o allexport
source .env
set +o allexportaws-vault exec skip-dev-adminNote: If you haven't set up AWS profiles, follow the guide at https://platform.skip.build/guides/aws/login_to_aws
make local-fullYou can either create a new testnet through the UI, or edit hack/workflow.json to define the desired testnet configs and submit using:
make test-workflow- Ironbird UI: http://localhost:5173
- Temporal UI: http://localhost:8233
- Ironbird GRPC: localhost:9006
- Temporal GRPC: localhost:7233