Set Token Pool rate limits using Hardhat

Guide Versions

This guide is available in multiple versions. Choose the one that matches your needs.

This tutorial will guide you through the process of updating the rate limiter settings for outbound and inbound transfers in your deployed token pools using Hardhat. You will first review existing rate limiter settings and then update them.

Prerequisites

Before You Begin

  1. Make sure you have Node.js v18 or above installed. If not, install Node.js v18:
    Download Node.js 18 if you don't have it installed. Optionally, you can use the nvm package to switch between Node.js versions:

    nvm use 18
    

    Verify that the correct version of Node.js is installed:

    node -v
    

    Example output:

    $ node -v
    v18.7.0
    
  2. Clone the repository and navigate to the project directory:

    git clone https://github.com/smartcontractkit/smart-contract-examples.git
    cd smart-contract-examples/ccip/cct/hardhat
    
  3. Install dependencies for the project:

    npm install
    
  4. Compile the project:

    npm run compile
    
  5. Encrypt your environment variables for higher security:
    The project uses @chainlink/env-enc to encrypt your environment variables at rest. Follow the steps below to configure your environment securely:

    1. Set an encryption password for your environment variables:

      npx env-enc set-pw
      
    2. Set up a .env.enc file with the necessary variables for Avalanche Fuji and Arbitrum Sepolia testnets. Use the following command to add the variables:

      npx env-enc set
      

      Variables to configure:

      • AVALANCHE_FUJI_RPC_URL: A URL for the Avalanche Fuji testnet. You can get a personal endpoint from services like Alchemy or Infura.
      • ARBITRUM_SEPOLIA_RPC_URL: A URL for the Arbitrum Sepolia testnet. You can get a personal endpoint from services like Alchemy or Infura.
      • PRIVATE_KEY: The private key for your testnet wallet. If you use MetaMask, you can follow this guide to export your private key. Note: This key is required for signing transactions like token transfers.
  6. Fund your EOA with native gas tokens:
    Make sure your EOA has enough native gas tokens on Avalanche Fuji to cover transaction fees. You can use the Chainlink faucets to get testnet tokens.

Tutorial

Review current rate limiter settings

Use the getCurrentRateLimits task to fetch the current rate limiter states for a specific chain from a token pool. This task provides detailed information about both inbound and outbound rate limits, including:

  • Whether rate limiting is enabled
  • The maximum capacity (bucket size)
  • The refill rate (tokens per second)
  • Current token amount in the bucket
  • Last update timestamp

Below is an explanation of the parameters used:

ParameterDescriptionDefaultRequired
pooladdressThe address of the token pool to query.N/AYes
remotechainThe remote blockchain to check rate limits for (e.g., arbitrumSepolia for Fuji pool).N/AYes
networkThe blockchain on which to execute the query (e.g., avalancheFuji, arbitrumSepolia).N/AYes
  1. Get rate limiter settings for the token pool on Avalanche Fuji:

    npx hardhat getCurrentRateLimits \
      --pooladdress 0xcC8bb3E03c59603522732B17487D2Cd5a5a3e047 \
      --remotechain arbitrumSepolia \
      --network avalancheFuji
    

    Example output:

    2025-05-15T09:03:41.140Z info:
    Rate Limiter States for Chain: arbitrumSepolia
    2025-05-15T09:03:41.142Z info: Pool Address: 0xcC8bb3E03c59603522732B17487D2Cd5a5a3e047
    2025-05-15T09:03:41.142Z info: Chain Selector: 3478487238524512106
    2025-05-15T09:03:41.142Z info:
    Outbound Rate Limiter:
    2025-05-15T09:03:41.142Z info:   Enabled: false
    2025-05-15T09:03:41.143Z info:   Capacity: 0
    2025-05-15T09:03:41.143Z info:   Rate: 0
    2025-05-15T09:03:41.143Z info:   Tokens: 0
    2025-05-15T09:03:41.143Z info:   Last Updated: 1747299820
    2025-05-15T09:03:41.144Z info:
    Inbound Rate Limiter:
    2025-05-15T09:03:41.144Z info:   Enabled: false
    2025-05-15T09:03:41.144Z info:   Capacity: 0
    2025-05-15T09:03:41.144Z info:   Rate: 0
    2025-05-15T09:03:41.144Z info:   Tokens: 0
    2025-05-15T09:03:41.144Z info:   Last Updated: 1747299820
    
  2. Get rate limiter settings for the token pool on Arbitrum Sepolia:

    npx hardhat getCurrentRateLimits \
      --pooladdress 0x74F0842a9A55575e8e36692c356292a812640F67 \
      --remotechain avalancheFuji \
      --network arbitrumSepolia
    

    Example output:

    2025-05-15T09:07:22.079Z info:
    Rate Limiter States for Chain: avalancheFuji
    2025-05-15T09:07:22.080Z info: Pool Address: 0x74F0842a9A55575e8e36692c356292a812640F67
    2025-05-15T09:07:22.080Z info: Chain Selector: 14767482510784806043
    2025-05-15T09:07:22.080Z info:
    Outbound Rate Limiter:
    2025-05-15T09:07:22.080Z info:   Enabled: false
    2025-05-15T09:07:22.081Z info:   Capacity: 0
    2025-05-15T09:07:22.081Z info:   Rate: 0
    2025-05-15T09:07:22.081Z info:   Tokens: 0
    2025-05-15T09:07:22.081Z info:   Last Updated: 1747300041
    2025-05-15T09:07:22.081Z info:
    Inbound Rate Limiter:
    2025-05-15T09:07:22.081Z info:   Enabled: false
    2025-05-15T09:07:22.081Z info:   Capacity: 0
    2025-05-15T09:07:22.081Z info:   Rate: 0
    2025-05-15T09:07:22.081Z info:   Tokens: 0
    2025-05-15T09:07:22.081Z info:   Last Updated: 1747300041
    

