# CCIP API Reference for ChainID 138

**Date**: 2025-01-27  
**Network**: ChainID 138 (DeFi Oracle Meta Mainnet)

---

## Overview

This document provides API reference for CCIP contracts on ChainID 138.

---

## CCIP Router API

### Functions

#### `ccipSend(uint64 destinationChainSelector, EVM2AnyMessage memory message)`

Send a message to a destination chain.

**Parameters**:
- `destinationChainSelector`: Chain selector of destination chain
- `message`: CCIP message structure

**Returns**:
- `bytes32 messageId`: Unique message identifier
- `uint256 fees`: Fees paid for the message

**Example**:
```solidity
IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({
    receiver: abi.encode(receiverAddress),
    data: messageData,
    tokenAmounts: new IRouterClient.TokenAmount[](0),
    feeToken: address(0), // Native ETH
    extraArgs: ""
});

(bytes32 messageId, uint256 fees) = router.ccipSend{value: fee}(
    destinationSelector,
    message
);
```

#### `getFee(uint64 destinationChainSelector, EVM2AnyMessage memory message)`

Calculate fee for sending a message.

**Parameters**:
- `destinationChainSelector`: Chain selector of destination chain
- `message`: CCIP message structure

**Returns**:
- `uint256 fee`: Required fee amount

**Example**:
```solidity
uint256 fee = router.getFee(destinationSelector, message);
```

#### `getSupportedTokens(uint64 destinationChainSelector)`

Get list of supported tokens for a destination chain.

**Parameters**:
- `destinationChainSelector`: Chain selector

**Returns**:
- `address[] tokens`: Array of supported token addresses

#### `addSupportedChain(uint64 chainSelector)` (Admin Only)

Add a supported destination chain.

**Parameters**:
- `chainSelector`: Chain selector to add

#### `removeSupportedChain(uint64 chainSelector)` (Admin Only)

Remove a supported destination chain.

#### `addSupportedToken(uint64 chainSelector, address token)` (Admin Only)

Add a supported token for a chain.

**Parameters**:
- `chainSelector`: Chain selector
- `token`: Token address

#### `updateFees(uint256 baseFee, uint256 dataFeePerByte)` (Admin Only)

Update fee configuration.

**Parameters**:
- `baseFee`: New base fee
- `dataFeePerByte`: New data fee per byte

---

## CCIPWETH9Bridge API

### Functions

#### `sendCrossChain(uint64 destinationChainSelector, address recipient, uint256 amount)`

Send WETH9 tokens to another chain.

**Parameters**:
- `destinationChainSelector`: Destination chain selector
- `recipient`: Recipient address on destination chain
- `amount`: Amount of WETH9 to send

**Returns**:
- `bytes32 messageId`: Message ID for tracking

**Example**:
```solidity
// Approve first
weth9.approve(address(bridge), amount);

// Send
bytes32 messageId = bridge.sendCrossChain(
    5009297550715157269, // Ethereum Mainnet
    recipientAddress,
    amount
);
```

#### `ccipReceive(Any2EVMMessage calldata message)` (Router Only)

Receive WETH9 tokens from another chain. Called by router.

#### `calculateFee(uint64 destinationChainSelector, uint256 amount)`

Calculate fee for cross-chain transfer.

**Parameters**:
- `destinationChainSelector`: Destination chain selector
- `amount`: Transfer amount

**Returns**:
- `uint256 fee`: Required fee

#### `addDestination(uint64 chainSelector, address receiverBridge)` (Admin Only)

Add destination chain configuration.

#### `removeDestination(uint64 chainSelector)` (Admin Only)

Remove destination chain.

#### `updateDestination(uint64 chainSelector, address receiverBridge)` (Admin Only)

Update destination receiver bridge address.

#### `getDestinationChains()`

Get list of configured destination chains.

**Returns**:
- `uint64[]`: Array of chain selectors

#### `getUserNonce(address user)`

Get user's current nonce.

**Returns**:
- `uint256`: User nonce

---

## CCIPWETH10Bridge API

Same as CCIPWETH9Bridge, but for WETH10 tokens.

---

## Events

### Router Events

```solidity
event MessageSent(
    bytes32 indexed messageId,
    uint64 indexed destinationChainSelector,
    address indexed sender,
    bytes receiver,
    bytes data,
    TokenAmount[] tokenAmounts,
    address feeToken,
    bytes extraArgs
);

event MessageReceived(
    bytes32 indexed messageId,
    uint64 indexed sourceChainSelector,
    address indexed sender,
    bytes data,
    TokenAmount[] tokenAmounts
);
```

### Bridge Events

```solidity
event CrossChainTransferInitiated(
    bytes32 indexed messageId,
    address indexed sender,
    uint64 indexed destinationChainSelector,
    address recipient,
    uint256 amount,
    uint256 nonce
);

event CrossChainTransferCompleted(
    bytes32 indexed messageId,
    uint64 indexed sourceChainSelector,
    address indexed recipient,
    uint256 amount
);

event DestinationAdded(uint64 chainSelector, address receiverBridge);
event DestinationRemoved(uint64 chainSelector);
event DestinationUpdated(uint64 chainSelector, address receiverBridge);
```

---

## Data Structures

### EVM2AnyMessage

```solidity
struct EVM2AnyMessage {
    bytes receiver;              // Encoded receiver address
    bytes data;                  // Message data
    TokenAmount[] tokenAmounts;  // Token amounts to transfer
    address feeToken;             // Fee token address (0 for native)
    bytes extraArgs;             // Extra arguments
}
```

### Any2EVMMessage

```solidity
struct Any2EVMMessage {
    bytes32 messageId;           // Unique message ID
    uint64 sourceChainSelector;  // Source chain selector
    bytes sender;                // Encoded sender address
    bytes data;                  // Message data
    TokenAmount[] tokenAmounts;  // Token amounts received
}
```

### TokenAmount

```solidity
struct TokenAmount {
    address token;               // Token address
    uint256 amount;              // Amount
    TokenAmountType amountType;  // Fiat or Native
}
```

---

## Error Codes

### Router Errors

- `CCIPRouter: chain not supported`
- `CCIPRouter: insufficient native token fee`
- `CCIPRouter: duplicate message`
- `CCIPRouter: empty receiver`

### Bridge Errors

- `CCIPWETH9Bridge: destination not enabled`
- `CCIPWETH9Bridge: transfer failed`
- `CCIPWETH9Bridge: transfer already processed`
- `CCIPWETH9Bridge: invalid amount`
- `CCIPWETH9Bridge: zero recipient`

---

## Related Documentation

- [Developer Integration Guide](../developer-guides/CCIP_INTEGRATION_GUIDE.md)
- [User Guide](../user-guides/CCIP_BRIDGE_USER_GUIDE.md)
- [Deployment Guide](DEPLOYMENT_GUIDE_CHAIN138.md)

---

**Last Updated**: 2025-01-27

