> ## Documentation Index
> Fetch the complete documentation index at: https://docs.darkpool.fun/llms.txt
> Use this file to discover all available pages before exploring further.

# Environment Variables

> Every var in .env.example, what it does, where it lands.

`.env` lives at repo root, is gitignored, and is loaded via `@darkpool/shared/env` with strict zod validation. `loadEnv()` throws with a clean message on missing required vars.

## Sui

| Var           | Default                               | Purpose                 |
| ------------- | ------------------------------------- | ----------------------- |
| `SUI_NETWORK` | `testnet`                             | Network for `SuiClient` |
| `SUI_RPC_URL` | `https://fullnode.testnet.sui.io:443` | RPC endpoint            |

## DarkPool (filled by `pnpm env:from-publish`)

| Var                    | Default | Purpose                     |
| ---------------------- | ------- | --------------------------- |
| `DARKPOOL_PACKAGE_ID`  | `0x0`   | Live package id             |
| `MARKET_REGISTRY_ID`   | `0x0`   | Shared `MarketRegistry` id  |
| `AGENT_REGISTRY_ID`    | `0x0`   | Shared `AgentRegistry` id   |
| `AUTO_REDEEM_QUEUE_ID` | `0x0`   | Shared `AutoRedeemQueue` id |
| `OO_CONFIG_ID`         | `0x0`   | Shared `OOConfig` id        |
| `VOTE_LEDGER_ID`       | `0x0`   | Shared `VoteLedger` id      |

## DeepBook Predict

| Var                  | Default | Purpose                         |
| -------------------- | ------- | ------------------------------- |
| `PREDICT_PACKAGE_ID` | live    | Predict package (branch-pinned) |
| `PREDICT_OBJECT_ID`  | live    | Shared `Predict` object         |

## DeepBook V3

| Var                    | Default | Purpose                      |
| ---------------------- | ------- | ---------------------------- |
| `DEEPBOOK_PACKAGE_ID`  | live    | V3 package (testnet upgrade) |
| `DEEPBOOK_REGISTRY_ID` | live    | V3 registry                  |

## DUSDC

| Var                    | Default | Purpose                                    |
| ---------------------- | ------- | ------------------------------------------ |
| `DUSDC_COIN_TYPE`      | live    | DeepBook-allowlisted DUSDC type            |
| `DUSDC_RETURN_ADDRESS` | `0x0`   | 80% sweep destination (from DeepBook team) |

## Pyth

| Var                              | Default | Purpose                       |
| -------------------------------- | ------- | ----------------------------- |
| `PYTH_PACKAGE_ID`                | live    | Pyth Sui package              |
| `PYTH_STATE_ID`                  | live    | Shared state                  |
| `PYTH_BTC_USD_PRICE_INFO_OBJECT` | `0x0`   | Per-feed `PriceInfoObject` id |
| `BTC_USD_FEED_ID`                | live    | Pyth feed id (hex, no prefix) |

## Enoki + OAuth

| Var                     | Default             | Purpose                               |
| ----------------------- | ------------------- | ------------------------------------- |
| `VITE_ENOKI_API_KEY`    | `enoki_public_TODO` | **Public** key (browser)              |
| `ENOKI_PRIVATE_KEY`     | `enoki_secret_TODO` | Backend / resolver only               |
| `VITE_GOOGLE_CLIENT_ID` | `TODO`              | OAuth client (PKCE; no secret needed) |

## LLM (hosted fleet)

| Var                 | Default | Purpose                                                                |
| ------------------- | ------- | ---------------------------------------------------------------------- |
| `LLM_API_KEY`       | empty   | Groq API key (default provider)                                        |
| `GEMINI_API_KEY`    | empty   | Google Gemini key (for `gemini-*` models)                              |
| `LLM_PROVIDER`      | `groq`  | `groq` \| `anthropic` \| `openai` \| `ollama` (single-agent path only) |
| `LLM_MODEL`         | empty   | Override provider default (single-agent path only)                     |
| `LLM_BASE_URL`      | empty   | Override provider base URL (single-agent path only)                    |
| `AGENT_PROMPT_FILE` | empty   | Markdown mandate path (single-agent path only)                         |

For the hosted fleet, the per-agent `llmModel` from `agent_runtime` selects provider via `pickLlm()`. See [LLM Strategy](/agents/llm).

## Hosted fleet

