# WETH9 and WETH10 with CCIP Cross-Chain Deployment Guide

## Overview

This guide covers the deployment of WETH9 and WETH10 contracts with Chainlink CCIP (Cross-Chain Interoperability Protocol) for complete cross-chain token transfer functionality.

## Contracts

### WETH9 (`contracts/tokens/WETH.sol`)
- Standard WETH9 implementation
- ERC-20 compatible
- Deposit/withdraw functionality
- Transfer/approve functionality

### WETH10 (`contracts/tokens/WETH10.sol`)
- Enhanced WETH implementation
- ERC-3156 flash loan support
- Zero flash loan fees
- Advanced features for DeFi integrations

### CCIPWETH9Bridge (`contracts/ccip/CCIPWETH9Bridge.sol`)
- Cross-chain WETH9 transfer bridge
- CCIP integration for token transfers
- Replay protection with nonces
- Admin-controlled destination chains

### CCIPWETH10Bridge (`contracts/ccip/CCIPWETH10Bridge.sol`)
- Cross-chain WETH10 transfer bridge
- CCIP integration for token transfers
- Replay protection with nonces
- Admin-controlled destination chains

## Prerequisites

1. **Chainlink CCIP Router**: Deployed CCIP Router on your chain
2. **LINK Token**: LINK token address for paying CCIP fees
3. **Private Key**: Deployer private key with sufficient balance
4. **Environment Variables**: Configured in `.env` file

## Environment Variables

Create a `.env` file with the following variables:

```bash
# Deployer private key
PRIVATE_KEY=your_private_key_here

# CCIP Configuration
CCIP_ROUTER=0x...  # CCIP Router address
CCIP_FEE_TOKEN=0x...  # LINK token address

# WETH9 Address (if not deploying)
WETH9_ADDRESS=0x...  # Optional: existing WETH9 address

# WETH10 Address (if not deploying)
WETH10_ADDRESS=0x...  # Optional: existing WETH10 address

# Deployment Flags
DEPLOY_WETH9=true
DEPLOY_WETH10=true
DEPLOY_BRIDGES=true
```

## Deployment Steps

### Option 1: Deploy All Contracts (Recommended)

Deploy WETH9, WETH10, and both bridges in a single transaction:

```bash
forge script script/DeployWETHWithCCIP.s.sol:DeployWETHWithCCIP \
    --rpc-url $RPC_URL \
    --broadcast \
    --verify \
    -vvvv
```

### Option 2: Deploy Individually

#### 1. Deploy WETH9

```bash
forge script script/DeployWETH.s.sol:DeployWETH \
    --rpc-url $RPC_URL \
    --broadcast \
    --verify \
    -vvvv
```

#### 2. Deploy WETH10

```bash
forge script script/DeployWETH10.s.sol:DeployWETH10 \
    --rpc-url $RPC_URL \
    --broadcast \
    --verify \
    -vvvv
```

#### 3. Deploy CCIPWETH9Bridge

```bash
forge script script/DeployCCIPWETH9Bridge.s.sol:DeployCCIPWETH9Bridge \
    --rpc-url $RPC_URL \
    --broadcast \
    --verify \
    -vvvv
```

#### 4. Deploy CCIPWETH10Bridge

```bash
forge script script/DeployCCIPWETH10Bridge.s.sol:DeployCCIPWETH10Bridge \
    --rpc-url $RPC_URL \
    --broadcast \
    --verify \
    -vvvv
```

## Configuration

### 1. Add Destination Chains

After deployment, configure destination chains for cross-chain transfers:

```solidity
// Add destination chain for WETH9 bridge
bridge.addDestination(
    destinationChainSelector,  // Chain selector (e.g., Ethereum: 5009297550715157269)
    receiverBridgeAddress      // Address of corresponding bridge on destination chain
);

// Add destination chain for WETH10 bridge
bridge10.addDestination(
    destinationChainSelector,
    receiverBridgeAddress
);
```

### 2. Verify Configuration

```solidity
// Check if destination is enabled
(bool enabled, uint64 chainSelector, address receiver) = bridge.destinations(chainSelector);

// Get all destination chains
uint64[] memory chains = bridge.getDestinationChains();
```

## Usage

### Sending WETH9 Cross-Chain

