# 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 #### LINK Balance - **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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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) #### 1. Deploy/Verify LINK Token - **Action**: Deploy LINK token contract on ChainID 138 - **Address**: Use standard LINK address or deploy new - **Purpose**: Enable CCIP fee payments - **Priority**: Critical #### 2. Fund Bridge Contracts with LINK - **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 ```bash #!/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 ```bash #!/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