Builders
One DigitalOcean Ubuntu host, multiple isolated Node.js services under PM2. This is a monolithic deployment footprint, but service-based runtime boundaries reduce blast radius and let the indexer, WebSocket gateway and agent worker restart independently.
Internet
|
Cloudflare DNS (optional proxy)
|
Nginx :443
|---------------------|-------------------|
| | |
Next.js web :3000 Fastify API :3001 WS gateway :3002
| |
|----- Redis -------|
|
PostgreSQL :5432
^
|
Indexer :3010 / Worker :3011
| |
RPC HTTP/WS xAI API / PONS escrow / Mobula Enterprise
| |
Robinhood Chain OHLCV + swap quoting (server-side)Mobula: charts + swap routing only. Browser → FORGE API/WS → Mobula (enterprise key never leaves the server). See Market data.
forge-webforge-apiforge-wsforge-indexerforge-workercallerTip ≥ gas + min profit (Fee keeper)interface LaunchAdapter {
id: 'pons' | 'pumpfun' | 'flap';
chain: string;
getCapabilities(): Promise<LaunchCapabilities>;
getLiveConfig(): Promise<LaunchConfig[]>;
canLaunch(wallet: Address): Promise<boolean>;
buildLaunchIntent(input: LaunchInput): Promise<UnsignedLaunchIntent>;
parseLaunchReceipt(receipt: TransactionReceipt): Promise<LaunchResult>;
getLaunchState(token: string): Promise<NormalizedLaunchState>;
getQuote(input: TradeQuoteInput): Promise<TradeQuote>;
}MVP only registers PonsLaunchAdapter. Other adapters return COMING_SOON and have no signing code shipped.
Provide at least two HTTP RPCs and preferably two WS RPCs.
Responsibilities:
eth_blockNumber/latency health check[last_finalized+1, latest] using HTTP before accepting live tailDo not round-robin eth_getLogs across providers while indexing the same range unless results are validated; deterministic checkpointing is more important than spreading requests.
Tables store block_number, block_hash, tx_hash, log_index.
Indexer:
chain.reorg event so clients invalidate affected candles/tradesUse a small “unfinalized” window for UI and a finalized marker separately.
Redis channels:
forge:globalforge:agent:{agentId}forge:token:{chainId}:{token}forge:ops:indexerNormalized event envelope:
{
"v": 1,
"seq": "18492381-00012",
"type": "trade.executed",
"ts": "2026-10-08T00:00:00.000Z",
"chainId": 4663,
"agentId": "uuid",
"token": "0x...",
"data": {}
}MVP uses wallet auth:
Admin accounts require separate role assignment in DB and should be protected with an additional authentication factor/reverse-proxy restriction where practical.
The LLM receives:
It never receives:
.envTools are server functions identified by stable IDs and validate every parameter independently of model output.