# Rate Limiting Documentation

## Overview

This document describes rate limiting mechanisms for the trustless bridge system to prevent spam and bound tail risk.

## Current State

### Basic Rate Limiting

- Epoch-based rate limiting (if implemented)
- Per-relayer limits
- Configurable limits

## Rate Limiting Strategies

### 1. Per-Relayer Limits

**Current**: Max claims per epoch (e.g., 100 per hour)

**Enhancement**: More sophisticated limits
```solidity
mapping(address => RateLimit) public rateLimits;

struct RateLimit {
    uint256 maxClaimsPerHour;
    uint256 maxClaimsPerDay;
    uint256 currentHourCount;
    uint256 currentDayCount;
    uint256 lastReset;
}
```

### 2. Per-Deposit-Amount Limits

**Purpose**: Prevent large deposit spam

**Implementation**:
```solidity
mapping(address => mapping(uint256 => uint256)) public amountLimits; // relayer => amount tier => count

// Tier 1: < 1 ETH
// Tier 2: 1-10 ETH
// Tier 3: > 10 ETH
```

### 3. Dynamic Rate Limiting

**Purpose**: Adjust based on network conditions

**Implementation**:
```solidity
function getRateLimit(address relayer) public view returns (uint256) {
    uint256 baseLimit = 100;
    uint256 gasMultiplier = gasPrice > 100 gwei ? 2 : 1;
    return baseLimit * gasMultiplier;
}
```

## Spam Prevention

### 1. Minimum Deposit Amounts

**Purpose**: Prevent dust attacks

**Implementation**:
```solidity
uint256 public constant MIN_DEPOSIT = 0.001 ether;

function submitClaim(...) external {
    require(amount >= MIN_DEPOSIT, "Amount too small");
    // ...
}
```

### 2. Cooldown Periods

**Purpose**: Prevent rapid-fire attacks

**Implementation**:
```solidity
mapping(address => uint256) public lastClaimTime;
uint256 public constant COOLDOWN = 60 seconds;

function submitClaim(...) external {
    require(block.timestamp >= lastClaimTime[msg.sender] + COOLDOWN, "Cooldown active");
    lastClaimTime[msg.sender] = block.timestamp;
    // ...
}
```

### 3. Reputation System

**Purpose**: Penalize repeat offenders

**Implementation**:
```solidity
mapping(address => uint256) public violationCount;
mapping(address => uint256) public cooldownMultiplier;

function submitClaim(...) external {
    uint256 cooldown = COOLDOWN * (1 + cooldownMultiplier[msg.sender]);
    require(block.timestamp >= lastClaimTime[msg.sender] + cooldown, "Cooldown active");
    // ...
}
```

## Testing

### Test Suite

Create `test/bridge/trustless/RateLimiting.t.sol`:
- Test rate limit enforcement
- Test cooldown periods
- Test spam prevention
- Test edge cases

## Recommendations

### Phase 1: Basic Enhancement

1. Implement per-relayer limits
2. Add minimum deposit amounts
3. Add cooldown periods

### Phase 2: Advanced Features

4. Dynamic rate limiting
5. Reputation system
6. Tiered limits

## References

- Contracts: `contracts/bridge/trustless/`
- Test Suite: `test/bridge/trustless/RateLimiting.t.sol`