Update rate limiter settings

Use the updateRateLimiters task to update the rate limiter configurations for an existing chain connection in your token pool. This task specifically interacts with the setChainRateLimiterConfig function of the TokenPool contract, allowing you to adjust the rate limits without altering other configurations like remote pool addresses.

The updateRateLimiters task allows you to:

  • Enable or disable rate limiting for outbound or inbound transfers or both.
  • Set the capacity and rate for the rate limiters, controlling the flow of tokens.
  • Target a specific remote chain, updating rate limits for that chain only.

Below is an explanation of the parameters used during the rate limiter update process:

ParameterDescriptionDefaultRequired
pooladdressThe address of the token pool being configured.N/AYes
remotechainThe remote blockchain to which this pool is linked. Examples include avalancheFuji, arbitrumSepolia, baseSepolia, and sepolia.N/AYes
ratelimiterSpecifies which rate limiters to update: inbound, outbound, or both.bothNo
outboundratelimitenabledA flag indicating whether to enable outbound rate limits for cross-chain transfers (true or false).falseNo
outboundratelimitcapacityThe maximum number of tokens allowed in the bucket for outbound transfers (in wei). Note: Applicable if outbound rate limits are enabled.0No
outboundratelimitrateThe number of tokens per second that the bucket is refilled for outbound transfers (in wei). Note: Applicable if outbound rate limits are enabled.0No
inboundratelimitenabledA flag indicating whether to enable inbound rate limits for cross-chain transfers (true or false).falseNo
inboundratelimitcapacityThe maximum number of tokens allowed in the bucket for inbound transfers (in wei). Note: Applicable if inbound rate limits are enabled.0No
inboundratelimitrateThe number of tokens per second that the bucket is refilled for inbound transfers (in wei). Note: Applicable if inbound rate limits are enabled.0No
networkThe blockchain network where the local token pool is deployed. Examples include avalancheFuji, arbitrumSepolia, baseSepolia, and sepolia.N/AYes

Command syntax:

npx hardhat updateRateLimiters \
  --pooladdress <POOL_ADDRESS> \
  --remotechain <REMOTE_CHAIN> \
  --ratelimiter <inbound/outbound/both> \
  --outboundratelimitenabled <true/false> \
  --outboundratelimitcapacity <OUTBOUND_CAPACITY> \
  --outboundratelimitrate <OUTBOUND_RATE> \
  --inboundratelimitenabled <true/false> \
  --inboundratelimitcapacity <INBOUND_CAPACITY> \
  --inboundratelimitrate <INBOUND_RATE> \
  --network <NETWORK_NAME>

Example command:

Suppose you want to enable inbound and outbound rate limits for your token pool on Avalanche Fuji to control the number of tokens received or sent from/to Arbitrum Sepolia. We will use an existing token pool that interacts with an ERC20 token with 18 decimals:

  • Token Pool on Avalanche Fuji:

    • Outbound Rate Limiter:

      • Enabled: true
      • Capacity: 10000000000000000000 wei (equivalent to 10 tokens, based on 18 decimals)
      • Rate: 100000000000000000 wei (equivalent to 0.1 token per second, based on 18 decimals)
      • Note:
        • Capacity / Rate = 10 / 0.1 = 100 seconds
        • It takes 100 seconds to replenish the bucket from 0 to full capacity.
    • Inbound Rate Limiter:

      • Enabled: true
      • Capacity: 20000000000000000000 wei (equivalent to 20 tokens, based on 18 decimals)
      • Rate: 100000000000000000 wei (equivalent to 0.1 tokens per second, based on 18 decimals)
      • Note:
        • Capacity / Rate = 20 / 0.1 = 200 seconds
        • It takes 200 seconds to replenish the bucket from 0 to full capacity.
  • Token Pool on Arbitrum Sepolia: Rate limits are the same as the Avalanche Fuji pool, but the inbound and outbound settings are swapped.

    • Outbound Rate Limiter:
      • Enabled: true
      • Capacity: 20000000000000000000 wei
      • Rate: 100000000000000000 wei
    • Inbound Rate Limiter:
      • Enabled: true
      • Capacity: 10000000000000000000 wei
      • Rate: 100000000000000000 wei
  1. Update rate limiter settings for the token pool on Avalanche Fuji: Replace <POOL_ADDRESS> with your token pool address.

    npx hardhat updateRateLimiters \
      --pooladdress <POOL_ADDRESS> \
      --remotechain arbitrumSepolia \
      --ratelimiter both \
      --outboundratelimitenabled true \
      --outboundratelimitcapacity 10000000000000000000 \
      --outboundratelimitrate 100000000000000000 \
      --inboundratelimitenabled true \
      --inboundratelimitcapacity 20000000000000000000 \
      --inboundratelimitrate 100000000000000000 \
      --network avalancheFuji
    

    Expected output:

    $ npx hardhat updateRateLimiters \
      --pooladdress 0xcC8bb3E03c59603522732B17487D2Cd5a5a3e047 \
      --remotechain arbitrumSepolia \
      --ratelimiter both \
      --outboundratelimitenabled true \
      --outboundratelimitcapacity 10000000000000000000 \
      --outboundratelimitrate 100000000000000000 \
      --inboundratelimitenabled true \
      --inboundratelimitcapacity 20000000000000000000 \
      --inboundratelimitrate 100000000000000000 \
      --network avalancheFuji
    
    2025-05-15T09:16:58.330Z info: Current Rate Limiters for token pool: 0xcC8bb3E03c59603522732B17487D2Cd5a5a3e047
    2025-05-15T09:16:58.331Z info:   Outbound Rate Limiter:
    2025-05-15T09:16:58.332Z info:     Enabled: false
    2025-05-15T09:16:58.332Z info:     Capacity: 0
    2025-05-15T09:16:58.332Z info:     Rate: 0
    2025-05-15T09:16:58.332Z info:   Inbound Rate Limiter:
    2025-05-15T09:16:58.333Z info:     Enabled: false
    2025-05-15T09:16:58.333Z info:     Capacity: 0
    2025-05-15T09:16:58.333Z info:     Rate: 0
    2025-05-15T09:16:58.333Z info:
    2025-05-15T09:16:58.333Z info: ========== Updating Rate Limiters ==========
    2025-05-15T09:16:58.333Z info: New Outbound Rate Limiter:
    2025-05-15T09:16:58.333Z info:   Enabled: true
    2025-05-15T09:16:58.334Z info:   Capacity: 10000000000000000000
    2025-05-15T09:16:58.334Z info:   Rate: 100000000000000000
    2025-05-15T09:16:58.334Z info: New Inbound Rate Limiter:
    2025-05-15T09:16:58.334Z info:   Enabled: true
    2025-05-15T09:16:58.334Z info:   Capacity: 20000000000000000000
    2025-05-15T09:16:58.334Z info:   Rate: 100000000000000000
    2025-05-15T09:16:58.334Z info: Updating both rate limiters...
    2025-05-15T09:17:07.851Z info: Transaction hash: 0x8c387a84daf095bb5ecc5faea8324b582ae580e053d082fc43c7c2d9fc539402
    2025-05-15T09:17:07.851Z info: Rate limiters updated successfully
    
  2. Update rate limiter settings for the token pool on Arbitrum Sepolia: Replace <POOL_ADDRESS> with your token pool address.

    npx hardhat updateRateLimiters \
      --pooladdress <POOL_ADDRESS> \
      --remotechain avalancheFuji \
      --ratelimiter both \
      --outboundratelimitenabled true \
      --outboundratelimitcapacity 20000000000000000000 \
      --outboundratelimitrate 100000000000000000 \
      --inboundratelimitenabled true \
      --inboundratelimitcapacity 10000000000000000000 \
      --inboundratelimitrate 100000000000000000 \
      --network arbitrumSepolia
    

    Expected output:

    $ npx hardhat updateRateLimiters \
      --pooladdress 0x74F0842a9A55575e8e36692c356292a812640F67 \
      --remotechain avalancheFuji \
      --ratelimiter both \
      --outboundratelimitenabled true \
      --outboundratelimitcapacity 20000000000000000000 \
      --outboundratelimitrate 100000000000000000 \
      --inboundratelimitenabled true \
      --inboundratelimitcapacity 10000000000000000000 \
      --inboundratelimitrate 100000000000000000 \
      --network arbitrumSepolia
    
    2025-05-15T09:18:30.217Z info: Current Rate Limiters for token pool: 0x74F0842a9A55575e8e36692c356292a812640F67
    2025-05-15T09:18:30.218Z info:   Outbound Rate Limiter:
    2025-05-15T09:18:30.218Z info:     Enabled: false
    2025-05-15T09:18:30.218Z info:     Capacity: 0
    2025-05-15T09:18:30.219Z info:     Rate: 0
    2025-05-15T09:18:30.219Z info:   Inbound Rate Limiter:
    2025-05-15T09:18:30.219Z info:     Enabled: false
    2025-05-15T09:18:30.219Z info:     Capacity: 0
    2025-05-15T09:18:30.219Z info:     Rate: 0
    2025-05-15T09:18:30.220Z info:
    2025-05-15T09:18:30.220Z info: ========== Updating Rate Limiters ==========
    2025-05-15T09:18:30.220Z info: New Outbound Rate Limiter:
    2025-05-15T09:18:30.220Z info:   Enabled: true
    2025-05-15T09:18:30.220Z info:   Capacity: 20000000000000000000
    2025-05-15T09:18:30.220Z info:   Rate: 100000000000000000
    2025-05-15T09:18:30.221Z info: New Inbound Rate Limiter:
    2025-05-15T09:18:30.221Z info:   Enabled: true
    2025-05-15T09:18:30.221Z info:   Capacity: 10000000000000000000
    2025-05-15T09:18:30.221Z info:   Rate: 100000000000000000
    2025-05-15T09:18:30.221Z info: Updating both rate limiters...
    2025-05-15T09:18:33.969Z info: Transaction hash: 0x31ccb66252ccc3247c0eb8bbe1198c2dda5c5222aceeafd4ae418b1abec84998
    2025-05-15T09:18:33.969Z info: Rate limiters updated successfully
    

Verify the new rate limiter settings

After applying the new rate limiter settings, verify that they have been updated correctly.

  • Use the getCurrentRateLimits task to verify the updated settings:
  1. Verify the updated rate limiter settings for the token pool on Avalanche Fuji:

    npx hardhat getCurrentRateLimits \
      --pooladdress <POOL_ADDRESS> \
      --remotechain arbitrumSepolia \
      --network avalancheFuji
    

    Example output:

    $ npx hardhat getCurrentRateLimits \
      --pooladdress 0xcC8bb3E03c59603522732B17487D2Cd5a5a3e047 \
      --remotechain arbitrumSepolia \
      --network avalancheFuji
    
    2025-05-15T09:21:29.694Z info:
    Rate Limiter States for Chain: arbitrumSepolia
    2025-05-15T09:21:29.695Z info: Pool Address: 0xcC8bb3E03c59603522732B17487D2Cd5a5a3e047
    2025-05-15T09:21:29.695Z info: Chain Selector: 3478487238524512106
    2025-05-15T09:21:29.696Z info:
    Outbound Rate Limiter:
    2025-05-15T09:21:29.696Z info:   Enabled: true
    2025-05-15T09:21:29.696Z info:   Capacity: 10000000000000000000
    2025-05-15T09:21:29.696Z info:   Rate: 100000000000000000
    2025-05-15T09:21:29.696Z info:   Tokens: 10000000000000000000
    2025-05-15T09:21:29.696Z info:   Last Updated: 1747300882
    2025-05-15T09:21:29.697Z info:
    Inbound Rate Limiter:
    2025-05-15T09:21:29.697Z info:   Enabled: true
    2025-05-15T09:21:29.697Z info:   Capacity: 20000000000000000000
    2025-05-15T09:21:29.697Z info:   Rate: 100000000000000000
    2025-05-15T09:21:29.697Z info:   Tokens: 20000000000000000000
    2025-05-15T09:21:29.697Z info:   Last Updated: 1747300882
    
  2. Verify the updated rate limiter settings for the token pool on Arbitrum Sepolia:

    npx hardhat getCurrentRateLimits \
      --pooladdress <POOL_ADDRESS> \
      --remotechain avalancheFuji \
      --network arbitrumSepolia
    

    Example output:

    $ npx hardhat getCurrentRateLimits \
      --pooladdress 0x74F0842a9A55575e8e36692c356292a812640F67 \
      --remotechain avalancheFuji \
      --network arbitrumSepolia
    
    2025-05-15T09:22:34.408Z info:
    Rate Limiter States for Chain: avalancheFuji
    2025-05-15T09:22:34.410Z info: Pool Address: 0x74F0842a9A55575e8e36692c356292a812640F67
    2025-05-15T09:22:34.410Z info: Chain Selector: 14767482510784806043
    2025-05-15T09:22:34.410Z info:
    Outbound Rate Limiter:
    2025-05-15T09:22:34.410Z info:   Enabled: true
    2025-05-15T09:22:34.410Z info:   Capacity: 20000000000000000000
    2025-05-15T09:22:34.410Z info:   Rate: 100000000000000000
    2025-05-15T09:22:34.410Z info:   Tokens: 20000000000000000000
    2025-05-15T09:22:34.410Z info:   Last Updated: 1747300954
    2025-05-15T09:22:34.411Z info:
    Inbound Rate Limiter:
    2025-05-15T09:22:34.411Z info:   Enabled: true
    2025-05-15T09:22:34.411Z info:   Capacity: 10000000000000000000
    2025-05-15T09:22:34.411Z info:   Rate: 100000000000000000
    2025-05-15T09:22:34.411Z info:   Tokens: 10000000000000000000
    2025-05-15T09:22:34.412Z info:   Last Updated: 1747300953
    

Test the rate limiter settings

To verify the rate limiter settings, initiate a cross-chain transfer between the token pools on Avalanche Fuji and Arbitrum Sepolia. The rate limiter configuration will control the flow of tokens between these pools.

Note: Ensure that your externally owned account (EOA) has a sufficient balance of ERC20 tokens on Avalanche Fuji to complete the transfer.

In the example below, we use a token pool at address 0xcC8bb3E03c59603522732B17487D2Cd5a5a3e047 on Avalanche Fuji, which has burn and mint privileges for the token at address 0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef. We will transfer this token from Avalanche Fuji to Arbitrum Sepolia. For your own test, substitute these addresses with the token pool and token addresses that you have deployed.

  1. Test Capacity: Because the outbound capacity set is 1000000000000000000000 , let's transfer 1000000000000000000001 tokens from Avalanche Fuji to Arbitrum Sepolia. This transfer should fail because the capacity is less than the number of tokens being transferred.

    Command:

    npx hardhat transferTokens --tokenaddress <TOKEN_ADDRESS> --amount 1000000000000000000001 --destinationchain arbitrumSepolia --receiveraddress <RECEIVER_ADDRESS> --network avalancheFuji
    

    Expected output:

    $ npx hardhat transferTokens --tokenaddress 0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef --amount 1000000000000000000001 --destinationchain arbitrumSepolia --receiveraddress 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf --network avalancheFuji
    
    2025-05-15T09:34:18.464Z info: Estimated fees: 22167517387804854
    2025-05-15T09:34:18.466Z info: Approving 1000000000000000000001 0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef to 0xF694E193200268f9a4868e4Aa017A0118C9a8177
    2025-05-15T09:34:25.055Z info: Approving 22167517387804854 LINK to 0xF694E193200268f9a4868e4Aa017A0118C9a8177
    2025-05-15T09:34:35.023Z info: Transferring 1000000000000000000001 of 0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf on chain arbitrumSepolia with 22167517387804854 of LINK as fees
    Simulation failed
    Decoded error from factory RateLimiter__factory: TokenMaxCapacityExceeded Result(3) [
      10000000000000000000n,
      1000000000000000000001n,
      '0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef'
    ]
    

    Notice in the logs that the transfer failed because the capacity was exceeded: TokenMaxCapacityExceeded.

  2. Test Rate: Now, let's transfer 10000000000000000000 tokens from Avalanche Fuji to Arbitrum Sepolia, which will empty the bucket. After this transfer, we will attempt to transfer another 10000000000000000000 tokens. This transfer will fail because it takes 100 seconds to replenish the bucket.

    1. First transfer (Successful):

      Command:

      npx hardhat transferTokens --tokenaddress <TOKEN_ADDRESS> --amount 10000000000000000000 --destinationchain arbitrumSepolia --receiveraddress <RECEIVER_ADDRESS> --network avalancheFuji
      

      Expected output:

      $ npx hardhat transferTokens --tokenaddress 0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef --amount 10000000000000000000 --destinationchain arbitrumSepolia --receiveraddress 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf --network avalancheFuji
      
      2025-05-15T09:37:09.380Z info: Estimated fees: 22167517387804854
      2025-05-15T09:37:09.383Z info: Approving 10000000000000000000 0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef to 0xF694E193200268f9a4868e4Aa017A0118C9a8177
      2025-05-15T09:37:18.455Z info: Approving 22167517387804854 LINK to 0xF694E193200268f9a4868e4Aa017A0118C9a8177
      2025-05-15T09:37:25.883Z info: Transferring 10000000000000000000 of 0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf on chain arbitrumSepolia with 22167517387804854 of LINK as fees
      2025-05-15T09:37:31.178Z info: Transaction hash: 0x8490f683383f02e6111ee6ac13072c724b2e3a67114fa765083620cce4c0e255
      2025-05-15T09:37:31.188Z warn: Unable to parse the event logs corresponding to the transaction 0x8490f683383f02e6111ee6ac13072c724b2e3a67114fa765083620cce4c0e255
      2025-05-15T09:37:31.188Z info: Check status of message on https://ccip.chain.link/tx/0x8490f683383f02e6111ee6ac13072c724b2e3a67114fa765083620cce4c0e255
      
    2. Second transfer (Failed):

      Command:

      npx hardhat transferTokens --tokenaddress <TOKEN_ADDRESS> --amount 10000000000000000000 --destinationchain arbitrumSepolia --receiveraddress <RECEIVER_ADDRESS> --network avalancheFuji
      

      Expected output:

      $ npx hardhat transferTokens --tokenaddress 0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef --amount 10000000000000000000 --destinationchain arbitrumSepolia --receiveraddress 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf --network avalancheFuji
      
      2025-05-15T09:37:55.351Z info: Estimated fees: 22167517387804854
      2025-05-15T09:37:55.355Z info: Approving 10000000000000000000 0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef to 0xF694E193200268f9a4868e4Aa017A0118C9a8177
      2025-05-15T09:38:02.306Z info: Approving 22167517387804854 LINK to 0xF694E193200268f9a4868e4Aa017A0118C9a8177
      2025-05-15T09:38:10.812Z info: Transferring 10000000000000000000 of 0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf on chain arbitrumSepolia with 22167517387804854 of LINK as fees
      Simulation failed
      Decoded error from factory RateLimiter__factory: TokenRateLimitReached Result(3) [
        58n,
        4200000000000000000n,
        '0xE21b1AA00C6202b606C4F5B9E05B6f475823B8Ef'
      ]
      

      Notice in the logs that the transfer failed because the rate limit was exceeded: TokenRateLimitReached.

Get the latest Chainlink content straight to your inbox.