Files
explorer-monorepo/docs/CCIP_FEE_AND_LIMITATION_ANALYSIS.md

16 KiB

CCIP Fee and Limitation Analysis

Date: 2025-01-12
Purpose: Comprehensive analysis of fee mechanisms, limitations, and transaction failure prevention


Executive Summary

This document provides a complete analysis of:

  1. Fee mechanisms (ETH vs LINK) across all contracts
  2. Source and destination chain fee configurations
  3. Limitations in bridge, router, and monitoring contracts
  4. Strategies to prevent stuck transactions
  5. Strategies to prevent failed transactions
  6. Comprehensive recommendations and suggestions

1. Fee Mechanisms Analysis

1.1 Fee Token Configuration

CCIP Router Fee Token

  • Token: LINK (0x514910771AF9Ca656af840dff83E8264EcF986CA)
  • Base Fee: 1000000000000000 wei (0.001 LINK)
  • Data Fee Per Byte: 100000000 wei (0.0000001 LINK per byte)
  • Payment Method: LINK tokens (NOT native ETH)

Current Status

  • ⚠️ LINK Token Not Deployed: LINK token contract appears empty on ChainID 138
  • ⚠️ Fee Calculation Failing: Cannot query Router fee configuration
  • ⚠️ Bridge LINK Balance: Unknown (contract appears empty)

1.2 Fee Payment Flow

Standard Flow

  1. User Initiates Transfer:

    • User calls sendCrossChain() on bridge contract
    • Bridge contract calculates fee using calculateFee()
    • Bridge contract checks LINK balance
  2. Fee Payment:

    • Bridge contract must have LINK tokens
    • LINK is transferred to Router
    • Router processes payment
    • Message is queued for cross-chain delivery
  3. Fee Calculation:

    totalFee = baseFee + (dataSize * dataFeePerByte)
    

Current Issues

  • LINK token contract not properly deployed
  • Bridge contracts may not have LINK balance
  • Fee calculation functions may not be accessible

1.3 Gas Fees (Transaction Costs)

Source Chain (ChainID 138)

  • Gas Price: Currently 1000 wei (very low)
  • Transaction Gas: ~100,000 - 200,000 gas per transaction
  • Cost: ~0.1 - 0.2 ETH per transaction (at current gas price)

Destination Chains

  • Gas Costs: Vary by chain
  • BSC: Lower gas costs
  • Ethereum Mainnet: Higher gas costs
  • L2 Chains: Optimized gas costs

2. Source Chain Fee Configuration

2.1 Bridge Contracts

CCIPWETH9Bridge

  • Address: 0x89dd12025bfCD38A168455A44B400e913ED33BE2
  • Fee Payment: Uses LINK tokens
  • Fee Calculation: calculateFee(uint64, uint256) function
  • Status: ⚠️ Fee calculation may fail if LINK not configured

CCIPWETH10Bridge

  • Address: 0xe0E93247376aa097dB308B92e6Ba36bA015535D0
  • Fee Payment: Uses LINK tokens
  • Fee Calculation: calculateFee(uint64, uint256) function
  • Status: ⚠️ Fee calculation may fail if LINK not configured

2.2 Router Configuration

CCIP Router

  • Address: 0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e
  • Fee Token: LINK (configured but may not be deployed)
  • Fee Functions: getFee() (may not be accessible)
  • Status: ⚠️ Cannot verify fee configuration

2.3 Sender Contract

CCIP Sender

  • Address: 0x105F8A15b819948a89153505762444Ee9f324684
  • Role: Initiates CCIP messages
  • Fee Handling: Passes fees to Router
  • Status: Deployed

3. Destination Chain Fee Configuration

3.1 Destination Bridge Contracts

WETH9 Bridges (Destination Chains)

  • BSC: 0x8078a09637e47fa5ed34f626046ea2094a5cde5e
  • Polygon: 0xa780ef19a041745d353c9432f2a7f5a241335ffe
  • Avalanche: 0x8078a09637e47fa5ed34f626046ea2094a5cde5e
  • Base: 0x8078a09637e47fa5ed34f626046ea2094a5cde5e
  • Arbitrum: 0x8078a09637e47fa5ed34f626046ea2094a5cde5e
  • Optimism: 0x8078a09637e47fa5ed34f626046ea2094a5cde5e
  • Ethereum Mainnet: 0x2A0840e5117683b11682ac46f5CF5621E67269E3

