# Directory Structure

This document explains the directory structure of the project, particularly the distinction between `test/` vs `tests/` and `script/` vs `scripts/`.

## Directory Overview

### Foundry Directories (Solidity)

#### `test/` - Foundry Test Files
- **Purpose**: Contains Foundry test files (Solidity)
- **File Pattern**: `*.t.sol`
- **Usage**: `forge test`
- **Contents**:
  - `Aggregator.t.sol` - Oracle aggregator tests
  - `Multicall.t.sol` - Multicall utility tests
  - `WETH.t.sol` - WETH token tests

#### `script/` - Foundry Deployment Scripts
- **Purpose**: Contains Foundry deployment scripts (Solidity)
- **File Pattern**: `*.s.sol`
- **Usage**: `forge script script/Deploy.s.sol --rpc-url $RPC_URL --broadcast`
- **Contents**:
  - `Deploy.s.sol` - Main deployment script
  - `DeployWETH.s.sol` - WETH deployment script
  - `DeployMulticall.s.sol` - Multicall deployment script
  - `DeployOracle.s.sol` - Oracle deployment script

### Shell Script Directories

#### `tests/` - Shell Script Tests
- **Purpose**: Contains shell script tests for infrastructure and network
- **File Pattern**: `*.sh`
- **Usage**: `./tests/health-check.sh`, `./tests/load-test.sh`
- **Contents**:
  - `health-check.sh` - Network health check script
  - `load-test.sh` - RPC endpoint load test script

#### `scripts/` - Shell Scripts
- **Purpose**: Contains utility shell scripts for deployment, key management, etc.
- **File Pattern**: `*.sh`
- **Usage**: `./scripts/generate-genesis-proper.sh 4`
- **Contents**:
  - `generate-genesis-proper.sh` - Canonical QBFT genesis file generation script
  - `generate-genesis.sh` - Compatibility wrapper for the canonical generator
  - `deployment/` - Deployment scripts
    - `deploy-weth.sh` - WETH deployment script
    - `deploy-multicall.sh` - Multicall deployment script
  - `key-management/` - Key management scripts
    - `generate-validator-keys.sh` - Validator key generation
    - `generate-oracle-keys.sh` - Oracle key generation
    - `azure-keyvault-setup.sh` - Azure Key Vault setup

## Why Two Sets of Directories?

### Foundry Convention
- Foundry (the Solidity testing framework) uses **singular** directory names:
  - `test/` for test files
  - `script/` for deployment scripts
- These are Foundry's default directories and should not be renamed

### Shell Scripts Convention
- Shell scripts use **plural** directory names to distinguish from Foundry:
  - `tests/` for shell script tests
  - `scripts/` for shell script utilities
- This avoids confusion and follows common project conventions

## Usage Examples

### Running Foundry Tests
```bash
# Run all Foundry tests
forge test

# Run specific test
forge test --match-test testDeposit

# Run with verbosity
forge test -vvv
```

### Running Foundry Scripts
```bash
# Deploy all contracts
forge script script/Deploy.s.sol --rpc-url $RPC_URL --broadcast

# Deploy WETH
forge script script/DeployWETH.s.sol --rpc-url $RPC_URL --broadcast

# Deploy with private key
forge script script/DeployOracle.s.sol --rpc-url $RPC_URL --broadcast --private-key $PRIVATE_KEY
```

### Running Shell Script Tests
```bash
# Health check
./tests/health-check.sh

# Load test
./tests/load-test.sh

# With custom RPC URL
RPC_URL=https://rpc.d-bis.org ./tests/health-check.sh
```

### Running Shell Scripts
```bash
# Generate genesis
./scripts/generate-genesis-proper.sh 4

# Generate validator keys
./scripts/key-management/generate-validator-keys.sh 4

# Deploy WETH (shell script wrapper)
./scripts/deployment/deploy-weth.sh
```

## Makefile Targets

The Makefile provides convenient targets for common operations:

```bash
# Run all tests (Foundry + shell scripts)
make test

# Run only Foundry tests
make contracts

# Generate genesis
make genesis

# Generate keys
make keys
```

## Configuration

### Foundry Configuration (`foundry.toml`)
- `src = "contracts"` - Source directory for contracts
- `test/` - Default test directory (not specified, uses default)
- `script/` - Default script directory (not specified, uses default)
- For monorepo day-to-day work, prefer the scoped workflow in [FOUNDRY_MONOREPO_SCOPES.md](FOUNDRY_MONOREPO_SCOPES.md) so Forge only compiles the contract subtree you are editing.

### Test Configuration
- Foundry tests: Configured in `foundry.toml`
- Shell script tests: No special configuration needed

## Best Practices

1. **Foundry Tests**: Place all Solidity test files in `test/`
2. **Foundry Scripts**: Place all deployment scripts in `script/`
3. **Shell Tests**: Place infrastructure/network tests in `tests/`
4. **Shell Scripts**: Place utility scripts in `scripts/`
5. **Naming**: Use descriptive names that indicate purpose
6. **Documentation**: Document complex scripts in their headers

## Adding New Files

### Adding a Foundry Test
1. Create file in `test/` directory
2. Name it `*.t.sol` (e.g., `MyContract.t.sol`)
3. Import from `contracts/` directory
4. Run with `forge test`

### Adding a Foundry Script
1. Create file in `script/` directory
2. Name it `*.s.sol` (e.g., `DeployMyContract.s.sol`)
3. Import from `contracts/` directory
4. Run with `forge script script/DeployMyContract.s.sol --rpc-url $RPC_URL --broadcast`

### Adding a Shell Test
1. Create file in `tests/` directory
2. Name it `*.sh` (e.g., `my-test.sh`)
3. Make it executable: `chmod +x tests/my-test.sh`
4. Run with `./tests/my-test.sh`

### Adding a Shell Script
1. Create file in `scripts/` directory (or appropriate subdirectory)
2. Name it `*.sh` (e.g., `my-script.sh`)
3. Make it executable: `chmod +x scripts/my-script.sh`
4. Run with `./scripts/my-script.sh`

## Summary

| Directory | Type | Purpose | Files |
|-----------|------|---------|-------|
| `test/` | Foundry | Solidity test files | `*.t.sol` |
| `script/` | Foundry | Solidity deployment scripts | `*.s.sol` |
| `tests/` | Shell | Infrastructure/network tests | `*.sh` |
| `scripts/` | Shell | Utility scripts | `*.sh` |

This structure follows Foundry conventions while providing clear separation between Solidity and shell script files.
