16 KiB
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:
- Fee mechanisms (ETH vs LINK) across all contracts
- Source and destination chain fee configurations
- Limitations in bridge, router, and monitoring contracts
- Strategies to prevent stuck transactions
- Strategies to prevent failed transactions
- 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
-
User Initiates Transfer:
- User calls
sendCrossChain()on bridge contract - Bridge contract calculates fee using
calculateFee() - Bridge contract checks LINK balance
- User calls
-
Fee Payment:
- Bridge contract must have LINK tokens
- LINK is transferred to Router
- Router processes payment
- Message is queued for cross-chain delivery
-
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
# 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
- Always Check Nonce: Before sending transactions
- Use Dynamic Gas: Don't use fixed gas prices
- Monitor Mempool: Check for pending transactions
- Set Timeouts: Don't wait indefinitely
- 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)
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
#!/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
- LINK Balance: Bridge contracts and user accounts
- ETH Balance: For gas fees
- Transaction Success Rate: Percentage of successful transactions
- Average Gas Price: Track gas price trends
- Stuck Transaction Count: Number of stuck transactions
- Fee Usage: Total fees paid over time
- 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
- ⚠️ LINK token not properly deployed/verified
- ⚠️ Bridge contracts may not have LINK balance
- ⚠️ Stuck transaction at nonce 37
- ⚠️ Fee calculation functions not accessible
Immediate Actions Required
- Deploy/verify LINK token
- Fund bridge contracts with LINK
- Resolve stuck transaction
- Implement dynamic gas pricing
Long-Term Improvements
- Comprehensive monitoring system
- Automated retry logic
- Multi-sig for admin functions
- Rate limit monitoring
Last Updated: 2025-01-12