IGRA Galleon Public Testnet Deployment Guide¶
This guide covers deploying IGRA Orchestra on the Galleon public testnet with pre-built Docker images.
Quick Start (Automated)¶
For a guided interactive setup, run:
This script handles all configuration, key generation, and service startup automatically.Manual Setup¶
If the automated script above doesn't work for your environment, follow these manual steps.
Prerequisites¶
- Docker and Docker Compose installed
- AMD64 or ARM64 machine
- 32GB+ RAM recommended
- Git and SSH access to github.com
Galleon Testnet Chain Parameters¶
| Parameter | Value |
|---|---|
NETWORK |
testnet |
IGRA_CHAIN_ID |
38836 |
TX_ID_PREFIX |
97b4 |
IGRA_LAUNCH_DAA_SCORE |
368045400 |
GENESIS_BLOCK_HASH |
0xfa870bcc16b6fbb3225bcc89a92f38e02c95fdc3e3b51a58d066ac7e1e4162a2 |
L1_REFERENCE_DAA_SCORE |
361004030 |
L1_REFERENCE_TIMESTAMP |
1768475045 |
| Lock script address | kaspatest:qpv5yg3hthdf3ag09gjdyl2qeu3z73s60uzl5zrrgc3kwa840lxvg6a57kr2r |
IGRA_LOCK_SCRIPT_PUBKEY |
203705fd429b0ab82518dc8b0bef2756c87d797d08bc16f2a25b9b3d4365ad1529ac |
| Address prefix | kaspatest: |
| P2P Port | 16211 |
| gRPC Port | 16210 |
| Bootstrap Peer | 65.109.78.124 |
Steps¶
1) Clone the repository
2) Configure environment
Edit.env and fill in your node-specific values:
- NODE_ID - Your node identifier
- IGRA_ORCHESTRA_DOMAIN - Your domain for HTTPS
- IGRA_ORCHESTRA_DOMAIN_EMAIL - Email for Let's Encrypt
- Worker wallet addresses and passwords (after generating keys in step 6)
3) Generate JWT secret
Note: This must be done before starting backend services in step 4.
4) Start backend services
Start execution layer, kaspad, and node health check together:
Monitor sync progress:
Wait until IBD: 100% is reached (typically 4-6 hours depending on machine/network).
You can verify the genesis hash:
curl http://localhost:9545/ -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","id":"3","method":"eth_getBlockByNumber","params":["0x0", true]}'
Check hash field: it should match specified in the .env file.
5) Monitor IGRA adapter activity
Once kaspad is synced, you can monitor IGRA adapter activity:
docker logs -f -n 10 kaspad | docker run --rm -i --entrypoint /app/adapter-stats igranetwork/kaspad:$(grep KASPAD_VERSION versions.testnet.env | cut -d= -f2)
After kaspad sync, you should be able to see the progress of the building blocks:
Block #101,992 │ Hash: 0x0e41b08e1042d8f731816cac63940e94b0d7043bf5322fe66da371807cd1e441 │ ISC: 0x2278885c5e73a9efab568cb025feaa27732e4eff3c1e0eba7151f05da355f71d │ Prev: 0x85ac62cd59ced93a07316319364a4695efc12df6192be05efb0ea57888906238 │
Block #101,993 │ Hash: 0x321d540e55f6a6495030a51290286856269f50987f0a95770031f58ec980e914 │ ISC: 0x5f6a7dadae3ada7335c4807ee116a270c7e0ad282ba4bc9d673cabf4a1d606d3 │ Prev: 0x2278885c5e73a9efab568cb025feaa27732e4eff3c1e0eba7151f05da355f71d │
Block #101,994 │ Hash: 0x884ec7671666b1285194ee3b31fd822b83caddc286ba3fe43f701a7378efc9ae │ ISC: 0x28a00eb3d0174f7c3b23fcab75cf127dee803be266cc148035aab6932f27de70 │ Prev: 0x5f6a7dadae3ada7335c4807ee116a270c7e0ad282ba4bc9d673cabf4a1d606d3 │
Block #101,995 │ Hash: 0x89b244f95085c9970f4038daed48f886d32e83b5dd13f3314fc738fbea26f933 │ ISC: 0xf288ce24d30df53d6770f13ecdfae39e150eea76a840a740e693ca0edaff0e39 │ Prev: 0x28a00eb3d0174f7c3b23fcab75cf127dee803be266cc148035aab6932f27de70 │
Block #101,996 │ Hash: 0x259be8f5188c2f11023952df3a97106a5fe565c916a69bbac02e4d6e7ddc46f9 │ ISC: 0xc6e8075a18543d200d8683f8508c3c4b7f54e975f25cd6914c46ed7d61c2de65 │ Prev: 0xf288ce24d30df53d6770f13ecdfae39e150eea76a840a740e693ca0edaff0e39 │
Block #101,997 │ Hash: 0x5e566979f8c42eafcf5be66841b3d6d5b2cb15c99879e4355cb3af2d3e57136e │ ISC: 0x69c7e13dd8f7bab51e450b01b4f58ab9a1ee3dccec57f4f93fe4f7af04c31549 │ Prev: 0xc6e8075a18543d200d8683f8508c3c4b7f54e975f25cd6914c46ed7d61c2de65 │
Block #101,998 │ Hash: 0x927b0baecdebfa0d8b4237827cbaf2d55a0f2bbf2942a41c3720a3cd3a2fa801 │ ISC: 0xec59b2dd7d6bef0576dc426b822da376a53fc220c15c09b992b3a950e016e2b4 │ Prev: 0x69c7e13dd8f7bab51e450b01b4f58ab9a1ee3dccec57f4f93fe4f7af04c31549 │
^C
=== FINAL SUMMARY ===
================================================================================
ADAPTER STATS - SUMMARY
================================================================================
Runtime: 0h 0m 1s
Blocks processed: 385
PIPELINE TIMING:
Stage Avg (us) Med (us) Max (us) Calls
-------------------- ------------ ------------ ------------ --------
verifier 58 42 4,290 386
translator 0 0 13 386
assembler 4,786 4,637 30,638 385
ASSEMBLER STAGES:
Stage Avg (us) Med (us) Max (us) Calls
-------------------- ------------ ------------ ------------ --------
canonical_update 469 461 737 385
entry 6 6 25 385
payload_build 1,661 1,531 27,207 385
regular 6 6 44 385
state_validation 8 8 30 385
total 267 237 7,433 385
tx_processing 274 244 7,443 385
RPC TIMING:
Method Avg (us) Med (us) Max (us) Calls Success %
------------------------------ ------------ ------------ ------------ -------- ----------
admin_clearTxpool 104 100 177 386 100.0
engine_forkchoiceUpdatedV3 175 168 522 770 100.0
engine_getPayloadV4 438 437 1,643 385 100.0
engine_newPayloadV4 668 652 1,452 385 100.0
eth_getBlockByHash 107 105 224 385 100.0
eth_getBlockByNumber 183 175 323 385 100.0
eth_sendRawTransaction 151 148 243 381 0.0
txpool_content 90 88 181 385 100.0
PERFORMANCE:
Avg blocks/second: 385.0
================================================================================
Now you can wait till IGRA network is synced and reaches consensus with other nodes. Check the Grafana dashboard with your NODE_ID to monitor progress.
6) Generate testnet wallet keys
Generate keys for each worker (0-4):
source versions.testnet.env
for i in {0..4}; do
docker run --rm -it -v $(pwd)/keys:/keys --entrypoint /app/kaswallet-create \
igranetwork/kaswallet:${KASWALLET_VERSION} --testnet -k /keys/keys.kaswallet-$i.json
done
Update .env with the wallet password you used during key generation (W0_KASWALLET_PASSWORD through W4_KASWALLET_PASSWORD).
Note: Wallet addresses use placeholders by default. See "Optional: Enable RPC Transaction Submission" section below if you want to accept user transactions.
7) Pull latest images (optional)
8) Start worker services
For all 5 workers:
Or start with fewer workers:
- 1 worker: --profile frontend-w1
- 2 workers: --profile frontend-w2
- 3 workers: --profile frontend-w3
- 4 workers: --profile frontend-w4
- 5 workers: --profile frontend-w5
9) Verify deployment
Monitor logs:
# General logs
docker compose logs -f
# Monitor kaspad IGRA adapter activity
docker logs -f kaspad | grep -E "kaspa_igra_adapter|kaspa_atan"
# Check specific service
docker compose logs -f execution-layer
docker compose logs -f rpc-provider-0
Verify services are healthy:
Node Health Check: The node-health-check-client reports sync status and consensus to the monitoring dashboard. Check its logs:
Troubleshooting¶
Kaspad not syncing:
- Check network connectivity
- Verify no firewall blocking P2P port (16211)
- Ensure KASPAD_ADD_PEER=65.109.78.124 is set
- Check logs: docker compose logs kaspad
Workers not connecting:
- Ensure kaspad is fully synced with IGRA enabled
- Verify wallet key files exist in keys/ directory
- Check kaswallet logs: docker compose logs kaswallet-0
IGRA adapter issues:
- Verify all testnet parameters are correctly set in .env
- Ensure IGRA_ENABLE=true is set
Optional: Enable RPC Transaction Submission¶
By default, the RPC is configured as read-only (RPC_READ_ONLY=true). This means it can query blockchain state but cannot submit transactions.
If you want to use this node as an RPC endpoint that accepts transactions from users:
- Set
RPC_READ_ONLY=falsein your.envfile - Top up the 5 kaswallets with KAS (you will pay for L1 gas fees)
After IBD sync completes (IBD: 100%):
-
Get wallet addresses:
Look fordefault_addressfield in the JSON output for each wallet. -
Top up each wallet address with KAS from a faucet or another wallet
-
Update
.envwith the actual wallet addresses (W0_WALLET_TO_ADDRESS through W4_WALLET_TO_ADDRESS)
⚠️ CRITICAL WARNING:
WALLET_TO_ADDRESSis the change return address. After each transaction, remaining wallet funds (change) are sent to this address. If set to a placeholder or incorrect address, you will lose all wallet funds after the first transaction. Double-check each address matches your wallet!
- Restart workers:
Maintenance¶
Restart services:
Update to latest images:
docker compose --profile backend --profile frontend-w5 pull
docker compose --profile backend --profile frontend-w5 up -d
View resource usage: