Skip to main content

Run an Indexer

Indexers are the first step in the cross-chain flow. They monitor for cross-chain transfer events, verify proofs, and relay user assets to the user's Smart Account on the destination chain.

What Indexers Do​

1. MONITOR SOURCE CHAIN
└── Watch for burn events (TokenMessenger.DepositForBurn)

2. WAIT FOR ATTESTATION
└── Verify cross-chain proof

3. RECEIVE ASSETS
└── Deliver assets to user's Smart Account on destination chain

4. EARN FEE
└── Indexer fee paid when message is indexed

Requirements​

RequirementMinimumRecommended
CPU2 cores4 cores
RAM2 GB4 GB
Storage10 GB20 GB
Network10 Mbps100 Mbps
ETH (destination)0.1 ETH0.5 ETH

Quick Start​

1. Clone Repository​

git clone https://github.com/pons-network/resolver
cd resolver
npm install

2. Configure Environment​

cp .env.example .env

Edit .env:

# Mode
OPERATOR_MODE=indexer

# Wallet (NEVER use your main wallet)
PRIVATE_KEY=your_private_key_here

# Chain Configuration (Sepolia → Arc Testnet)
SOURCE_CHAIN_ID=11155111
DESTINATION_CHAIN_ID=88991

# RPC Endpoints
SOURCE_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/YOUR_KEY
DESTINATION_RPC_URL=https://rpc.testnet.arc.network

# Fee Configuration
MIN_INDEXER_FEE=100000 # Minimum fee to process (in token units)

3. Run Indexer​

# Development
npm run start -- --mode indexer

# Production (with PM2)
pm2 start npm --name "pons-indexer" -- run start -- --mode indexer

# Docker
docker-compose up -d indexer

Configuration Reference​

Core Settings​

# Required
PRIVATE_KEY= # Operator wallet (funded with ETH)
SOURCE_RPC_URL= # Source chain RPC
DESTINATION_RPC_URL= # Destination chain RPC

# Chain IDs
SOURCE_CHAIN_ID=11155111 # Sepolia
DESTINATION_CHAIN_ID=88991 # Arc Testnet

Fee Settings​

# Minimum fee to process a transaction
MIN_INDEXER_FEE=100000 # Minimum fee (in token units)

# Skip transactions with fees below this
# Set higher in high-gas conditions

Performance Settings​

# Concurrent processing
MAX_CONCURRENT_JOBS=5 # Parallel transactions

# Polling intervals
SOURCE_POLL_INTERVAL_MS=10000 # How often to check source chain
ATTESTATION_POLL_INTERVAL_MS=30000 # How often to poll Circle

Historical Scanning​

# Catch missed messages after restarts
HISTORICAL_SCAN_ENABLED=true
HISTORICAL_TIME_WINDOW_MS=3600000 # Look back 1 hour
HISTORICAL_SCAN_INTERVAL_MS=300000 # Re-scan every 5 min

Docker Deployment​

docker-compose.yml​

version: '3.8'

services:
indexer:
build: .
command: ["npm", "run", "start", "--", "--mode", "indexer"]
env_file:
- .env
restart: unless-stopped
deploy:
resources:
limits:
cpus: '2'
memory: 2G
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"

Run​

docker-compose up -d indexer
docker-compose logs -f indexer

Monitoring​

Health Check​

# Check if process is running
pm2 status pons-indexer

# View logs
pm2 logs pons-indexer --lines 100

Key Metrics​

Monitor these values:

MetricHealthyAction if Unhealthy
Messages indexed/hour>0Check RPC connection
Success rate>95%Check wallet balance
Wallet balance>0.05 ETHRefill wallet
Error rateLess than 5%Check logs

Log Messages​

✅ Good:
[INFO] Indexer started, monitoring source chain
[INFO] Found burn event: 0xabc...
[INFO] Attestation received for message
[INFO] Message indexed successfully, earned indexer fee

⚠️ Warning:
[WARN] Low wallet balance: 0.04 ETH

❌ Error:
[ERROR] Failed to index message: insufficient gas
[ERROR] RPC connection failed

Troubleshooting​

"Insufficient gas"​

# Check balance
cast balance $WALLET_ADDRESS --rpc-url $DESTINATION_RPC_URL

# Fund wallet with more ETH
# Sepolia: use faucet
# Mainnet: transfer from exchange

"Attestation not found"​

  • Normal for cross-chain transfers (wait for proof)
  • If persists, check cross-chain protocol status

"Already indexed"​

  • Another indexer processed this message first
  • This is normal competition behavior
  • Increase uptime to catch more messages

"RPC rate limited"​

# Use a better RPC provider or run your own node
SOURCE_RPC_URL=https://your-own-node.com

Profitability​

Costs​

ItemEstimated Cost
Gas per index~0.002 ETH
Server (VPS)~$10-50/month

Revenue​

VolumeMonthly TransactionsEarnings Potential
Low~3,000/monthCovers server costs
Medium~15,000/monthProfitable
High~30,000/monthStrong returns

Break-even​

  • Earnings depend on fee rates and network volume
  • Server costs: ~$20-50/month
  • Gas costs: ~$6/month (100 txn * $0.002)
  • Net profit: ~$250/month

Best Practices​

Wallet Management​

  • Use a dedicated wallet (never your main wallet)
  • Start with small amounts
  • Set up balance alerts
  • Withdraw earnings regularly

Uptime​

  • Use PM2 or Docker with auto-restart
  • Set up health monitoring
  • Use reliable RPC providers
  • Consider running multiple instances

Security​

  • Never expose private key
  • Run behind firewall
  • Keep software updated
  • Monitor for suspicious activity

Next Steps​