WETH10 Bridges (Destination Chains)

  • BSC: 0x105f8a15b819948a89153505762444ee9f324684
  • Polygon: 0xdab0591e5e89295ffad75a71dcfc30c5625c4fa2
  • Avalanche: 0x105f8a15b819948a89153505762444ee9f324684
  • Base: 0x105f8a15b819948a89153505762444ee9f324684
  • Arbitrum: 0x105f8a15b819948a89153505762444ee9f324684
  • Optimism: 0x105f8a15b819948a89153505762444ee9f324684
  • Ethereum Mainnet: 0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03

3.2 Destination Chain Fees

Fee Structure

  • No Direct Fees: Destination chains don't charge fees for receiving
  • Gas Costs: Users pay gas on destination chain (if applicable)
  • Oracle Network: Handles message delivery (fees paid on source chain)

4. Limitations Analysis

4.1 Rate Limits

Outbound Rate Limits

  • Purpose: Prevent excessive outbound transfers
  • Configuration: Per lane (source-destination pair)
  • Time Window: Typically 24 hours
  • Status: ⚠️ Cannot verify without admin access

Inbound Rate Limits

  • Purpose: Prevent excessive inbound transfers
  • Configuration: Per lane
  • Time Window: Typically 24 hours
  • Status: ⚠️ Cannot verify without admin access

Impact on Transactions

  • Rate Limit Reached: Transactions will fail
  • Error: "Rate limit exceeded"
  • Solution: Wait for rate limit reset or request increase

4.2 Transaction Limits

Maximum Transfer Amount

  • Status: ⚠️ Unknown (not verified)
  • Recommendation: Check contract for maximum limits
  • Risk: Large transfers may be blocked

Minimum Transfer Amount

  • Status: ⚠️ Unknown
  • Recommendation: Check contract for minimum limits
  • Risk: Small transfers may be blocked

4.3 Gas Limits

Transaction Gas Limits

  • Current: Using default gas limits
  • Risk: Transactions may fail if gas limit too low
  • Solution: Estimate gas before sending

Block Gas Limits

  • Source Chain: Network-dependent
  • Risk: Large transactions may exceed block limit
  • Solution: Batch operations or reduce transaction size

4.4 Balance Requirements

ETH Balance

  • Required: For gas fees on source chain
  • Current: Account has 999630769 ETH
  • Status: Sufficient
  • Required: For CCIP fees
  • Current: ⚠️ Unknown (LINK token not verified)
  • Status: May be insufficient

Token Balance

  • Required: For transfers
  • Current: WETH9: 8 ETH, WETH10: Unknown
  • Status: Sufficient for small transfers

4.5 Destination Configuration

Missing Destinations

  • Current: 6/7 destinations configured
  • Missing: Ethereum Mainnet (blocked by stuck transaction)
  • Impact: Cannot bridge to Ethereum Mainnet

Destination Validation

  • Status: All configured destinations validated
  • Risk: Invalid destination addresses
  • Solution: Verify all destination addresses

5. Preventing Stuck Transactions

5.1 Root Causes

Low Gas Price

  • Issue: Transaction with gas price too low
  • Symptom: Transaction stuck in mempool
  • Current Issue: Nonce 37 stuck with high gas price

Network Congestion

  • Issue: Network processing slowly
  • Symptom: Transactions queued
  • Solution: Use higher gas price

Nonce Issues

  • Issue: Previous transaction pending
  • Symptom: "Replacement transaction underpriced"
  • Current Issue: Nonce 37 blocked

5.2 Prevention Strategies

1. Dynamic Gas Pricing

# Get current gas price
CURRENT_GAS=$(cast gas-price --rpc-url $RPC_URL)

# Use 1.5x for faster inclusion
GAS_PRICE=$(echo "$CURRENT_GAS * 1.5" | bc)

# Send with optimal gas
cast send ... --gas-price "$GAS_PRICE"

2. Gas Price Monitoring

  • Check Current Gas: Before each transaction
  • Use Multiplier: 1.2x - 1.5x current gas
  • Monitor Network: Track gas price trends

3. Nonce Management

# Check current nonce
CURRENT_NONCE=$(cast nonce $ACCOUNT --rpc-url $RPC_URL)

# Check pending nonce
PENDING_NONCE=$(cast nonce $ACCOUNT --rpc-url $RPC_URL --pending)

# Wait if pending transactions exist
if [ "$PENDING_NONCE" -gt "$CURRENT_NONCE" ]; then
    echo "Wait for pending transactions"
fi

4. Transaction Replacement

# Replace stuck transaction with higher gas
NEW_GAS_PRICE=$(echo "$CURRENT_GAS * 2" | bc)
cast send ... --nonce $STUCK_NONCE --gas-price "$NEW_GAS_PRICE"

5. EIP-1559 Support

  • Use maxFeePerGas: Set maximum fee
  • Use maxPriorityFeePerGas: Set priority fee
  • Better Control: More predictable transaction inclusion

