Inspect Current Rate Limits

Before updating any rate limit configuration, inspect the current inbound and outbound settings for the token pool and lane you are managing.

On v2.0 pools, also inspect the fast-finality bucket if fast-finality transfers are enabled on the lane.

What you can inspect

Each token pool exposes read-only functions that return rate limiter state for a given remote chain. These values describe:

  • whether the inbound or outbound rate limit is enabled
  • the configured capacity and refill rate
  • the current tokens available in the bucket (with time-based refill applied)
  • the timestamp of the last refill

You can also read the current rate limit admin:

Pool VersionFunction
v2.0getDynamicConfig() → returns (router, rateLimitAdmin, feeAdmin)
v1.xgetRateLimitAdmin() → returns rateLimitAdmin

Identify the token pool contract

To inspect rate limits, you first need the token pool contract address for the token you are managing.

You can find token pool addresses using:

  • the Token Manager
  • TokenAdminRegistry lookups for your token
  • CCIP Directory

Select the remote chain

Rate limits are configured per remote chain. When querying a rate limiter, you must provide the remote chain selector that identifies the cross-chain lane you want to inspect.

Chain selectors are represented as uint64 values. You can find the correct selector for each supported network in the CCIP Directory.

Query rate limiter state (v2.0)

v2.0

Inbound and outbound state for a bucket type are returned by one function:

function getCurrentRateLimiterState(
  uint64 remoteChainSelector,
  bool fastFinality
) external view returns (
  RateLimiter.TokenBucket memory outboundRateLimiterState,
  RateLimiter.TokenBucket memory inboundRateLimiterState
);
fastFinalityReturns
falseDefault (wait-for-finality) outbound and inbound
trueFast-finality outbound and inbound

Call twice per remote chain — fastFinality = false and fastFinality = true — to inspect all bucket pairs.

v1.x pools

v1 pools expose separate getters per direction:

function getCurrentOutboundRateLimiterState(
  uint64 remoteChainSelector
) external view returns (RateLimiter.TokenBucket memory);

function getCurrentInboundRateLimiterState(
  uint64 remoteChainSelector
) external view returns (RateLimiter.TokenBucket memory);

There is no fastFinality parameter. One inbound and one outbound query per remote chain is sufficient.

You can call these functions via a block explorer, web3 client, or deployment state tooling.

Interpreting the TokenBucket state

A typical rate limiter state includes the following fields:

struct TokenBucket {
  uint128 tokens;
  uint32 lastUpdated;
  bool isEnabled;
  uint128 capacity;
  uint128 rate;
}

Where:

  • tokens (uint128): the current number of tokens available in the bucket (after time-based refill)
  • lastUpdated (uint32): the timestamp of the last refill
  • isEnabled (bool): whether the rate limit is active
  • capacity (uint128): the maximum bucket size
  • rate (uint128): the refill rate in tokens per second

All numeric values are expressed in the token's local smallest unit on the chain where the pool is deployed, not in whole tokens.

Reading disabled or unconfigured fast-finality buckets

Inbound vs outbound inspection

  • Outbound (source chain pool) — transfers leaving the current chain
  • Inbound (destination chain pool) — transfers entering the current chain

For a complete lane picture, inspect outbound on the source and inbound on the destination.

Before proceeding

  • record existing values for all relevant buckets
  • confirm token decimals on each chain
  • identify which direction, lane, and bucket type you intend to modify
  • verify your wallet is owner or rateLimitAdmin

Only proceed to updates once you fully understand the current state. Next, review token units and decimals before submitting any update transaction.

Get the latest Chainlink content straight to your inbox.