Files
smom-dbis-138/docs/ccip-integration/chain138/CHAIN_SELECTOR.md
2026-06-02 06:13:28 -07:00

205 lines
4.7 KiB
Markdown

# CCIP Chain Selector Calculation for ChainID 138
**Date**: 2025-01-27
**Chain ID**: 138
**Network**: DeFi Oracle Meta Mainnet
> **Automation:** Run [`scripts/ccip/calculate-chain-selector.sh`](../../../scripts/ccip/calculate-chain-selector.sh) to compute or verify the Chain 138 selector.
---
## Overview
CCIP chain selectors are unique identifiers used to route messages between chains in the Chainlink CCIP network. For ChainID 138, we need to calculate or define a chain selector that is consistent and unique.
---
## Calculation Methods
### Method 1: Simple ChainID (Recommended for Custom CCIP)
For custom CCIP router implementations, the simplest approach is to use the chain ID directly as the selector:
```
Chain Selector = Chain ID (as uint64)
Chain Selector = 138
Hex Format: 0x000000000000008a
```
**Advantages**:
- Simple and deterministic
- Easy to remember and verify
- Compatible with custom CCIP implementations
- No calculation required
**Usage**:
```solidity
uint64 chainSelector = 138; // or 0x000000000000008a
```
### Method 2: Chainlink Official Format
If integrating with Chainlink's official CCIP network, chain selectors are calculated using a deterministic hash-based method. The exact formula used by Chainlink is:
```solidity
uint64(uint256(keccak256(abi.encodePacked(chainId, "CCIP"))) >> 192)
```
However, for custom chains not yet registered with Chainlink, you may need to:
1. Register the chain with Chainlink
2. Use Chainlink's assigned selector
3. Or use a custom format for your implementation
### Method 3: Deterministic Hash-Based
For a deterministic but more complex selector, you can use:
```bash
# Using cast (Foundry)
cast keccak "$(printf '0x%064x' 138)CCIP"
# Extract first 8 bytes (uint64) from the hash
```
---
## Recommended Selector for ChainID 138
**Selected Method**: Method 1 (Simple ChainID)
**Selector Value**:
- **Decimal**: `138`
- **Hex**: `0x000000000000008a`
- **Type**: `uint64`
**Rationale**:
- Simple and deterministic
- Easy to verify and document
- Compatible with custom CCIP router implementation
- No external dependencies or calculations
---
## Implementation
### Environment Variable
```bash
CHAIN138_SELECTOR=0x000000000000008a
# Or simply:
CHAIN138_SELECTOR=138
```
### In Solidity
```solidity
uint64 constant CHAIN138_SELECTOR = 138;
// Or
uint64 constant CHAIN138_SELECTOR = 0x000000000000008a;
```
### In Scripts
```bash
# Use the calculated selector
CHAIN138_SELECTOR=138
# Or hex format
CHAIN138_SELECTOR=0x000000000000008a
```
---
## Usage in CCIP Configuration
### Router Configuration
When configuring the CCIP Router to support ChainID 138:
```solidity
router.addSupportedChain(138); // or 0x000000000000008a
```
### Bridge Configuration
When configuring bridges to send to ChainID 138:
```solidity
bridge.addDestination(138, receiverBridgeAddress);
```
### Message Sending
When sending CCIP messages to ChainID 138:
```solidity
router.ccipSend(138, message);
```
---
## Verification
To verify the selector is correct:
1. **Uniqueness**: Ensure no other chain uses selector `138`
2. **Consistency**: Use the same selector across all configurations
3. **Documentation**: Document the selector in all relevant files
### Verification Script
Run the calculation script to verify:
```bash
./scripts/ccip/calculate-chain-selector.sh
```
---
## Integration with Other Chains
When configuring bidirectional bridges, ensure:
1. **ChainID 138 → Ethereum Mainnet**:
- Source selector: `138`
- Destination selector: `5009297550715157269` (Ethereum Mainnet)
2. **Ethereum Mainnet → ChainID 138**:
- Source selector: `5009297550715157269`
- Destination selector: `138`
---
## Chain Selector Reference Table
| Network | Chain ID | CCIP Chain Selector |
|---------|----------|---------------------|
| Ethereum Mainnet | 1 | `5009297550715157269` |
| BSC | 56 | `11344663589394136015` |
| Polygon | 137 | `4051577828743386545` |
| Avalanche | 43114 | `6433500567565415381` |
| Base | 8453 | `15971525489660198786` |
| Arbitrum | 42161 | `4949039107694359620` |
| Optimism | 10 | `3734403246176062136` |
| **ChainID 138** | **138** | **`138`** (or `0x000000000000008a`) |
---
## Notes
- For custom CCIP implementations, you have flexibility in selector format
- The selector must be consistent across all contracts and configurations
- If integrating with Chainlink's official CCIP, you may need to register the chain
- The selector is used in all CCIP message routing and bridge configurations
---
## Related Files
- `scripts/ccip/calculate-chain-selector.sh` - Calculation script
- `docs/ETH_WETH_CHAINLINK_GUIDE.md` - Main guide with selector reference
- `docs/deployment/ENV_EXAMPLE_CONTENT.md` - Environment variable examples
---
**Last Updated**: 2025-01-27