Rate Limits - Overview
CCIP rate limits are an operator-level control on token pools. They limit how much of a token can move across a specific CCIP lane over time, reducing blast radius during incidents and helping manage operational risk.
This documentation is for operators, token issuers, and administrators who manage rate limits on token pool contracts. Most integrators do not need to interact with rate limits. Changes are applied on-chain, take effect immediately, and directly affect transfer availability.
How rate limits work
Rate limits are capacity buckets that refill over time. Each bucket has three parameters:
- isEnabled — whether the limit is active
- capacity — maximum tokens before the bucket is depleted
- rate — refill speed in tokens per second
Transfers consume capacity; if enough is not available, the transfer is rejected until the bucket refills. All values use the token's local smallest unit on the chain where the pool is deployed. When enabled, rate must be ≤ capacity.
Rate limit bucket
Available now
100,000 tokens
Rate limit settings
Largest possible single transfer.
Tokens added back every second.
Transfer
Fits in the bucket right now.
Try a transfer
Set an amount and send it. Used capacity refills every second, up to the max capacity.
Contract error:
Illustrative values in whole tokens. On-chain, rate limits are set in the token's smallest unit.
Each token pool maintains up to four limiters per remote chain (v2.0):
| Bucket | Direction | Used for |
|---|---|---|
| Default | Outbound / Inbound | Wait-for-finality transfers |
| Fast-finality | Outbound / Inbound | Fast-finality transfers (optional) |
Fast-finality buckets are optional. If one is not enabled, fast-finality traffic falls back to the default bucket. Whether fast-finality is permitted at all is controlled by the pool owner via setAllowedFinalityConfig.
- Outbound limits apply to sends from the local chain.
- Inbound limits apply to receives on the local chain.
Outbound is configured on the source pool; inbound on the destination pool. Both sides of a lane must be configured for limits to behave as intended.
Because CCIP commits messages in batches and chains finalize in epochs, destination inbound limits should be ~5–10% higher than source outbound limits (deployment tooling typically uses 10% headroom).
| State | Config | Effect |
|---|---|---|
| Active | isEnabled=true, capacity > 0 | Transfers consume capacity and refill over time |
| Disabled | isEnabled=false, capacity=0, rate=0 | No volume limit for that bucket |
| Throttled | isEnabled=true, capacity=0, rate=0 | All transfers blocked |
Rate limits are scoped per token pool, remote chain, bucket type, and direction — they do not pause CCIP globally.
Why rate limits exist
Rate limits are a defensive mechanism. They help:
- prevent large, single transfers from draining liquidity unexpectedly
- limit exposure during misconfiguration, incidents, or active investigations
- give operators time to react if abnormal activity is detected
Who should manage rate limits
Interact with rate limits only if you:
- operate or administer a CCIP token pool (v2.0 or v1.x)
- hold the pool owner role or
rateLimitAdmin - understand token decimals on each chain you configure
- accept responsibility for the operational impact of changes
| Role | Update limits | Add/remove lanes |
|---|---|---|
| Owner | Yes | Yes |
| rateLimitAdmin | Yes | No |
Responsibility and risk
Managing rate limits directly affects the availability of cross-chain transfers for a token. Incorrect configuration can:
- unintentionally halt bridging
- allow more volume than intended
- create congestion or stuck transfers
Changes are applied on-chain and take effect immediately. Always review parameters carefully, verify units, and use a multisig workflow where possible.