205 lines
4.7 KiB
Markdown
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
|
|
|