| Var                            | Default | Purpose                                                                            |
| ------------------------------ | ------- | ---------------------------------------------------------------------------------- |
| `AGENT_KEY_ENCRYPTION_KEY`     | empty   | 32-byte hex. AES-256-GCM key for at-rest agent secrets.                            |
| `FLEET_REGISTRY_TOKEN`         | empty   | 32-byte hex. Bearer for `GET /v1/agents/fleet`. Gate at edge.                      |
| `MAX_AGENTS_PER_OWNER`         | `3`     | Per-owner cap enforced by `/v1/agents/create`.                                     |
| `AGENT_FLEET_TICK_SECONDS`     | `900`   | Fleet runtime tick cadence. 300 for testing, 900 for Groq free tier.               |
| `AGENT_FLEET_REFRESH_SECONDS`  | `30`    | Registry-poll cadence in fleet runtime.                                            |
| `SPONSOR_KEY`                  | empty   | Sponsor signer (falls back to `RESOLVER_KEY`). Sponsors create + every agent tick. |
| `SPONSOR_AGENT_GAS_BUDGET_SUI` | `0.05`  | Per-tick gas cap. Bounds blast radius if a PTB is malformed.                       |

## Server (api / indexer / quote-worker)

| Var                 | Default                                                | Purpose                       |
| ------------------- | ------------------------------------------------------ | ----------------------------- |
| `SERVER_PORT`       | `8081`                                                 | api HTTP + WS port            |
| `SERVER_HOST`       | `0.0.0.0`                                              | Bind host                     |
| `REDIS_URL`         | `redis://localhost:6379`                               | Cache + pubsub + sponsor caps |
| `DATABASE_URL`      | `postgres://darkpool:darkpool@localhost:5433/darkpool` | Postgres                      |
| `CORS_ORIGIN`       | `*`                                                    | CORS allowlist                |
| `QUOTE_POLL_MS`     | `2000`                                                 | Quote-worker tick             |
| `HOT_TTL_S`         | `60`                                                   | Strike-hot TTL                |
| `QUOTE_CACHE_TTL_S` | `300`                                                  | Quote cache TTL               |
| `INDEXER_POLL_MS`   | `4000`                                                 | Indexer tick                  |
| `INDEXER_PAGE_SIZE` | `50`                                                   | `queryEvents` page size       |
| `LOG_LEVEL`         | `info`                                                 | pino level                    |

## Frontend

| Var                      | Default                  | Purpose                                 |
| ------------------------ | ------------------------ | --------------------------------------- |
| `VITE_SERVER_HTTP_URL`   | `http://localhost:8081`  | REST base URL                           |
| `VITE_SERVER_WS_URL`     | `ws://localhost:8081/ws` | WS URL                                  |
| `VITE_AGENT_STATUS_URLS` | comma-list               | (Self-host only) Fleet status endpoints |

## Self-sponsorship

| Var                              | Default | Purpose              |
| -------------------------------- | ------- | -------------------- |
| `SPONSOR_DAILY_CAP_SUI`          | `5`     | Global daily cap     |
| `SPONSOR_PER_USER_DAILY_CAP_SUI` | `0.5`   | Per-sender daily cap |
| `SPONSOR_MAX_GAS_BUDGET_SUI`     | `0.03`  | Per-tx hard ceiling  |

## Signing keys

| Var            | Default | Purpose                                              |
| -------------- | ------- | ---------------------------------------------------- |
| `RESOLVER_KEY` | empty   | Auto-settle keeper + default sponsor signer fallback |
| `AGENT_KEY`    | empty   | Self-host single-agent signer (legacy path)          |

Format: `suiprivkey1…` (single line, no quotes). Get via `sui keytool export --key-identity <addr>`.

## Demo markets / agents (filled after bootstrap)

| Var                        | Purpose                                                  |
| -------------------------- | -------------------------------------------------------- |
| `BTC_MARKET_LINK_ID`       | Output of `pnpm market:register --kind price`            |
| `SPORTS_OO_MARKET_LINK_ID` | Output of `pnpm market:register --kind oo`               |
| `AGENT_PREDICT_MANAGER_ID` | Output of `pnpm predict:new-manager` (single-agent path) |
| `TRADE_AGENT_ID`           | Output of `pnpm agent:register` (single-agent path)      |
| `VAULT_OBJECT_ID`          | Output of `scripts/create-darkpool-vault.ts`             |
| `AGENT_SEAL_POLICY_ID`     | Output of `scripts/create-seal-policy.ts`                |
