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

4.7 KiB

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 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

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:

uint64 chainSelector = 138; // or 0x000000000000008a

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:

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:

# Using cast (Foundry)
cast keccak "$(printf '0x%064x' 138)CCIP"
# Extract first 8 bytes (uint64) from the hash

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

CHAIN138_SELECTOR=0x000000000000008a
# Or simply:
CHAIN138_SELECTOR=138

In Solidity

uint64 constant CHAIN138_SELECTOR = 138;
// Or
uint64 constant CHAIN138_SELECTOR = 0x000000000000008a;

In Scripts

# 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:

router.addSupportedChain(138); // or 0x000000000000008a

Bridge Configuration

When configuring bridges to send to ChainID 138:

bridge.addDestination(138, receiverBridgeAddress);

Message Sending

When sending CCIP messages to ChainID 138:

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:

./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

  • 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