# CCIP Bridge User Guide

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

---

## Overview

This guide explains how to use the CCIP bridges to transfer WETH9 and WETH10 tokens between ChainID 138 and other supported chains.

---

## Prerequisites

- Wallet connected to ChainID 138
- WETH9 or WETH10 tokens in your wallet
- LINK tokens (if using LINK for fees) or native ETH (if using native fees)
- Sufficient balance for gas fees

---

## Bridge Addresses

### ChainID 138

- **CCIPWETH9Bridge**: See `.env` or documentation for deployed address
- **CCIPWETH10Bridge**: See `.env` or documentation for deployed address

### Ethereum Mainnet

- **CCIPWETH9Bridge**: `0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6`
- **CCIPWETH10Bridge**: `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e`

---

## Step-by-Step Guide

### Step 1: Prepare Tokens

#### Option A: You have native ETH

Wrap ETH to WETH:

```solidity
// For WETH9
weth9.deposit{value: amount}();

// For WETH10
weth10.deposit{value: amount}();
```

#### Option B: You already have WETH

Ensure you have sufficient WETH balance.

### Step 2: Approve Bridge

Approve the bridge to spend your tokens:

```solidity
// For WETH9
weth9.approve(bridgeAddress, amount);

// For WETH10
weth10.approve(bridgeAddress, amount);
```

### Step 3: Calculate Fees

Estimate the CCIP fee:

```solidity
uint256 fee = bridge.calculateFee(destinationChainSelector, amount);
```

### Step 4: Approve Fee Token

If using LINK for fees:

```solidity
linkToken.approve(bridgeAddress, fee);
```

If using native ETH, ensure you have sufficient balance.

### Step 5: Send Cross-Chain

Send tokens to destination chain:

```solidity
bytes32 messageId = bridge.sendCrossChain(
    destinationChainSelector,  // e.g., 5009297550715157269 for Ethereum Mainnet
    recipientAddress,           // Address on destination chain
    amount                      // Amount to transfer
);
```

### Step 6: Monitor Transfer

Track the transfer using the `messageId`:

- Check events: `CrossChainTransferInitiated`
- Wait for confirmation on destination chain
- Check events: `CrossChainTransferCompleted`

---

## Example: Transfer WETH9 from ChainID 138 to Ethereum Mainnet

```solidity
// 1. Wrap ETH to WETH9
weth9.deposit{value: 1 ether}();

// 2. Approve bridge
weth9.approve(bridgeAddress, 1 ether);

// 3. Calculate fee
uint256 fee = bridge.calculateFee(5009297550715157269, 1 ether);

// 4. Approve fee (if using LINK)
linkToken.approve(bridgeAddress, fee);

// 5. Send cross-chain
bytes32 messageId = bridge.sendCrossChain(
    5009297550715157269,  // Ethereum Mainnet selector
    recipientAddress,     // Your address on Ethereum Mainnet
    1 ether
);

// 6. Monitor transfer
// Check events or use messageId to track
```

---

## Using with Web3 Libraries

### ethers.js

```javascript
const bridge = new ethers.Contract(bridgeAddress, bridgeABI, signer);

// Approve
await weth9.approve(bridgeAddress, amount);

// Calculate fee
const fee = await bridge.calculateFee(destinationSelector, amount);

// Approve fee token (if LINK)
await linkToken.approve(bridgeAddress, fee);

// Send cross-chain
const tx = await bridge.sendCrossChain(
    destinationSelector,
    recipientAddress,
    amount
);
const receipt = await tx.wait();
const messageId = receipt.events.find(e => e.event === 'CrossChainTransferInitiated').args.messageId;
```

### web3.js

```javascript
// Approve
await weth9.methods.approve(bridgeAddress, amount).send({ from: account });

// Calculate fee
const fee = await bridge.methods.calculateFee(destinationSelector, amount).call();

// Approve fee token (if LINK)
await linkToken.methods.approve(bridgeAddress, fee).send({ from: account });

// Send cross-chain
const tx = await bridge.methods.sendCrossChain(
    destinationSelector,
    recipientAddress,
    amount
).send({ from: account });
```

---

## Supported Destination Chains

| Network | Chain ID | Chain Selector |
|---------|----------|---------------|
| Ethereum Mainnet | 1 | `5009297550715157269` |
| BSC | 56 | `11344663589394136015` |
| Polygon | 137 | `4051577828743386545` |
| Avalanche | 43114 | `6433500567565415381` |
| Base | 8453 | `15971525489660198786` |
| Arbitrum | 42161 | `4949039107694359620` |
| Optimism | 10 | `3734403246176062136` |

---

## Fees

### Fee Structure

- **Base Fee**: Fixed fee per message
- **Data Fee**: Fee per byte of message data
- **Token Fee**: Percentage of token amount (if applicable)

### Fee Payment

- **Native ETH**: Fees paid in native token (if configured)
- **LINK Token**: Fees paid in LINK token (if configured)

### Estimating Fees

Always calculate fees before sending:

```solidity
uint256 fee = bridge.calculateFee(destinationSelector, amount);
```

---

## Troubleshooting

### Issue: Transfer Fails

**Possible Causes**:
- Insufficient token balance
- Insufficient fee balance
- Destination not configured
- Invalid recipient address

**Solutions**:
1. Check token and fee balances
2. Verify destination is enabled
3. Verify recipient address is valid
4. Check recent bridge events

### Issue: Transfer Stuck

**Possible Causes**:
- Destination chain issues
- Router problems
- Network congestion

**Solutions**:
1. Check destination chain status
2. Monitor bridge events
3. Contact support if persistent

### Issue: High Fees

**Possible Causes**:
- Large transfer amount
- Network congestion
- Fee configuration

**Solutions**:
1. Check fee calculation
2. Consider smaller amounts
3. Wait for lower network activity

---

## Security Considerations

1. **Verify Addresses**: Always verify bridge and token addresses
2. **Check Fees**: Verify fee calculations before sending
3. **Monitor Transfers**: Track your transfers using messageId
4. **Use Official Sources**: Only use addresses from official documentation

---

## Related Documentation

- [CCIP Deployment Guide](../ccip/DEPLOYMENT_GUIDE_CHAIN138.md)
- [CCIP Review](../CCIP_CHAIN138_REVIEW.md)
- [Main Guide](../ETH_WETH_CHAINLINK_GUIDE.md)

---

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