```solidity
// 1. Approve bridge to spend WETH9
weth9.approve(bridgeAddress, amount);

// 2. Approve LINK token for fees
linkToken.approve(bridgeAddress, feeAmount);

// 3. Send cross-chain
bytes32 messageId = bridge.sendCrossChain(
    destinationChainSelector,
    recipientAddress,
    amount
);
```

### Sending WETH10 Cross-Chain

```solidity
// 1. Approve bridge to spend WETH10
weth10.approve(bridgeAddress, amount);

// 2. Approve LINK token for fees
linkToken.approve(bridgeAddress, feeAmount);

// 3. Send cross-chain
bytes32 messageId = bridge10.sendCrossChain(
    destinationChainSelector,
    recipientAddress,
    amount
);
```

### Calculating Fees

```solidity
// Calculate fee for cross-chain transfer
uint256 fee = bridge.calculateFee(
    destinationChainSelector,
    amount
);
```

### Receiving Cross-Chain Transfers

The bridge automatically receives tokens via CCIP and transfers them to the recipient. No user action required.

## Testing

Run tests to verify functionality:

```bash
# Test WETH9
forge test --match-contract WETHTest -vvvv

# Test WETH10
forge test --match-contract WETH10Test -vvvv

# Test CCIPWETH9Bridge
forge test --match-contract CCIPWETH9BridgeTest -vvvv

# Test CCIPWETH10Bridge
forge test --match-contract CCIPWETH10BridgeTest -vvvv
```

## Chain Selectors

Common chain selectors for reference:

| Chain | Chain Selector |
|-------|---------------|
| Ethereum Mainnet | 5009297550715157269 |
| Arbitrum One | 4949039107694359620 |
| Optimism | 3734403246176062136 |
| Polygon | 4051577828743386545 |
| Base | 15971525489660198786 |
| Avalanche | 6433500567565415381 |

## Security Considerations

1. **Admin Controls**: Bridge admin has full control over destination chains
2. **Replay Protection**: Messages are protected against replay attacks
3. **Fee Management**: Users must approve LINK tokens for fees
4. **Token Approvals**: Users must approve bridges to spend tokens
5. **Destination Validation**: Always verify destination chain addresses

## Monitoring

Monitor cross-chain transfers:

```solidity
// Check if transfer was processed
bool processed = bridge.processedTransfers(messageId);

// Get user nonce
uint256 nonce = bridge.getUserNonce(userAddress);

// Listen for events
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
);
```

## Troubleshooting

### Common Issues

1. **Insufficient LINK**: Ensure user has enough LINK for fees
2. **Destination Not Enabled**: Verify destination chain is added and enabled
3. **Invalid Token**: Ensure correct WETH9/WETH10 address
4. **Replay Attack**: Message ID already processed

### Error Messages

- `CCIPWETH9Bridge: destination not enabled` - Destination chain not configured
- `CCIPWETH9Bridge: transfer already processed` - Replay attack detected
- `CCIPWETH9Bridge: insufficient repayment` - Insufficient token balance
- `CCIPWETH9Bridge: zero recipient` - Invalid recipient address

## Next Steps

1. ✅ Deploy WETH9 and WETH10 contracts
2. ✅ Deploy CCIP bridges
3. ✅ Configure destination chains
4. ✅ Test cross-chain transfers
5. ✅ Monitor deployments
6. ✅ Update documentation with deployed addresses

## Support

For issues or questions:
- Check contract documentation
- Review test files for examples
- Verify CCIP router configuration
- Check chain selector compatibility

## Deployment Checklist

- [ ] CCIP Router deployed and verified
- [ ] LINK token address confirmed
- [ ] WETH9 deployed (if new)
- [ ] WETH10 deployed (if new)
- [ ] CCIPWETH9Bridge deployed
- [ ] CCIPWETH10Bridge deployed
- [ ] Destination chains configured
- [ ] Tests passed
- [ ] Contracts verified on explorer
- [ ] Documentation updated

## References

- [Chainlink CCIP Documentation](https://docs.chain.link/ccip)
- [WETH9 Specification](https://github.com/gnosis/canonical-weth)
- [WETH10 Repository](https://github.com/WETH10/WETH10)
- [ERC-3156 Flash Loans](https://eips.ethereum.org/EIPS/eip-3156)