5.3 Best Practices

  1. Always Check Nonce: Before sending transactions
  2. Use Dynamic Gas: Don't use fixed gas prices
  3. Monitor Mempool: Check for pending transactions
  4. Set Timeouts: Don't wait indefinitely
  5. Retry Logic: Implement automatic retry with higher gas

6. Preventing Failed Transactions

6.1 Common Failure Causes

Insufficient Balance

  • ETH: Not enough for gas
  • LINK: Not enough for CCIP fees
  • Tokens: Not enough for transfer

Invalid Parameters

  • Destination: Not configured
  • Amount: Exceeds limits
  • Receiver: Invalid address

Contract State

  • Paused: Bridge paused
  • Rate Limit: Exceeded
  • Allowance: Insufficient

6.2 Prevention Strategies

1. Pre-Flight Checks

# Check ETH balance
ETH_BALANCE=$(cast balance $ACCOUNT --rpc-url $RPC_URL)
if [ "$ETH_BALANCE" -lt "$REQUIRED_ETH" ]; then
    echo "Insufficient ETH"
    exit 1
fi

# Check LINK balance
LINK_BALANCE=$(cast call $LINK_TOKEN "balanceOf(address)" $ACCOUNT --rpc-url $RPC_URL)
if [ "$LINK_BALANCE" -lt "$REQUIRED_LINK" ]; then
    echo "Insufficient LINK"
    exit 1
fi

# Check token balance
TOKEN_BALANCE=$(cast call $TOKEN "balanceOf(address)" $ACCOUNT --rpc-url $RPC_URL)
if [ "$TOKEN_BALANCE" -lt "$AMOUNT" ]; then
    echo "Insufficient tokens"
    exit 1
fi

2. Destination Validation

# Check destination is configured
DEST=$(cast call $BRIDGE "destinations(uint64)" $SELECTOR --rpc-url $RPC_URL)
if [ -z "$DEST" ] || echo "$DEST" | grep -qE "^0x0+$"; then
    echo "Destination not configured"
    exit 1
fi

3. Allowance Checks

# Check allowance
ALLOWANCE=$(cast call $TOKEN "allowance(address,address)" $ACCOUNT $BRIDGE --rpc-url $RPC_URL)
if [ "$ALLOWANCE" -lt "$AMOUNT" ]; then
    echo "Insufficient allowance"
    exit 1
fi

4. Fee Estimation

# Estimate fee before sending
FEE=$(cast call $BRIDGE "calculateFee(uint64,uint256)" $SELECTOR $AMOUNT --rpc-url $RPC_URL)
if [ "$FEE" = "0" ]; then
    echo "Fee calculation failed"
    exit 1
fi

# Check LINK balance covers fee
if [ "$LINK_BALANCE" -lt "$FEE" ]; then
    echo "Insufficient LINK for fee"
    exit 1
fi

5. Gas Estimation

# Estimate gas before sending
GAS_ESTIMATE=$(cast estimate $BRIDGE "sendCrossChain(uint64,address,uint256)" $SELECTOR $RECEIVER $AMOUNT --rpc-url $RPC_URL)
if [ -z "$GAS_ESTIMATE" ]; then
    echo "Gas estimation failed"
    exit 1
fi

# Use estimated gas with buffer
GAS_LIMIT=$(echo "$GAS_ESTIMATE * 1.2" | bc)

6.3 Error Handling

Transaction Revert Detection

# Check transaction receipt
RECEIPT=$(cast receipt $TX_HASH --rpc-url $RPC_URL)
STATUS=$(echo "$RECEIPT" | grep -oE "status[[:space:]]+[0-9]+" | awk '{print $2}')

if [ "$STATUS" = "0" ]; then
    echo "Transaction reverted"
    # Get revert reason
    REVERT_REASON=$(cast tx $TX_HASH --rpc-url $RPC_URL | grep -i "revert")
    echo "Reason: $REVERT_REASON"
fi

Retry Logic

# Retry with exponential backoff
MAX_RETRIES=3
RETRY_COUNT=0
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
    if send_transaction; then
        break
    fi
    RETRY_COUNT=$((RETRY_COUNT + 1))
    sleep $((2 ** RETRY_COUNT))
done

7. Comprehensive Recommendations

7.1 Immediate Actions (High Priority)

  • Action: Deploy LINK token contract on ChainID 138
  • Address: Use standard LINK address or deploy new
  • Purpose: Enable CCIP fee payments
  • Priority: Critical
  • Action: Transfer LINK tokens to bridge contracts
  • Amount: Minimum 10 LINK (buffer for multiple transactions)
  • Purpose: Ensure fees can be paid
  • Priority: Critical

