# CCIP Receiver Requirements Documentation **Date**: 2025-01-12 **Network**: ChainID 138 --- ## Overview This document describes the requirements for receivers in CCIP (Cross-Chain Interoperability Protocol) transactions. --- ## Receiver Types ### EOA (Externally Owned Account) **Description**: Standard Ethereum address controlled by a private key. **Requirements**: - ✅ No special interface required - ✅ Can receive tokens directly - ✅ Can receive native ETH - ✅ Can receive ERC-20 tokens **Use Case**: Simple token transfers to user wallets. **Example**: ``` Receiver: 0x4A666F96fC8764181194447A7dFdb7d471b301C8 Type: EOA Status: ✅ Ready ``` ### Contract Receiver **Description**: Smart contract that receives CCIP messages. **Requirements**: - ⚠️ Must implement `ccipReceive()` function - ⚠️ Must handle message data - ⚠️ Must handle token transfers - ⚠️ Must handle errors gracefully **Use Case**: Automated processing of cross-chain messages. --- ## EOA Receiver Requirements ### Basic Requirements 1. **Valid Address**: Must be a valid Ethereum address (20 bytes) 2. **No Code**: Address must not have deployed bytecode (for EOA) 3. **Accessible**: Address must be accessible on destination chain ### Token Receipt EOA receivers can receive: - ✅ Native tokens (ETH, BNB, etc.) - ✅ ERC-20 tokens (WETH9, WETH10, etc.) - ✅ NFTs (if supported) ### No Special Interface Required EOA receivers do not need to implement any special interface. Tokens are transferred directly to the address. --- ## Contract Receiver Requirements ### Required Interface Contract receivers must implement the `ccipReceive()` function: ```solidity function ccipReceive( Client.Any2EVMMessage calldata message ) external { // Process message // Handle tokens // Handle errors } ``` ### Message Structure ```solidity struct Any2EVMMessage { bytes32 messageId; uint64 sourceChainSelector; bytes sender; bytes data; EVMTokenAmount[] tokenAmounts; } ``` ### Token Handling Contract receivers must: 1. Accept token transfers 2. Process token amounts 3. Handle multiple tokens (if applicable) 4. Handle errors gracefully --- ## Receiver Validation ### Address Validation Before bridging, validate receiver address: 1. **Format Check**: Verify address is valid (20 bytes, hex format) 2. **Chain Check**: Verify address exists on destination chain 3. **Type Check**: Determine if EOA or contract ### Validation Script ```bash # Check if address is valid cast --to-checksum-address
# Check if address has code (contract) cast code --rpc-url