Skip to main content
The Base Audit Bot uses a centralized Config dataclass to manage all configuration settings. Configuration is loaded from environment variables using the dotenv package.

Config Class

The Config dataclass contains all application settings organized by category.

Base Chain Configuration

base_rpc_url
str
required
RPC endpoint URL for connecting to the Base blockchain.Environment Variable: BASE_RPC_URLDefault: "https://mainnet.base.org"
basescan_api_key
str
required
API key for Basescan to fetch contract source code and verification status.Environment Variable: BASESCAN_API_KEYRequired: Yes (no default)

Anthropic Configuration

anthropic_api_key
str
required
API key for Anthropic Claude to perform AI-powered smart contract audits.Environment Variable: ANTHROPIC_API_KEYRequired: Yes (no default)

Twitter Configuration

twitter_api_key
str
required
Twitter API key (Consumer Key) for posting tweets.Environment Variable: TWITTER_API_KEYRequired: Yes (no default)
twitter_api_secret
str
required
Twitter API secret (Consumer Secret) for authentication.Environment Variable: TWITTER_API_SECRETRequired: Yes (no default)
twitter_access_token
str
required
Twitter access token for the bot’s account.Environment Variable: TWITTER_ACCESS_TOKENRequired: Yes (no default)
twitter_access_secret
str
required
Twitter access token secret for authentication.Environment Variable: TWITTER_ACCESS_SECRETRequired: Yes (no default)
twitter_bearer_token
str
Twitter bearer token for read-only operations.Environment Variable: TWITTER_BEARER_TOKENDefault: "" (empty string)

Webhook Configuration

webhook_secret
str
Secret token for validating GitHub webhook requests.Environment Variable: WEBHOOK_SECRETDefault: "" (empty string)
webhook_port
int
Port number for the webhook server to listen on.Environment Variable: WEBHOOK_PORTDefault: 5000

Bot Settings

scan_interval_minutes
int
How often (in minutes) to scan the blockchain for new contract deployments.Environment Variable: SCAN_INTERVAL_MINUTESDefault: 15Validation: Must be at least 1
blocks_to_scan
int
Number of recent blocks to scan for contract deployments in each scan cycle.Environment Variable: BLOCKS_TO_SCANDefault: 100Validation: Must be at least 1
min_contract_size
int
Minimum bytecode size (in bytes) for a contract to be considered for auditing. Filters out trivial contracts.Environment Variable: MIN_CONTRACT_SIZEDefault: 100
log_level
str
Logging level for the application.Environment Variable: LOG_LEVELDefault: "INFO"Options: "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"

Path Configuration

database_path
Path
Path to the SQLite database file.Environment Variable: DATABASE_PATHDefault: "./data/bot.db"
temp_dir
Path
Directory for temporarily cloning repositories during audits.Environment Variable: TEMP_DIRDefault: "./temp_repos"

Loading Configuration

from_env() Class Method

Loads configuration from environment variables. Validates that all required fields are present.
config = Config.from_env()
```python

**Raises:** `ValueError` if any required environment variables are missing.

**Required Variables:**
- `BASE_RPC_URL`
- `BASESCAN_API_KEY`
- `ANTHROPIC_API_KEY`
- `TWITTER_API_KEY`
- `TWITTER_API_SECRET`
- `TWITTER_ACCESS_TOKEN`
- `TWITTER_ACCESS_SECRET`

### validate() Method

Validates configuration values to ensure they are within acceptable ranges.

```python
config.validate()  # Returns True or raises ValueError
```python

**Validation Rules:**
- `base_rpc_url` must start with `"http"` or `"https"`
- `scan_interval_minutes` must be at least 1
- `blocks_to_scan` must be at least 1

## Helper Function

### get_config()

Convenience function that loads and validates configuration in one step.

```python
from config import get_config

config = get_config()
```python

This is equivalent to:

```python
config = Config.from_env()
config.validate()
```python

## Usage Example

### Setting Up Environment

Create a `.env` file in your project root:

```bash
# Base Chain
BASE_RPC_URL=https://mainnet.base.org
BASESCAN_API_KEY=your_basescan_api_key

# Anthropic
ANTHROPIC_API_KEY=your_anthropic_api_key

# Twitter
TWITTER_API_KEY=your_twitter_api_key
TWITTER_API_SECRET=your_twitter_api_secret
TWITTER_ACCESS_TOKEN=your_access_token
TWITTER_ACCESS_SECRET=your_access_secret
TWITTER_BEARER_TOKEN=your_bearer_token

# Webhook (optional)
WEBHOOK_SECRET=your_webhook_secret
WEBHOOK_PORT=5000

# Bot Settings
SCAN_INTERVAL_MINUTES=15
BLOCKS_TO_SCAN=100
MIN_CONTRACT_SIZE=100
LOG_LEVEL=INFO

# Paths
DATABASE_PATH=./data/bot.db
TEMP_DIR=./temp_repos
```python

### Loading in Application

```python
import logging
from config import get_config
from models import Database
from scanner import BaseChainScanner
from auditor import SolidityAuditor

# Load configuration
config = get_config()

# Set up logging
logging.basicConfig(
    level=config.log_level,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

# Initialize components
db = Database(config.database_path)
scanner = BaseChainScanner(
    rpc_url=config.base_rpc_url,
    basescan_api_key=config.basescan_api_key,
    min_contract_size=config.min_contract_size
)
auditor = SolidityAuditor(
    anthropic_api_key=config.anthropic_api_key,
    temp_dir=config.temp_dir
)
```python

### Accessing Configuration Values

```python
config = get_config()

# Access values directly
print(f"Scanning {config.blocks_to_scan} blocks every {config.scan_interval_minutes} minutes")
print(f"Database: {config.database_path}")
print(f"RPC URL: {config.base_rpc_url}")

# Use in conditionals
if config.webhook_secret:
    print("Webhook authentication enabled")
```python

## Environment Variables Reference

| Variable | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
| `BASE_RPC_URL` | str | Yes | `https://mainnet.base.org` | Base blockchain RPC endpoint |
| `BASESCAN_API_KEY` | str | Yes | - | Basescan API key |
| `ANTHROPIC_API_KEY` | str | Yes | - | Anthropic Claude API key |
| `TWITTER_API_KEY` | str | Yes | - | Twitter Consumer Key |
| `TWITTER_API_SECRET` | str | Yes | - | Twitter Consumer Secret |
| `TWITTER_ACCESS_TOKEN` | str | Yes | - | Twitter Access Token |
| `TWITTER_ACCESS_SECRET` | str | Yes | - | Twitter Access Secret |
| `TWITTER_BEARER_TOKEN` | str | No | `""` | Twitter Bearer Token |
| `WEBHOOK_SECRET` | str | No | `""` | GitHub webhook secret |
| `WEBHOOK_PORT` | int | No | `5000` | Webhook server port |
| `SCAN_INTERVAL_MINUTES` | int | No | `15` | Blockchain scan frequency |
| `BLOCKS_TO_SCAN` | int | No | `100` | Blocks per scan cycle |
| `MIN_CONTRACT_SIZE` | int | No | `100` | Minimum contract bytecode size |
| `LOG_LEVEL` | str | No | `INFO` | Logging level |
| `DATABASE_PATH` | str | No | `./data/bot.db` | SQLite database path |
| `TEMP_DIR` | str | No | `./temp_repos` | Temporary clone directory |

Build docs developers (and LLMs) love