3. Fix Stuck Transaction

  • Action: Resolve nonce 37 stuck transaction
  • Options:
    • Wait for transaction to clear
    • Use extremely high gas price (2000+ gwei)
    • Contact network administrator
  • Priority: High

4. Implement Dynamic Gas Pricing

  • Action: Update all scripts to use dynamic gas
  • Implementation: Use 1.5x current gas price
  • Purpose: Prevent stuck transactions
  • Priority: High

7.2 Configuration Improvements (Medium Priority)

1. Pre-Flight Validation Script

  • Action: Create comprehensive pre-flight check
  • Checks:
    • ETH balance
    • LINK balance
    • Token balance
    • Allowance
    • Destination configuration
    • Fee estimation
    • Gas estimation
  • Priority: Medium

2. Fee Monitoring System

  • Action: Implement fee monitoring
  • Features:
    • Track LINK balance
    • Alert on low balance
    • Estimate fees before transactions
    • Log fee usage
  • Priority: Medium

3. Transaction Monitoring

  • Action: Implement transaction monitoring
  • Features:
    • Track pending transactions
    • Detect stuck transactions
    • Automatic retry with higher gas
    • Alert on failures
  • Priority: Medium

7.3 Long-Term Improvements (Low Priority)

1. Multi-Sig for Admin Functions

  • Action: Upgrade to multi-sig wallet
  • Purpose: Enhanced security
  • Priority: Low

2. Rate Limit Monitoring

  • Action: Implement rate limit tracking
  • Features:
    • Monitor usage vs limits
    • Alert on approaching limits
    • Automatic limit adjustment
  • Priority: Low

3. Automated Testing

  • Action: Create automated test suite
  • Tests:
    • Fee calculation
    • Transaction success
    • Error handling
    • Edge cases
  • Priority: Low

8. Script Improvements

8.1 Enhanced Configuration Script

#!/usr/bin/env bash
# Enhanced configuration with fee and gas checks

# Pre-flight checks
check_eth_balance() { ... }
check_link_balance() { ... }
check_destination() { ... }
estimate_fee() { ... }
estimate_gas() { ... }

# Dynamic gas pricing
get_optimal_gas() {
    CURRENT_GAS=$(cast gas-price --rpc-url $RPC_URL)
    echo "scale=0; $CURRENT_GAS * 1.5 / 1" | bc
}

# Nonce management
check_nonce() {
    CURRENT=$(cast nonce $ACCOUNT --rpc-url $RPC_URL)
    PENDING=$(cast nonce $ACCOUNT --rpc-url $RPC_URL --pending)
    if [ "$PENDING" -gt "$CURRENT" ]; then
        echo "Waiting for pending transactions..."
        wait_for_confirmation
    fi
}

8.2 Transaction Retry Script

#!/usr/bin/env bash
# Automatic retry with exponential backoff

retry_with_backoff() {
    local command="$1"
    local max_retries=3
    local retry=0
    
    while [ $retry -lt $max_retries ]; do
        GAS_PRICE=$(get_optimal_gas)
        if eval "$command --gas-price $GAS_PRICE"; then
            return 0
        fi
        retry=$((retry + 1))
        sleep $((2 ** retry))
        GAS_PRICE=$(echo "$GAS_PRICE * 1.5" | bc)
    done
    return 1
}

9. Monitoring Recommendations

9.1 Key Metrics to Monitor

  1. LINK Balance: Bridge contracts and user accounts
  2. ETH Balance: For gas fees
  3. Transaction Success Rate: Percentage of successful transactions
  4. Average Gas Price: Track gas price trends
  5. Stuck Transaction Count: Number of stuck transactions
  6. Fee Usage: Total fees paid over time
  7. Rate Limit Usage: Current vs maximum limits

9.2 Alert Thresholds

  • LINK Balance < 1 LINK: Critical alert
  • ETH Balance < 0.1 ETH: Warning alert
  • Transaction Success Rate < 95%: Warning alert
  • Stuck Transactions > 0: Critical alert
  • Rate Limit Usage > 80%: Warning alert

10. Summary

Critical Issues

  1. ⚠️ LINK token not properly deployed/verified
  2. ⚠️ Bridge contracts may not have LINK balance
  3. ⚠️ Stuck transaction at nonce 37
  4. ⚠️ Fee calculation functions not accessible

Immediate Actions Required

  1. Deploy/verify LINK token
  2. Fund bridge contracts with LINK
  3. Resolve stuck transaction
  4. Implement dynamic gas pricing

Long-Term Improvements

  1. Comprehensive monitoring system
  2. Automated retry logic
  3. Multi-sig for admin functions
  4. Rate limit monitoring

Last Updated: 2025-01-12