# Cross-Chain Token Setup: BurnMint with Direct Mint Authority Transfer
Source: https://docs.chain.link/ccip/tutorials/svm/cross-chain-tokens/direct-mint-authority
Last Updated: 2026-06-15

> For the complete documentation index, see [llms.txt](/llms.txt).

This comprehensive tutorial demonstrates how to create and configure cross-chain tokens using Chainlink's Cross-Chain Interoperability Protocol (CCIP) between Solana Devnet and Ethereum Sepolia. You will implement the **direct mint authority transfer** approach within **Path A** from the [CCIP Cross-Chain Token Integration Guide](/ccip/concepts/cross-chain-token/svm/integration-guide).

## What You Will Build

This tutorial implements the **direct mint authority transfer** variant of **Path A** from the [CCIP Cross-Chain Token Integration Guide](/ccip/concepts/cross-chain-token/svm/integration-guide). This approach is designed for development and testing environments where you transfer complete mint authority to the Pool Signer PDA for simplified setup.

### Cross-Chain Token Architecture

This tutorial implements the **[Burn and Mint](/ccip/concepts/cross-chain-token/overview#burn-and-mint)** token handling mechanism between Solana Devnet and Ethereum Sepolia. You'll deploy **two BurnMint pools** (one on each chain) that work together to maintain consistent token supply across chains.

**How Burn and Mint Works:**

1. **Source Chain**: Burns tokens from sender's account
2. **CCIP Protocol**: Transmits message cross-chain
3. **Destination Chain**: Mints equivalent tokens to the receiver

### Component Overview

| Component            | Implementation                      | Authority Model                        |
| -------------------- | ----------------------------------- | -------------------------------------- |
| **Ethereum Sepolia** | ERC20 token with CCIP BurnMint pool | Multiple minters: EOA + Pool           |
| **Solana Devnet**    | SPL token with CCIP BurnMint pool   | Single mint authority: Pool Signer PDA |

### Authority Model Differences

- **Ethereum**: Your EOA + Pool both have mint privileges (multiple minters supported)
- **Solana**: Pool Signer PDA has exclusive mint authority (single authority constraint)

For complete details on token handling mechanisms, see [Token Handling Mechanisms](/ccip/concepts/cross-chain-token/overview#token-handling-mechanisms).

> **CAUTION: Development Environment Approach**
>
> **Important**: This tutorial transfers mint authority directly to the Pool Signer PDA for simplicity. This approach is
> designed for **development and testing environments only**.
>
> **Key Authority Model Differences:**
>
> - **Ethereum**: Your EOA retains mint privileges while the pool gets additional mint/burn roles
>
> - **Solana**: Complete mint authority
>   transfer to Pool Signer PDA (SPL tokens allow only one mint authority) **For production deployments**:
>   - Learn more about [Production Multisig Tutorial](/ccip/tutorials/svm/cross-chain-tokens/production-multisig-tutorial) - Enterprise-grade dual-layer governance
>   - Learn more about [Mint Authority Management](/ccip/concepts/cross-chain-token/svm/token-pools#mint-authority-management) for detailed security considerations.

## Prerequisites

This tutorial uses a **two-terminal workflow** across two repositories. Install the system tools below, clone both repos, then complete environment setup before starting Phase 1.

### System Requirements

- **Node.js v22 or higher**: Verify with `node -v` ([nvm](https://www.npmjs.com/package/nvm) recommended)
- **pnpm**: Required for the BS58 generator (`npm install -g pnpm`)
- **Solana CLI**: [Installation guide](https://docs.solana.com/cli/install-solana-cli-tools) (includes `spl-token`)
- **Git**: For cloning repositories
- **CCIP CLI**: For cross-chain transfer testing in the final phase

Install the [CCIP CLI](https://github.com/smartcontractkit/ccip-tools-ts) globally:

```bash
npm install -g @chainlink/ccip-cli
ccip-cli --help
```

See the [CCIP CLI documentation](https://docs.chain.link/ccip/tools/cli/) for RPC and wallet configuration.

### Tutorial Workflow

| Terminal       | Repository                                                                                                                  | Purpose                              | Commands        |
| -------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | --------------- |
| **Terminal 1** | [CCIP Solana BS58 Generator](https://github.com/smartcontractkit/ccip-solana-bs58-generator)                                | Solana setup and configuration       | `pnpm bs58`     |
| **Terminal 2** | [Smart Contract Examples (Hardhat)](https://github.com/smartcontractkit/smart-contract-examples/tree/main/ccip/cct/hardhat) | EVM deploy and configuration         | `npx hardhat`   |
| **Either**     | Global `@chainlink/ccip-cli`                                                                                                | Cross-chain transfer testing (final) | `ccip-cli send` |

### Terminal 1: CCIP Solana BS58 Generator

**Clone and install** (skip `git clone` if you already have the repo):

```bash
git clone https://github.com/smartcontractkit/ccip-solana-bs58-generator.git
cd ccip-solana-bs58-generator
pnpm install
```

**Configure Solana CLI for devnet:**

First, check whether your environment is already set up:

```bash
solana config get
solana address
solana balance
```

If the RPC URL is already `https://api.devnet.solana.com`, your keypair path is correct, and you have sufficient SOL, skip to [Terminal 2 setup](#terminal-2-smart-contract-examples-hardhat) below.

Otherwise, run only the steps you need:

```bash
# Set devnet (skip if config get already shows devnet)
solana config set --url https://api.devnet.solana.com

# Point to your keypair (skip if config get already shows the path you want)
solana config set --keypair ~/.config/solana/id.json

# Create a keypair only if the file does not exist yet
solana-keygen new --outfile ~/.config/solana/id.json

# Fund your wallet if balance is low
solana airdrop 2
solana balance
```

> **NOTE: Direct Execution**
>
> Append `--execute` to **mutating** `pnpm bs58` commands in Terminal 1 so your local wallet signs and sends
> transactions. **Read-only** commands (`get-state`, `get-chain-config`, `derive-accounts`) omit `--execute`. See the
> [CCIP Solana BS58 Generator
> README](https://github.com/smartcontractkit/ccip-solana-bs58-generator/blob/main/README.md) for command syntax.

### Terminal 2: Smart Contract Examples (Hardhat)

**Clone, install, and compile** (skip `git clone` if you already have the repo):

```bash
git clone https://github.com/smartcontractkit/smart-contract-examples.git
cd smart-contract-examples/ccip/cct/hardhat
npm install
npm run compile
```

**Set up encrypted environment variables:**

```bash
# Required at the start of each session
npx env-enc set-pw

# Verify existing variables (skip npx env-enc set if all required vars are already configured)
npx env-enc view

# Add or update variables only if missing
npx env-enc set
```

**Required variables for Ethereum Sepolia:**

- `ETHEREUM_SEPOLIA_RPC_URL`: RPC endpoint from [Alchemy](https://www.alchemy.com/) or [Infura](https://www.infura.io/)
- `PRIVATE_KEY`: Your testnet wallet private key ([MetaMask export guide](https://support.metamask.io/managing-my-wallet/secret-recovery-phrase-and-private-keys/how-to-export-an-accounts-private-key/))
- `ETHERSCAN_API_KEY`: API key from [Etherscan](https://docs.etherscan.io/getting-started/viewing-api-usage-statistics)

**Fund your EVM wallet:**

- Acquire **ETH** on Ethereum Sepolia for transaction gas and CCIP fees ([Chainlink faucet](https://faucets.chain.link/) or [Google Cloud Faucet](https://cloud.google.com/application/web3/faucet/ethereum/sepolia))
- **LINK** is optional — use `--fee-token LINK` on EVM → Solana sends if you prefer paying CCIP fees in LINK

### Cross-Chain Transfers (CCIP CLI)

The final tutorial phase uses globally installed `ccip-cli` (not the BS58 generator):

- **Solana → EVM**: Run from Terminal 1 with `--wallet ~/.config/solana/id.json`
- **EVM → Solana**: Run from Terminal 2 (Hardhat directory). Prefer `--wallet hardhat:<name>` ([Hardhat keystore](https://hardhat.org/docs/plugins/hardhat-keystore)) so the signing key stays encrypted. Hardhat tasks load env-enc automatically; `ccip-cli` does not. As an alternative, view the same key with `npx env-enc view` and export `PRIVATE_KEY` manually for the send command.

**RPC endpoints** (required for source and destination chains). You can provide them any of these ways — see [CCIP CLI configuration](https://docs.chain.link/ccip/tools/cli/configuration):

- **Command line:** pass `--rpc` on each command (repeat for multiple networks), or `--rpcs` with comma-separated URLs
- **Environment variables:** export `RPC_*` variables (e.g., `RPC_SEPOLIA`, `RPC_SOLANA_DEVNET`) or the tutorial's `SOLANA_DEVNET_RPC` and `ETHEREUM_SEPOLIA_RPC_URL` exports
- **File:** create a `.env` file in the directory where you run `ccip-cli` (default `--rpcs-file`, one URL per line)

See the tutorial's **Configure CCIP CLI** section for the recommended `--rpc` examples.

### Environment Variables

Variables use prefixes to prevent confusion across repositories and tools:

| Prefix       | Usage                   | Examples                                                                  |
| ------------ | ----------------------- | ------------------------------------------------------------------------- |
| `ETH_*`      | Ethereum addresses      | `ETH_TOKEN_ADDRESS`, `ETH_POOL_ADDRESS`                                   |
| `SOL_*`      | Solana addresses        | `SOL_TOKEN_MINT`, `SOL_POOL_ADDRESS`, `SOL_WALLET_ADDRESS`                |
| `SOL_CCIP_*` | Solana CCIP program IDs | `SOL_CCIP_POOL_PROGRAM`, `SOL_CCIP_ROUTER`, `SOL_CCIP_FEE_QUOTER_PROGRAM` |

> **NOTE: Two-Terminal Workflow**
>
> Keep both terminal windows open throughout the tutorial. Switch between the CCIP Solana BS58 Generator (Terminal 1)
> and the Hardhat project (Terminal 2) as each phase indicates. Cross-chain transfer commands use `ccip-cli` from the
> terminal that matches the source chain.

## Tutorial Approach

This tutorial provides step-by-step instructions with detailed explanations of what each command does and why. You'll work primarily in Terminal 1 (CCIP Solana BS58 Generator) with occasional switches to Terminal 2 (EVM).

**Environment Variable Management**: This tutorial uses phase-based variable files (e.g., `~/.phase1_vars`, `~/.ccip_complete_vars`) to eliminate manual variable re-entry when switching between terminals. Each phase saves its variables to files that subsequent phases can load automatically.

For deeper technical implementation details, refer to:

- **[CCIP Solana BS58 Generator README](https://github.com/smartcontractkit/ccip-solana-bs58-generator/blob/main/README.md)**: Solana CLI command details, `--execute` EOA workflow, and options
- **[Smart Contract Examples README](https://github.com/smartcontractkit/smart-contract-examples/blob/main/ccip/cct/hardhat/README.md)**: EVM implementation guide

**EOA execution**: In Terminal 1, append `--execute` to each `pnpm bs58` command so your local Solana wallet signs and sends transactions directly. Set `--authority` to your wallet address (`$SOL_WALLET_ADDRESS`). Read-only commands (`get-state`, `get-chain-config`, `derive-accounts`) do not use `--execute`.

## Phase 1: Ethereum Sepolia Token Setup

In this phase, you'll deploy and configure your ERC20 token with CCIP BurnMint pools on Ethereum Sepolia.

> **NOTE: Terminal Context**
>
> **Current Terminal: Terminal 2** (Smart Contract Examples - Hardhat) Verify your location:
>
> ```bash
> pwd
> # Should show: .../smart-contract-examples/ccip/cct/hardhat
> ```

### Step 1: Deploy ERC20 Token

Deploy a burnable and mintable ERC20 token that will serve as your cross-chain asset:

### Deploy Command

```bash
# Deploy BurnMint ERC20 token with verification

npx hardhat deployToken \
  --name "BnM Cross-Chain Token" \
  --symbol "BnMAEM" \
  --decimals 18 \
  --verifycontract \
  --network ethereumSepolia
```

### Expected Output

```bash
2026-06-14T15:47:26.136Z info: 🚀 Deploying BurnMintERC20 to ethereumSepolia...
2026-06-14T15:47:26.137Z info:    name: BnM Cross-Chain Token, symbol: BnMAEM
2026-06-14T15:47:28.211Z info: ⏳ Deployment tx: 0xe3f88d62d59f8f6beb5bf8f505996da2861e973e13de0b797b01400c350113dc
2026-06-14T15:47:28.211Z info:    Waiting for 3 confirmation(s)...
2026-06-14T15:48:02.254Z info: ✅ Token deployed at: 0xc06d7a73ba115b592961290c8c49760b97247676
2026-06-14T15:48:02.613Z info: Granting mint and burn roles to 0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA...
2026-06-14T15:48:03.042Z info:    Waiting for 3 confirmation(s)...
2026-06-14T15:48:41.403Z info: ✅ Mint/Burn roles granted.
2026-06-14T15:48:41.403Z info: Verifying contract...

The contract at 0xc06d7a73ba115b592961290c8c49760b97247676 has already been verified on Etherscan.

If you need to verify a partially verified contract, please use the --force flag.

Explorer: https://sepolia.etherscan.io/address/0xc06d7a73ba115b592961290c8c49760b97247676#code
2026-06-14T15:48:44.420Z info: ✅ Token contract verified successfully
```

### What This Does

This command:

- Deploys a [BurnMintERC20](/ccip/api-reference/evm/v1.6.1/burn-mint-erc20) contract with 18 decimals
- Grants your EOA mint and burn privileges for testing
- Verifies the contract on Etherscan for transparency
- Sets up the foundation for cross-chain operations

Set the token address variable:

### Set Token Address

```bash
# REPLACE with your actual deployed token address
export ETH_TOKEN_ADDRESS="<INSERT_YOUR_TOKEN_ADDRESS_HERE>"
```

Verify it's set correctly:

```bash
echo "Ethereum Token: $ETH_TOKEN_ADDRESS"
```

### Expected Output

```bash
Ethereum Token: 0xc06d7a73ba115b592961290c8c49760b97247676
```

### Step 2: Deploy BurnMint Token Pool

Deploy a CCIP token pool that will manage burning and minting operations:

### Deploy Command

```bash
# Deploy BurnMint pool for your token
npx hardhat deployTokenPool \
  --tokenaddress $ETH_TOKEN_ADDRESS \
  --localtokendecimals 18 \
  --pooltype burnMint \
  --verifycontract \
  --network ethereumSepolia
```

### Expected Output

```bash
2026-06-14T15:55:33.429Z info: 🚀 Deploying burnMint pool on ethereumSepolia
2026-06-14T15:55:33.430Z info:    Token: 0xc06d7a73ba115b592961290c8c49760b97247676
2026-06-14T15:55:33.430Z info:    Decimals: 18
2026-06-14T15:55:33.430Z info:    Allowlist: None
2026-06-14T15:55:39.434Z info: ⏳ Deployment tx: 0xfca38c2532c5ef0441ca77e3def99c0cfa4959eee8b0bdc274d69e2255b440fb
2026-06-14T15:55:39.434Z info:    Waiting for 3 confirmation(s)...
2026-06-14T15:56:15.123Z info: ✅ Token pool deployed at: 0x835f9b923858aa5aca7ac1c7389361482fc32c45
2026-06-14T15:56:15.123Z info: Granting mint and burn roles to 0x835f9b923858aa5aca7ac1c7389361482fc32c45 on token 0xc06d7a73ba115b592961290c8c49760b97247676
2026-06-14T15:56:16.957Z info:    Waiting for 3 confirmation(s)...
2026-06-14T15:56:53.039Z info: ✅ Mint/Burn roles granted
2026-06-14T15:56:53.040Z info: Verifying contract...

The contract at 0x835f9b923858aa5aca7ac1c7389361482fc32c45 has already been verified on Etherscan.

If you need to verify a partially verified contract, please use the --force flag.

Explorer: https://sepolia.etherscan.io/address/0x835f9b923858aa5aca7ac1c7389361482fc32c45#code
2026-06-14T15:56:56.451Z info: ✅ Token pool contract verified successfully
```

### What This Does

This command:

- Deploys a [BurnMintTokenPool](/ccip/api-reference/evm/v1.6.1/burn-mint-token-pool) contract
- Links it to your ERC20 token
- **Grants the pool additional mint/burn privileges** (your EOA retains its privileges)
- **Multiple Minters**: Both your EOA and the pool can mint tokens independently

Set the pool address variable:

### Set Pool Address

```bash
# REPLACE with your actual deployed pool address
export ETH_POOL_ADDRESS="<INSERT_YOUR_POOL_ADDRESS_HERE>"
```

Verify both addresses are set:

```bash
echo "Ethereum Token: $ETH_TOKEN_ADDRESS"
echo "Ethereum Pool: $ETH_POOL_ADDRESS"
```

### Expected Output

```bash
Ethereum Token: 0xc06d7a73ba115b592961290c8c49760b97247676
Ethereum Pool: 0x835f9b923858aa5aca7ac1c7389361482fc32c45
```

### Step 3: Mint Initial Token Supply

Mint tokens to your wallet for testing cross-chain transfers:

### Mint Command

```bash
# Mint 1000 tokens (with 18 decimals)
npx hardhat mintTokens \
  --tokenaddress $ETH_TOKEN_ADDRESS \
  --amount 1000000000000000000000 \
  --network ethereumSepolia
```

### Expected Output

```bash
2026-06-14T15:58:32.181Z info: 🪙 Minting 1000000000000000000000 BnMAEM to 0x8c244f0b2164e6a3bed74ab429b0ebd661bb14ca...
2026-06-14T15:58:34.767Z info: ⏳ Mint tx: 0x9bc3e7018cbf89aac0c51717a39e2429692b45c2426511e8a3af9141e28b7a51
2026-06-14T15:58:34.767Z info:    Waiting for 3 confirmation(s)...
2026-06-14T15:59:15.269Z info: ✅ Minted 1000000000000000000000 BnMAEM to 0x8c244f0b2164e6a3bed74ab429b0ebd661bb14ca
2026-06-14T15:59:15.271Z info:    Current balance of 0x8c244f0b2164e6a3bed74ab429b0ebd661bb14ca: 1000000000000000000000 BnMAEM
```

### Step 4: Register as CCIP Administrator

Register yourself as the CCIP administrator for your token. This two-step process (claim + accept) ensures secure ownership transfer:

#### Claim Admin Role

### Claim Command

```bash
# Claim admin role for your token
npx hardhat claimAdmin \
  --tokenaddress $ETH_TOKEN_ADDRESS \
  --network ethereumSepolia
```

### Expected Output

```bash
2026-06-14T16:00:40.602Z info: 🎯 Claiming admin for 0xc06d7a73ba115b592961290c8c49760b97247676 using getCCIPAdmin mode
2026-06-14T16:00:46.906Z info: ✅ Current wallet 0x8c244f0b2164e6a3bed74ab429b0ebd661bb14ca is CCIP admin
2026-06-14T16:00:50.179Z info: 📤 TX sent: 0x222e504cbb8a61715a03eb1cd18382ff856f8e79693856cc12d727a6b5f540e7. Waiting for 3 confirmations...
2026-06-14T16:01:26.639Z info: ✅ Admin claimed for 0xc06d7a73ba115b592961290c8c49760b97247676 on ethereumSepolia (3 confirmations)
```

### What This Does

This command:

- Calls the [RegistryModuleOwnerCustom](/ccip/api-reference/evm/v1.6.1/registry-module-owner-custom) contract
- Registers you as the pending administrator
- Uses the token's `getCCIPAdmin()` function to verify ownership
- Prepares for the acceptance step

#### Accept Admin Role

### Accept Command

```bash
# Accept the admin role to finalize
npx hardhat acceptAdminRole \
  --tokenaddress $ETH_TOKEN_ADDRESS \
  --network ethereumSepolia
```

### Expected Output

```bash
2026-06-14T16:03:19.318Z info: 🔄 Accepting admin role for 0xc06d7a73ba115b592961290c8c49760b97247676 on ethereumSepolia...
2026-06-14T16:03:23.161Z info: Checking pending admin for 0xc06d7a73ba115b592961290c8c49760b97247676...
2026-06-14T16:03:23.541Z info: ✅ Current wallet 0x8c244f0b2164e6a3bed74ab429b0ebd661bb14ca is the pending admin
2026-06-14T16:03:23.541Z info: Accepting admin role...
2026-06-14T16:03:26.284Z info: 📤 TX sent: 0xeefe8ae8971bdcf66c1d30ee3d7eabefe29596575e191a8f9cc4fd6e5b751d12. Waiting for 3 confirmations...
2026-06-14T16:04:03.547Z info: ✅ Admin role accepted for 0xc06d7a73ba115b592961290c8c49760b97247676 on ethereumSepolia (3 confirmations)
```

### Step 5: Save Phase 1 Variables

Save your EVM configuration for use in later phases:

### Save Variables

```bash
# Save Phase 1 variables for cross-terminal use
cat > ~/.phase1_vars << EOF
export ETH_TOKEN_ADDRESS="$ETH_TOKEN_ADDRESS"
export ETH_POOL_ADDRESS="$ETH_POOL_ADDRESS"
EOF

echo "=== Phase 1 Complete - EVM Setup ==="
echo "✅ ETH Token: $ETH_TOKEN_ADDRESS"
echo "✅ ETH Pool: $ETH_POOL_ADDRESS"
echo "✅ Variables saved to ~/.phase1_vars"
```

### Expected Output

```bash
=== Phase 1 Complete - EVM Setup ===
✅ ETH Token: 0xc06d7a73ba115b592961290c8c49760b97247676
✅ ETH Pool: 0x835f9b923858aa5aca7ac1c7389361482fc32c45
✅ Variables saved to ~/.phase1_vars
```

## Phase 2: Solana Devnet Token Setup

Now we'll create and configure the Solana side of your cross-chain token system.

> **NOTE: Terminal Context**
>
> **Switch to Terminal 1** (CCIP Solana BS58 Generator) Verify your location:
>
> ```bash
> pwd
> # Should show: .../ccip-solana-bs58-generator
> ```

### Step 1: Prepare Environment

Load EVM variables from Phase 1 and set Solana CCIP constants:

### Setup Command

```bash
# Load Phase 1 EVM variables
source ~/.phase1_vars

# Your Solana wallet (used as --authority for all EOA commands)
export SOL_WALLET_ADDRESS=$(solana address)

# CCIP program IDs on Solana Devnet (DO NOT CHANGE THESE)
export SOL_CCIP_POOL_PROGRAM="41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB"
export SOL_CCIP_ROUTER="Ccip842gzYHhvdDkSyi2YVCoAWPbYJoApMFzSxQroE9C"
export SOL_CCIP_FEE_QUOTER_PROGRAM="FeeQPGkKDeRV1MgoYfMH6L8o3KeuYjwUZrgn4LRKfjHi"

# Ethereum Sepolia chain selector (used in remote chain config)
export ETH_SEPOLIA_CHAIN_SELECTOR="16015286601757825753"

echo "✅ Wallet: $SOL_WALLET_ADDRESS"
echo "✅ Pool Program: $SOL_CCIP_POOL_PROGRAM"
echo "✅ Router Program: $SOL_CCIP_ROUTER"
```

### Expected Output

```bash
✅ Wallet: GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
✅ Pool Program: 41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB
✅ Router Program: Ccip842gzYHhvdDkSyi2YVCoAWPbYJoApMFzSxQroE9C
```

### Step 2: Create SPL Token

Create an SPL token with metadata and initial supply using direct EOA execution:

### Create Command

```bash
# Create SPL token with Metaplex metadata and initial supply
pnpm bs58 --env devnet --execute spl-token \
  --instruction create-mint \
  --authority $SOL_WALLET_ADDRESS \
  --decimals 9 \
  --with-metaplex true \
  --name "AEM" \
  --symbol "CCIP-AEM" \
  --uri "https://cyan-pleasant-anteater-613.mypinata.cloud/ipfs/bafkreieirlwjqbtzniqsgcjebzexlcspcmvd4woh3ajvf2p4fuivkenw6i" \
  --initial-supply 1000000000000 \
  --recipient $SOL_WALLET_ADDRESS
```

> **NOTE: Custom Configuration**
>
> You can customize the token name, symbol, and URI. Upload your metadata to IPFS or Arweave, then update the `--name`, `--symbol`, and `--uri` flags above.

### Expected Output

```bash
INFO [2026-06-14 21:38:11.724 +0530]: 🔍 Validating create mint parameters...
INFO [2026-06-14 21:38:11.724 +0530]: 📋 Token Program: spl-token (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA)
INFO [2026-06-14 21:38:11.724 +0530]: 📋 Decimals: 9
INFO [2026-06-14 21:38:11.724 +0530]: 📋 Metaplex metadata enabled
INFO [2026-06-14 21:38:11.724 +0530]:    Name: "AEM"
INFO [2026-06-14 21:38:11.724 +0530]:    Symbol: "CCIP-AEM"
INFO [2026-06-14 21:38:11.724 +0530]:    URI: https://cyan-pleasant-anteater-613.mypinata.cloud/ipfs/bafkreieirlwjqbtzniqsgcjebzexlcspcmvd4woh3ajvf2p4fuivkenw6i
INFO [2026-06-14 21:38:11.724 +0530]: 📋 Initial supply: 1000000000000 smallest units
INFO [2026-06-14 21:38:11.724 +0530]: 📋 Recipient: GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
INFO [2026-06-14 21:38:11.724 +0530]: ✅ Parameter validation completed
INFO [2026-06-14 21:38:11.724 +0530]: 🎨 Creating mint with Metaplex metadata...
INFO [2026-06-14 21:38:11.726 +0530]: 📋 Generated mint address: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
INFO [2026-06-14 21:38:11.726 +0530]: 📋 Mint seed: mint_1781453291724_bq3i74
INFO [2026-06-14 21:38:11.726 +0530]: 📋 Using token program: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
INFO [2026-06-14 21:38:12.136 +0530]: 📋 Generated 3 instructions for mint + metadata creation
INFO [2026-06-14 21:38:12.136 +0530]: 💰 Adding initial supply mint instructions...
INFO [2026-06-14 21:38:12.136 +0530]: 📋 Creating ATA for recipient: 4PiwHZh1ZCcBCt6y1cDa7hvRWKmvzki4q9kQKYSvgHxK
INFO [2026-06-14 21:38:12.136 +0530]: 📋 Will mint 1000000000000 smallest units to 4PiwHZh1ZCcBCt6y1cDa7hvRWKmvzki4q9kQKYSvgHxK
INFO [2026-06-14 21:38:12.137 +0530]: 🔄 Building and simulating transaction...
INFO [2026-06-14 21:38:12.137 +0530]: 📋 Metadata PDA: 5mvf5TcWa6L9xzVr4PebqEWxF6CCXteCa9DSFyg1HeSo
INFO [2026-06-14 21:38:12.329 +0530]: Transaction built successfully
    instructionName: "spl-token.create_mint_with_metaplex"
    transactionSize: "778 bytes"
    base58Length: "1062 characters"
    hexLength: "1556 characters"
    accountCount: 2
    signerCount: 1
    computeUnits: 62049
INFO [2026-06-14 21:38:12.329 +0530]: Completed buildTransaction (spl-token.create_mint_with_metaplex)
    durationMs: 192
INFO [2026-06-14 21:38:12.517 +0530]:
INFO [2026-06-14 21:38:12.517 +0530]: 🖊️  EXECUTE MODE — signing & sending on devnet
INFO [2026-06-14 21:38:12.517 +0530]:    Signer:      GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
INFO [2026-06-14 21:38:12.517 +0530]:    Instruction: spl-token.create_mint_with_metaplex
INFO [2026-06-14 21:38:12.517 +0530]:    RPC:         https://api.devnet.solana.com
INFO [2026-06-14 21:38:12.517 +0530]:
INFO [2026-06-14 21:38:13.351 +0530]: Transaction confirmed successfully
    signature: "36JP4Mv2wwaCFTeXfZ4h4DeTfDgm2kANtSdWn776pmfu5jieLCLFWrLegBKP1LKVNkXPnVdZht9fHUsc6ecBw1Fd"
    attempt: 1
INFO [2026-06-14 21:38:13.351 +0530]:
INFO [2026-06-14 21:38:13.352 +0530]: 🎉 Transaction executed successfully!
INFO [2026-06-14 21:38:13.352 +0530]:
INFO [2026-06-14 21:38:13.352 +0530]: 📋 Execution Details:
INFO [2026-06-14 21:38:13.352 +0530]:    Instruction: spl-token.create_mint_with_metaplex
INFO [2026-06-14 21:38:13.352 +0530]:    Signature:   36JP4Mv2wwaCFTeXfZ4h4DeTfDgm2kANtSdWn776pmfu5jieLCLFWrLegBKP1LKVNkXPnVdZht9fHUsc6ecBw1Fd
INFO [2026-06-14 21:38:13.352 +0530]:    Explorer:    https://explorer.solana.com/tx/36JP4Mv2wwaCFTeXfZ4h4DeTfDgm2kANtSdWn776pmfu5jieLCLFWrLegBKP1LKVNkXPnVdZht9fHUsc6ecBw1Fd?cluster=devnet
INFO [2026-06-14 21:38:13.352 +0530]:
INFO [2026-06-14 21:38:13.352 +0530]: ✅ Transaction simulation completed
```

Set the token mint variable:

### Set Token Mint

```bash
# Copy the mint address from the command output above
export SOL_TOKEN_MINT="<INSERT_YOUR_MINT_ADDRESS_HERE>"
```

Verify the variables:

```bash
echo "Solana Token Mint: $SOL_TOKEN_MINT"
echo "Solana pool program: $SOL_CCIP_POOL_PROGRAM"
```

### Expected Output

```bash
Solana Token Mint: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
CCIP Pool Program: 41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB
```

### Step 3: Initialize CCIP Token Pool

Initialize the token pool configuration on Solana:

### Initialize Command

```bash
# Initialize CCIP pool for your token
pnpm bs58 --env devnet --execute burnmint-token-pool \
  --instruction initialize-pool \
  --program-id $SOL_CCIP_POOL_PROGRAM \
  --mint $SOL_TOKEN_MINT \
  --authority $SOL_WALLET_ADDRESS
```

### Expected Output

```bash
🔄 Generating initialize (pool) transaction...
🔄 Building and simulating transaction...
INFO [2026-06-14 21:43:33.436 +0530]: Transaction built successfully
    instructionName: "burnmint-token-pool.initialize"
    transactionSize: "279 bytes"
    base58Length: "380 characters"
    hexLength: "558 characters"
    accountCount: 7
    signerCount: 1
    computeUnits: 28818
INFO [2026-06-14 21:43:33.437 +0530]: Completed buildTransaction (burnmint-token-pool.initialize)
    durationMs: 374
INFO [2026-06-14 21:43:33.600 +0530]:
INFO [2026-06-14 21:43:33.600 +0530]: 🖊️  EXECUTE MODE — signing & sending on devnet
INFO [2026-06-14 21:43:33.600 +0530]:    Signer:      GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
INFO [2026-06-14 21:43:33.600 +0530]:    Instruction: burnmint-token-pool.initialize
INFO [2026-06-14 21:43:33.600 +0530]:    RPC:         https://api.devnet.solana.com
INFO [2026-06-14 21:43:33.600 +0530]:
   ✅ Transaction simulation completed
INFO [2026-06-14 21:43:34.351 +0530]: Transaction confirmed successfully
    signature: "4ts1pHPJ1gKTGhcZZLFTsVncQHxMCa3gArxCBsdXgKuuv1yZaYYNjTH3zG9YrgiFJopFKpyR8YqEnKxu89PLHNTy"
    attempt: 1
INFO [2026-06-14 21:43:34.351 +0530]:
INFO [2026-06-14 21:43:34.351 +0530]: 🎉 Transaction executed successfully!
INFO [2026-06-14 21:43:34.351 +0530]:
INFO [2026-06-14 21:43:34.351 +0530]: 📋 Execution Details:
INFO [2026-06-14 21:43:34.351 +0530]:    Instruction: burnmint-token-pool.initialize
INFO [2026-06-14 21:43:34.351 +0530]:    Signature:   4ts1pHPJ1gKTGhcZZLFTsVncQHxMCa3gArxCBsdXgKuuv1yZaYYNjTH3zG9YrgiFJopFKpyR8YqEnKxu89PLHNTy
INFO [2026-06-14 21:43:34.352 +0530]:    Explorer:    https://explorer.solana.com/tx/4ts1pHPJ1gKTGhcZZLFTsVncQHxMCa3gArxCBsdXgKuuv1yZaYYNjTH3zG9YrgiFJopFKpyR8YqEnKxu89PLHNTy?cluster=devnet
INFO [2026-06-14 21:43:34.352 +0530]:
```

### What This Does

This command:

- Creates a Pool Config PDA (Program Derived Address)
- Generates a Pool Signer PDA that will control token operations
- Establishes the pool state for cross-chain operations

The Pool Signer PDA is crucial - You will transfer mint authority to it to enable autonomous cross-chain minting.

Learn more about [Token Pool Architecture](/ccip/concepts/cross-chain-token/svm/token-pools).

Save the Pool Signer PDA and Pool Config PDA. Derive them from the onchain pool configuration:

### Derive Pool Accounts

```bash
# Derive Pool Signer PDA and Pool State PDA
pnpm bs58 --env devnet utils \
  --instruction derive-accounts \
  --program-type burnmint-token-pool \
  --program-id $SOL_CCIP_POOL_PROGRAM \
  --mint $SOL_TOKEN_MINT
```

### Expected Output

```bash
🔍 Deriving burnmint-token-pool accounts...
INFO [2026-06-14 21:45:01.843 +0530]: Starting deriveAccounts command
    command: "derive-accounts"
    programType: "burnmint-token-pool"
    programId: "41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB"
    mint: "6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz"
    globalOptions: {
      "environment": "devnet",
      "resolvedRpcUrl": "https://api.devnet.solana.com"
    }

📊 Derived Accounts:

1. Pool State PDA
   Address: HLRSx9TYk6Gaz9ZuWR9usmih5MyTpnKLjZg7aDCEk6nJ
   Seeds: ["ccip_tokenpool_config", mint]
   Bump: 253
   Description: Main pool configuration account (created by initialize-pool)

2. Pool Signer PDA
   Address: F8QX4ZZqjV1gMwaC3erYjVXrcm9QBsSDLNiPLbFEVwH1
   Seeds: ["ccip_tokenpool_signer", mint]
   Bump: 254
   Description: 🎯 CRITICAL: Autonomous mint/burn authority for cross-chain operations

3. Global Config PDA
   Address: E4Bsi43kX3iwXAFia2ebm1mS5Xkmmdv3minZDnfo7Zzf
   Seeds: ["config"]
   Bump: 255
   Description: Program-wide configuration settings

4. Pool Token ATA
   Address: EP2Yhkc3yvRrxBK5dTNrcWivowYvaxGcrwi3dE1aPaYy
   Seeds: [mint, pool_signer_pda, token_program]
   Description: Pool's token account (owned by Pool Signer PDA)

🎯 CRITICAL ADDRESS FOR CROSS-CHAIN OPERATIONS:
   Pool Signer PDA: F8QX4ZZqjV1gMwaC3erYjVXrcm9QBsSDLNiPLbFEVwH1
   ↳ This address signs all mint/burn transactions autonomously

INFO [2026-06-14 21:45:02.294 +0530]: Detected SPL Token v1
    mint: "6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz"
    programId: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
INFO [2026-06-14 21:45:02.296 +0530]: ✅ Account derivation completed successfully
    command: "derive-accounts"
```

Copy the **Pool Signer PDA** and **Pool State PDA** addresses from the output, then export them:

### Set Pool Variables

```bash
export SOL_POOL_SIGNER_PDA="<INSERT_YOUR_POOL_SIGNER_PDA_HERE>"
export SOL_POOL_CONFIG_PDA="<INSERT_YOUR_POOL_STATE_PDA_HERE>"
```

Verify the variables:

```bash
echo "Pool Signer PDA: $SOL_POOL_SIGNER_PDA"
echo "Pool Config PDA: $SOL_POOL_CONFIG_PDA"
```

### Expected Output

```bash
Pool Signer PDA: F8QX4ZZqjV1gMwaC3erYjVXrcm9QBsSDLNiPLbFEVwH1
Pool Config PDA: HLRSx9TYk6Gaz9ZuWR9usmih5MyTpnKLjZg7aDCEk6nJ
```

### Step 4: Create Pool Token Account

In this step, you will create an Associated Token Account (ATA) for the Pool Signer PDA. This ATA is required for the pool to hold and manage tokens during cross-chain transfer operations.

### Create ATA Command

```bash
# Create token account owned by the Pool Signer PDA
# Your wallet (--fee-payer) pays rent; the Pool Signer PDA is the account owner
spl-token create-account $SOL_TOKEN_MINT \
  --owner $SOL_POOL_SIGNER_PDA \
  --fee-payer $HOME/.config/solana/id.json
```

### Expected Output

```bash
Creating account EP2Yhkc3yvRrxBK5dTNrcWivowYvaxGcrwi3dE1aPaYy

Signature: 2Zt8FHAhYe9N4JLfY8jJMBwQduSdxokt6W2AfUQYb4fABTjrqpE2caWXUttDENGkqxFzY8gJijSQUaj1CvSAbqqd
```

### Step 5: Register as CCIP Administrator

#### Propose Admin

In this step, you will propose yourself as the CCIP administrator for the Solana token.

### Propose Admin

```bash
# Propose yourself as administrator
pnpm bs58 --env devnet --execute router \
  --instruction owner-propose-administrator \
  --program-id $SOL_CCIP_ROUTER \
  --mint $SOL_TOKEN_MINT \
  --authority $SOL_WALLET_ADDRESS \
  --token-admin-registry-admin $SOL_WALLET_ADDRESS
```

### Expected Output

```bash
🔄 Generating owner_propose_administrator transaction...
🔄 Building and simulating transaction...
INFO [2026-06-14 21:58:49.697 +0530]: Transaction built successfully
    instructionName: "router.owner_propose_administrator"
    transactionSize: "277 bytes"
    base58Length: "377 characters"
    hexLength: "554 characters"
    accountCount: 5
    signerCount: 1
    computeUnits: 21231
INFO [2026-06-14 21:58:49.698 +0530]: Completed buildTransaction (router.owner_propose_administrator)
    durationMs: 370
INFO [2026-06-14 21:58:49.856 +0530]:
INFO [2026-06-14 21:58:49.856 +0530]: 🖊️  EXECUTE MODE — signing & sending on devnet
INFO [2026-06-14 21:58:49.856 +0530]:    Signer:      GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
INFO [2026-06-14 21:58:49.856 +0530]:    Instruction: router.owner_propose_administrator
INFO [2026-06-14 21:58:49.856 +0530]:    RPC:         https://api.devnet.solana.com
INFO [2026-06-14 21:58:49.856 +0530]:
   ✅ Transaction simulation completed
INFO [2026-06-14 21:58:50.639 +0530]: Transaction confirmed successfully
    signature: "3TzhvTQytu3RmRSGf5XQ9cjsjXfAct4s4t2DLuGWHzHvxGU5R9BmvkQv64odZa8URsFwFTSv63AUSihhdzyDM5ng"
    attempt: 1
INFO [2026-06-14 21:58:50.639 +0530]:
INFO [2026-06-14 21:58:50.639 +0530]: 🎉 Transaction executed successfully!
INFO [2026-06-14 21:58:50.639 +0530]:
INFO [2026-06-14 21:58:50.639 +0530]: 📋 Execution Details:
INFO [2026-06-14 21:58:50.639 +0530]:    Instruction: router.owner_propose_administrator
INFO [2026-06-14 21:58:50.639 +0530]:    Signature:   3TzhvTQytu3RmRSGf5XQ9cjsjXfAct4s4t2DLuGWHzHvxGU5R9BmvkQv64odZa8URsFwFTSv63AUSihhdzyDM5ng
INFO [2026-06-14 21:58:50.639 +0530]:    Explorer:    https://explorer.solana.com/tx/3TzhvTQytu3RmRSGf5XQ9cjsjXfAct4s4t2DLuGWHzHvxGU5R9BmvkQv64odZa8URsFwFTSv63AUSihhdzyDM5ng?cluster=devnet
INFO [2026-06-14 21:58:50.639 +0530]:
```

#### Accept Admin

In this step, you will accept the administrator role for the Solana token. This process establishes your control over the token's CCIP configuration on Solana.

### Accept Admin

```bash
# Accept the administrator role
pnpm bs58 --env devnet --execute router \
  --instruction accept-admin-role \
  --program-id $SOL_CCIP_ROUTER \
  --mint $SOL_TOKEN_MINT \
  --authority $SOL_WALLET_ADDRESS
```

### Expected Output

```bash
🔄 Generating accept_admin_role_token_admin_registry transaction...
🔄 Building and simulating transaction...
INFO [2026-06-14 21:59:51.627 +0530]: Transaction built successfully
    instructionName: "router.accept_admin_role_token_admin_registry"
    transactionSize: "212 bytes"
    base58Length: "289 characters"
    hexLength: "424 characters"
    accountCount: 4
    signerCount: 1
    computeUnits: 16954
INFO [2026-06-14 21:59:51.627 +0530]: Completed buildTransaction (router.accept_admin_role_token_admin_registry)
    durationMs: 359
INFO [2026-06-14 21:59:51.790 +0530]:
INFO [2026-06-14 21:59:51.790 +0530]: 🖊️  EXECUTE MODE — signing & sending on devnet
INFO [2026-06-14 21:59:51.790 +0530]:    Signer:      GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
INFO [2026-06-14 21:59:51.790 +0530]:    Instruction: router.accept_admin_role_token_admin_registry
INFO [2026-06-14 21:59:51.790 +0530]:    RPC:         https://api.devnet.solana.com
INFO [2026-06-14 21:59:51.790 +0530]:
   ✅ Transaction simulation completed
INFO [2026-06-14 21:59:52.533 +0530]: Transaction confirmed successfully
    signature: "494bSaZQAf6tRxMApAmVLXubkNYSSiBwiZVwtFKNkfGeuAHysYg5CW79UzE8ptcchDN2duWr5ifks2x4pPLtmnHj"
    attempt: 1
INFO [2026-06-14 21:59:52.533 +0530]:
INFO [2026-06-14 21:59:52.533 +0530]: 🎉 Transaction executed successfully!
INFO [2026-06-14 21:59:52.533 +0530]:
INFO [2026-06-14 21:59:52.533 +0530]: 📋 Execution Details:
INFO [2026-06-14 21:59:52.533 +0530]:    Instruction: router.accept_admin_role_token_admin_registry
INFO [2026-06-14 21:59:52.533 +0530]:    Signature:   494bSaZQAf6tRxMApAmVLXubkNYSSiBwiZVwtFKNkfGeuAHysYg5CW79UzE8ptcchDN2duWr5ifks2x4pPLtmnHj
INFO [2026-06-14 21:59:52.533 +0530]:    Explorer:    https://explorer.solana.com/tx/494bSaZQAf6tRxMApAmVLXubkNYSSiBwiZVwtFKNkfGeuAHysYg5CW79UzE8ptcchDN2duWr5ifks2x4pPLtmnHj?cluster=devnet
INFO [2026-06-14 21:59:52.533 +0530]:
```

### Step 6: Transfer Mint Authority to Pool Signer PDA

> **CAUTION: Critical Step: Mint Authority Transfer**
>
> **This is the defining step** of the direct mint authority approach. You're transferring complete mint authority to the Pool Signer PDA, which:
>
> - **Enables**: Autonomous cross-chain minting for incoming transfers
> - **Removes**: Your ability to mint additional tokens directly
> - **Is Irreversible**: Cannot be undone in this tutorial setup
>
> **Important**: Ensure you have sufficient tokens for testing before proceeding. The SPL token creation in Step 1 already minted tokens to your wallet, so you're ready to continue.

### Transfer Command

```bash
# Transfer mint authority to Pool Signer PDA
spl-token authorize $SOL_TOKEN_MINT mint $SOL_POOL_SIGNER_PDA
```

### Expected Output

```bash
Updating 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
  Current mint: GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
  New mint: F8QX4ZZqjV1gMwaC3erYjVXrcm9QBsSDLNiPLbFEVwH1

Signature: 5zD2r6aMiijkQTuanvPQw9QSeJbqdTcT48ueafDEK1YcoNiQMrnbbdb5gZ8rZ6zGay12y6jyYmhMgRCABLtajyT7
```

### Implications

**What the Pool Signer PDA Can Do:**

- Autonomously mint tokens for incoming cross-chain transfers
- Handle all CCIP operations without manual intervention

**What You Can No Longer Do:**

- **Direct minting**: You cannot mint additional tokens (unlike Ethereum's multiple minter model)
- **Authority recovery**: No mechanism to reclaim mint authority in this tutorial setup

**Critical Difference from Ethereum**: Solana's SPL token standard enforces a **single mint authority** constraint. Unlike Ethereum where both your EOA and pool can mint simultaneously, Solana requires choosing one authority. This transfer is **permanent and irreversible** in this tutorial configuration.

**For production environments**, implement [multisig governance approaches](/ccip/tutorials/svm/cross-chain-tokens/production-multisig-tutorial) that maintain administrative control while enabling autonomous CCIP operations.

Verify the authority transfer:

### Verify Mint Authority

```bash
spl-token display $SOL_TOKEN_MINT
```

### Expected Output

```bash
SPL Token Mint
  Address: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
  Program: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
  Supply: 1000000000000
  Decimals: 9
  Mint authority: F8QX4ZZqjV1gMwaC3erYjVXrcm9QBsSDLNiPLbFEVwH1
  Freeze authority: GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
```

### Step 7: Save Phase 2 Variables

Save your Solana configuration for use in cross-chain setup:

### Save Variables

```bash
# Save Phase 2 variables for cross-terminal use
cat > ~/.phase2_vars << EOF
export SOL_TOKEN_MINT="$SOL_TOKEN_MINT"
export SOL_POOL_SIGNER_PDA="$SOL_POOL_SIGNER_PDA"
export SOL_POOL_CONFIG_PDA="$SOL_POOL_CONFIG_PDA"
export SOL_CCIP_POOL_PROGRAM="$SOL_CCIP_POOL_PROGRAM"
export SOL_CCIP_ROUTER="$SOL_CCIP_ROUTER"
export SOL_CCIP_FEE_QUOTER_PROGRAM="$SOL_CCIP_FEE_QUOTER_PROGRAM"
export ETH_SEPOLIA_CHAIN_SELECTOR="$ETH_SEPOLIA_CHAIN_SELECTOR"
export SOL_WALLET_ADDRESS="$SOL_WALLET_ADDRESS"
EOF

echo "=== Phase 2 Complete - Solana Setup ==="
echo "✅ SOL Token: $SOL_TOKEN_MINT"
echo "✅ Pool Signer PDA: $SOL_POOL_SIGNER_PDA"
echo "✅ Pool Config PDA: $SOL_POOL_CONFIG_PDA"
echo "✅ Variables saved to ~/.phase2_vars"
```

### Expected Output

```bash
=== Phase 2 Complete - Solana Setup ===
✅ SOL Token: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
✅ Pool Signer PDA: F8QX4ZZqjV1gMwaC3erYjVXrcm9QBsSDLNiPLbFEVwH1
✅ Pool Config PDA: HLRSx9TYk6Gaz9ZuWR9usmih5MyTpnKLjZg7aDCEk6nJ
✅ Variables saved to ~/.phase2_vars
```

## Phase 3: Cross-Chain Configuration

Configure bidirectional connectivity between your token pools on both chains.

### Step 1: Configure Solana Pool

**Stay in Terminal 1** (CCIP Solana BS58 Generator)

Load the Ethereum addresses from Phase 1:

### Load Phase 1 Variables

```bash
# Load Phase 1 variables
source ~/.phase1_vars

# Verify all variables are available
echo "✅ ETH Token: $ETH_TOKEN_ADDRESS"
echo "✅ ETH Pool: $ETH_POOL_ADDRESS"
echo "✅ SOL Token: $SOL_TOKEN_MINT"
echo "✅ SOL Pool Program: $SOL_CCIP_POOL_PROGRAM"
```

### Expected Output

```bash
✅ ETH Token: 0xc06d7a73ba115b592961290c8c49760b97247676
✅ ETH Pool: 0x835f9b923858aa5aca7ac1c7389361482fc32c45
✅ SOL Token: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
✅ SOL Pool Program: 41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB
```

#### Configure Remote Chain

In this step, you will initialize the configuration for Ethereum Sepolia as a remote chain. This creates the basic chain configuration with token information but without pool addresses (those will be added in the next step).

### Initialize Config

```bash
# Initialize remote chain configuration
pnpm bs58 --env devnet --execute burnmint-token-pool \
  --instruction init-chain-remote-config \
  --program-id $SOL_CCIP_POOL_PROGRAM \
  --mint $SOL_TOKEN_MINT \
  --authority $SOL_WALLET_ADDRESS \
  --remote-chain-selector $ETH_SEPOLIA_CHAIN_SELECTOR \
  --pool-addresses '[]' \
  --token-address $ETH_TOKEN_ADDRESS \
  --decimals 9
```

### Expected Output

```bash
🔄 Generating initChainRemoteConfig transaction...
   RPC URL: https://api.devnet.solana.com
   Program ID: 41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB
   Mint: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
   Authority: GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
   Remote Chain Selector: 16015286601757825753
   Pool Addresses: 0 addresses (must be empty at init)
   Token Address: c06d7a73ba115b592961290c8c49760b97247676
   Decimals: 9
⚙️  Building transaction instruction...
   ✅ Instruction built successfully
🔄 Building and simulating transaction...
INFO [2026-06-14 22:51:55.694 +0530]: Starting initChainRemoteConfig command
    command: "burnmint-token-pool.init-chain-remote-config"
    programId: "41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB"
    mint: "6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz"
    authority: "GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN"
    remoteChainSelector: "16015286601757825753"
    poolAddresses: "[]"
    tokenAddress: "0xc06d7a73ba115b592961290c8c49760b97247676"
    decimals: "9"
    globalOptions: {
      "environment": "devnet",
      "execute": true,
      "resolvedRpcUrl": "https://api.devnet.solana.com",
      "keypair": "/Users/syed-cll/.config/solana/id.json",
      "_signerKeypair": {
        "_keypair": {
          "publicKey": {
            "0": 230,
            "1": 211,
            "2": 30,
            ...
            "29": 179,
            "30": 114,
            "31": 73
          },
          "secretKey": {
            "0": 191,
            "1": 198,
            "2": 244,
            ...
            "61": 179,
            "62": 114,
            "63": 73
          }
        }
      }
    }
INFO [2026-06-14 22:51:56.369 +0530]: Transaction built successfully
    instructionName: "initChainRemoteConfig"
    transactionSize: "293 bytes"
    base58Length: "399 characters"
    hexLength: "586 characters"
    accountCount: 4
    signerCount: 1
    computeUnits: 23902
INFO [2026-06-14 22:51:56.369 +0530]: Completed buildTransaction (initChainRemoteConfig)
    durationMs: 671
INFO [2026-06-14 22:51:56.551 +0530]:
INFO [2026-06-14 22:51:56.551 +0530]: 🖊️  EXECUTE MODE — signing & sending on devnet
INFO [2026-06-14 22:51:56.551 +0530]:    Signer:      GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
INFO [2026-06-14 22:51:56.551 +0530]:    Instruction: initChainRemoteConfig
INFO [2026-06-14 22:51:56.551 +0530]:    RPC:         https://api.devnet.solana.com
INFO [2026-06-14 22:51:56.551 +0530]:
   ✅ Transaction simulation completed
INFO [2026-06-14 22:51:57.322 +0530]: Transaction confirmed successfully
    signature: "4pjmpEiS5s2NUTcaE1w4XeajiD2xN4o1keinVpWNdHMUs7wgYsqs3MGMn9ZA1Ze18RxmdyqQNidS2T91MXDLFA75"
    attempt: 1
INFO [2026-06-14 22:51:57.322 +0530]:
INFO [2026-06-14 22:51:57.322 +0530]: 🎉 Transaction executed successfully!
INFO [2026-06-14 22:51:57.322 +0530]:
INFO [2026-06-14 22:51:57.322 +0530]: 📋 Execution Details:
INFO [2026-06-14 22:51:57.322 +0530]:    Instruction: initChainRemoteConfig
INFO [2026-06-14 22:51:57.322 +0530]:    Signature:   4pjmpEiS5s2NUTcaE1w4XeajiD2xN4o1keinVpWNdHMUs7wgYsqs3MGMn9ZA1Ze18RxmdyqQNidS2T91MXDLFA75
INFO [2026-06-14 22:51:57.322 +0530]:    Explorer:    https://explorer.solana.com/tx/4pjmpEiS5s2NUTcaE1w4XeajiD2xN4o1keinVpWNdHMUs7wgYsqs3MGMn9ZA1Ze18RxmdyqQNidS2T91MXDLFA75?cluster=devnet
INFO [2026-06-14 22:51:57.322 +0530]:
INFO [2026-06-14 22:51:57.322 +0530]: initChainRemoteConfig command completed successfully
    command: "burnmint-token-pool.init-chain-remote-config"
    transactionSize: "293 bytes"
    computeUnits: 23902
```

#### Add Remote Pool Address

In this step, you will use update the previously created chain configuration with the Ethereum pool address. This completes the configuration by telling the Solana pool which Ethereum pool it should interact with for cross-chain transfers.

### Add Pool Address

```bash
# Add Ethereum pool address to configuration
pnpm bs58 --env devnet --execute burnmint-token-pool \
  --instruction edit-chain-remote-config \
  --program-id $SOL_CCIP_POOL_PROGRAM \
  --mint $SOL_TOKEN_MINT \
  --authority $SOL_WALLET_ADDRESS \
  --remote-chain-selector $ETH_SEPOLIA_CHAIN_SELECTOR \
  --pool-addresses "[\"$ETH_POOL_ADDRESS\"]" \
  --token-address $ETH_TOKEN_ADDRESS \
  --decimals 9
```

### Expected Output

```bash
🔄 Generating editChainRemoteConfig transaction...
   RPC URL: https://api.devnet.solana.com
   Program ID: 41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB
   Mint: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
   Authority: GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
   Remote Chain Selector: 16015286601757825753
   Pool Addresses: 1 addresses
   Token Address: c06d7a73ba115b592961290c8c49760b97247676
   Decimals: 9
⚙️  Building transaction instruction...
   ✅ Instruction built successfully
🔄 Building and simulating transaction...
INFO [2026-06-14 22:54:12.969 +0530]: Starting editChainRemoteConfig command
    command: "burnmint-token-pool.edit-chain-remote-config"
    programId: "41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB"
    mint: "6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz"
    authority: "GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN"
    remoteChainSelector: "16015286601757825753"
    poolAddresses: "[\"0x835f9b923858aa5aca7ac1c7389361482fc32c45\"]"
    tokenAddress: "0xc06d7a73ba115b592961290c8c49760b97247676"
    decimals: "9"
    globalOptions: {
      "environment": "devnet",
      "execute": true,
      "resolvedRpcUrl": "https://api.devnet.solana.com",
      "keypair": "/Users/syed-cll/.config/solana/id.json",
      "_signerKeypair": {
        "_keypair": {
          "publicKey": {
            "0": 230,
            "1": 211,
            "2": 30,
            ...
            "29": 179,
            "30": 114,
            "31": 73
          },
          "secretKey": {
            "0": 191,
            "1": 198,
            "2": 244,
            ...
            "61": 179,
            "62": 114,
            "63": 73
          }
        }
      }
    }
INFO [2026-06-14 22:54:13.370 +0530]: Transaction built successfully
    instructionName: "editChainRemoteConfig"
    transactionSize: "317 bytes"
    base58Length: "432 characters"
    hexLength: "634 characters"
    accountCount: 4
    signerCount: 1
    computeUnits: 25033
INFO [2026-06-14 22:54:13.370 +0530]: Completed buildTransaction (editChainRemoteConfig)
    durationMs: 397
INFO [2026-06-14 22:54:13.550 +0530]:
INFO [2026-06-14 22:54:13.550 +0530]: 🖊️  EXECUTE MODE — signing & sending on devnet
INFO [2026-06-14 22:54:13.550 +0530]:    Signer:      GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
INFO [2026-06-14 22:54:13.550 +0530]:    Instruction: editChainRemoteConfig
INFO [2026-06-14 22:54:13.550 +0530]:    RPC:         https://api.devnet.solana.com
INFO [2026-06-14 22:54:13.550 +0530]:
   ✅ Transaction simulation completed
INFO [2026-06-14 22:54:14.264 +0530]: Transaction confirmed successfully
    signature: "5qRYvTuqd5yZxTw71eMABcYZbmB6HcKndsoRZyof5FHzdB815FNmEsr3TjnC1sW6SrrAsQRckEvc3WeixpT2uWUZ"
    attempt: 1
INFO [2026-06-14 22:54:14.264 +0530]:
INFO [2026-06-14 22:54:14.264 +0530]: 🎉 Transaction executed successfully!
INFO [2026-06-14 22:54:14.264 +0530]:
INFO [2026-06-14 22:54:14.264 +0530]: 📋 Execution Details:
INFO [2026-06-14 22:54:14.264 +0530]:    Instruction: editChainRemoteConfig
INFO [2026-06-14 22:54:14.264 +0530]:    Signature:   5qRYvTuqd5yZxTw71eMABcYZbmB6HcKndsoRZyof5FHzdB815FNmEsr3TjnC1sW6SrrAsQRckEvc3WeixpT2uWUZ
INFO [2026-06-14 22:54:14.264 +0530]:    Explorer:    https://explorer.solana.com/tx/5qRYvTuqd5yZxTw71eMABcYZbmB6HcKndsoRZyof5FHzdB815FNmEsr3TjnC1sW6SrrAsQRckEvc3WeixpT2uWUZ?cluster=devnet
INFO [2026-06-14 22:54:14.264 +0530]:
INFO [2026-06-14 22:54:14.265 +0530]: editChainRemoteConfig command completed successfully
    command: "burnmint-token-pool.edit-chain-remote-config"
    transactionSize: "317 bytes"
    computeUnits: 25033
```

### Step 2: Configure Ethereum Pool

**Switch to Terminal 2 (Smart Contract Examples)**

```bash
pwd
# Should output: ../smart-contract-examples/ccip/cct/hardhat
```

#### Load Variables from Previous Phases

Load all variables needed for EVM cross-chain configuration:

### Load Variables

```bash
# Load Phase 1 and Phase 2 variables
source ~/.phase1_vars
source ~/.phase2_vars

# Verify all variables are loaded
echo "✅ ETH Token: $ETH_TOKEN_ADDRESS"
echo "✅ ETH Pool: $ETH_POOL_ADDRESS"
echo "✅ SOL Token: $SOL_TOKEN_MINT"
echo "✅ SOL Pool Config PDA: $SOL_POOL_CONFIG_PDA"
echo "✅ Pool Program: $SOL_CCIP_POOL_PROGRAM"
```

### Expected Output

```bash
✅ ETH Token: 0xc06d7a73ba115b592961290c8c49760b97247676
✅ ETH Pool: 0x835f9b923858aa5aca7ac1c7389361482fc32c45
✅ SOL Token: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
✅ SOL Pool Config PDA: HLRSx9TYk6Gaz9ZuWR9usmih5MyTpnKLjZg7aDCEk6nJ
✅ Pool Program: 41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB
```

#### Configure Remote Chain

In this step, you will configure the Ethereum pool to recognize the Solana token and pool. This tells the Ethereum pool which Solana pool (via its Pool Config PDA) and token it should interact with for cross-chain transfers.

### Apply Updates

```bash
# Configure Ethereum pool to recognize Solana chain
npx hardhat applyChainUpdates \
  --pooladdress $ETH_POOL_ADDRESS \
  --remotechain solanaDevnet \
  --remotepooladdresses $SOL_POOL_CONFIG_PDA \
  --remotetokenaddress $SOL_TOKEN_MINT \
  --network ethereumSepolia
```

### Expected Output

```bash
2026-06-14T17:28:07.355Z info: === Starting Chain Update Configuration ===
2026-06-14T17:28:07.356Z info: 🔹 Local network: ethereumSepolia
2026-06-14T17:28:07.356Z info: 🔹 Pool address: 0x835f9b923858aa5aca7ac1c7389361482fc32c45
2026-06-14T17:28:07.356Z info: 🔹 Remote chain: solanaDevnet
2026-06-14T17:28:07.356Z info: 🔹 Remote chain family: svm
2026-06-14T17:28:07.356Z info: 🔹 Remote chain selector: 16423721717087811551
2026-06-14T17:28:12.784Z info: ✅ All addresses validated successfully
2026-06-14T17:28:14.507Z info: ✅ Using signer: 0x8c244f0b2164e6a3bed74ab429b0ebd661bb14ca
2026-06-14T17:28:16.087Z info: ✅ Connected to TokenPool contract
2026-06-14T17:28:16.088Z info:   Remote pool 1: HLRSx9TYk6Gaz9ZuWR9usmih5MyTpnKLjZg7aDCEk6nJ → 0xf2b4ab42d25a7af94c26d6ae45f85feea735c4cbfe7ced81902f3c86e4b7c9df
2026-06-14T17:28:16.089Z info: === Rate Limiter Configuration ===
2026-06-14T17:28:16.089Z info: Outbound enabled: false
2026-06-14T17:28:16.089Z info: Inbound enabled: false
2026-06-14T17:28:16.089Z info: === Executing applyChainUpdates() ===
2026-06-14T17:28:21.876Z info: 📤 TX sent: 0x99768c704d50e5d7fe12ae477da400d1e5c63b3b2226f7f05af51e69a447a36a
2026-06-14T17:28:21.876Z info: Waiting for 3 confirmations...
2026-06-14T17:28:53.826Z info: ✅ Chain update applied successfully on ethereumSepolia (3 confirmations)!
```

## Phase 4: Pool Registration

Register your token pools with their respective Token Admin Registries to enable cross-chain operations.

### Step 1: Register Ethereum Pool

**Stay in Terminal 2 (Smart Contract Examples)**

```bash
pwd
# Should output: ../smart-contract-examples/ccip/cct/hardhat
```

Register the BurnMint token pool with your token in the TokenAdminRegistry:

### Register Pool

```bash
# Register the pool with your token
npx hardhat setPool \
  --tokenaddress $ETH_TOKEN_ADDRESS \
  --pooladdress $ETH_POOL_ADDRESS \
  --network ethereumSepolia
```

### Expected Output

```bash
2026-06-14T17:29:49.025Z info: 🔗 Setting pool for token 0xc06d7a73ba115b592961290c8c49760b97247676 on ethereumSepolia...
2026-06-14T17:29:59.657Z info: 🔹 Using signer: 0x8c244f0b2164e6a3bed74ab429b0ebd661bb14ca
2026-06-14T17:29:59.659Z info: Using TokenAdminRegistry: 0x95F29FEE11c5C55d26cCcf1DB6772DE953B37B82
2026-06-14T17:30:00.786Z info: Checking token configuration for 0xc06d7a73ba115b592961290c8c49760b97247676...
2026-06-14T17:30:01.692Z info: Token 0xc06d7a73ba115b592961290c8c49760b97247676 current admin: 0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA
2026-06-14T17:30:01.693Z info: ✅ Current wallet 0x8c244f0b2164e6a3bed74ab429b0ebd661bb14ca is the token administrator
2026-06-14T17:30:01.693Z info: Setting pool 0x835f9b923858aa5aca7ac1c7389361482fc32c45 for token 0xc06d7a73ba115b592961290c8c49760b97247676...
2026-06-14T17:30:08.372Z info: 📤 TX sent: 0x344f2a6eafe2ba24ebe7d07384a5f638a62acf95b48ecb0b62a686b294cdd838. Waiting for 3 confirmations...
2026-06-14T17:30:40.392Z info: ✅ Pool successfully set for token 0xc06d7a73ba115b592961290c8c49760b97247676 → 0x835f9b923858aa5aca7ac1c7389361482fc32c45 on ethereumSepolia (3 confirmations)
```

### What This Does

This command:

- Links your ERC20 token to its BurnMint pool in the registry
- Enables the CCIP router to find your pool for transfers
- Completes the EVM-side configuration

Only the token administrator can perform this action.

### Step 2: Register Solana Pool

**Switch to Terminal 1** (CCIP Solana BS58 Generator)

```bash
pwd
# Should show: .../ccip-solana-bs58-generator
```

Load variables from previous phases:

```bash
source ~/.phase1_vars
source ~/.phase2_vars
```

#### Create Address Lookup Table

Address Lookup Tables (ALT) optimize Solana transactions by compressing addresses. With EOA execution, create and populate the ALT in one step:

### Create ALT

```bash
# Create and populate ALT for your token configuration
pnpm bs58 --env devnet --execute router \
  --instruction create-lookup-table \
  --program-id $SOL_CCIP_ROUTER \
  --fee-quoter-program-id $SOL_CCIP_FEE_QUOTER_PROGRAM \
  --pool-program-id $SOL_CCIP_POOL_PROGRAM \
  --mint $SOL_TOKEN_MINT \
  --authority $SOL_WALLET_ADDRESS
```

> **NOTE: EOA ALT Creation**
>
> Because your wallet signs immediately with `--execute`, the one-step `create-lookup-table` command avoids the blockhash expiration constraint that applies to multisig workflows. For Squads-based deployments, use the two-step `pnpm create-alt` + `append-to-lookup-table` workflow instead.

### Expected Output

```bash
🔄 Generating create_lookup_table transaction...
INFO [2026-06-14 23:01:49.942 +0530]: Detected SPL Token v1
    mint: "6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz"
    programId: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
🔄 Building and simulating transaction...
INFO [2026-06-14 23:01:50.235 +0530]: Transaction built successfully
    instructionName: "router.create_lookup_table"
    transactionSize: "525 bytes"
    base58Length: "716 characters"
    hexLength: "1050 characters"
    accountCount: 4
    signerCount: 2
    computeUnits: 19227
INFO [2026-06-14 23:01:50.235 +0530]: Completed buildTransaction (router.create_lookup_table)
    durationMs: 196
INFO [2026-06-14 23:01:50.429 +0530]:
INFO [2026-06-14 23:01:50.429 +0530]: 🖊️  EXECUTE MODE — signing & sending on devnet
INFO [2026-06-14 23:01:50.429 +0530]:    Signer:      GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
INFO [2026-06-14 23:01:50.429 +0530]:    Instruction: router.create_lookup_table
INFO [2026-06-14 23:01:50.429 +0530]:    RPC:         https://api.devnet.solana.com
INFO [2026-06-14 23:01:50.429 +0530]:
📮 Derived Lookup Table Address: FpXnqRcBEFtZsRVud8R5pKuSmnGjLvRDdtSHvLx8wSSQ
INFO [2026-06-14 23:01:51.331 +0530]: Transaction confirmed successfully
    signature: "5WS2n7FUyevWgCGNxUmfJhUu9F4qRBWA6rM74PMeguuM1gdDbs1fxZqV8pP7EdXSKzU8rkpgAckkerQZjv1N2tKB"
    attempt: 1
INFO [2026-06-14 23:01:51.331 +0530]:
INFO [2026-06-14 23:01:51.331 +0530]: 🎉 Transaction executed successfully!
INFO [2026-06-14 23:01:51.331 +0530]:
INFO [2026-06-14 23:01:51.331 +0530]: 📋 Execution Details:
INFO [2026-06-14 23:01:51.331 +0530]:    Instruction: router.create_lookup_table
INFO [2026-06-14 23:01:51.331 +0530]:    Signature:   5WS2n7FUyevWgCGNxUmfJhUu9F4qRBWA6rM74PMeguuM1gdDbs1fxZqV8pP7EdXSKzU8rkpgAckkerQZjv1N2tKB
INFO [2026-06-14 23:01:51.331 +0530]:    Explorer:    https://explorer.solana.com/tx/5WS2n7FUyevWgCGNxUmfJhUu9F4qRBWA6rM74PMeguuM1gdDbs1fxZqV8pP7EdXSKzU8rkpgAckkerQZjv1N2tKB?cluster=devnet
INFO [2026-06-14 23:01:51.331 +0530]:
```

### What This Does

ALTs compress transaction size by:

- Storing frequently used addresses onchain
- Allowing transactions to reference indices instead of full addresses
- Enabling more complex operations within Solana's transaction size limits

This is crucial for CCIP operations that involve multiple accounts.

Save the ALT address:

### Save ALT Address

Replace with your ALT address from the output:

```bash
export SOL_ALT_ADDRESS="<INSERT_YOUR_ALT_ADDRESS>"
```

Verify the ALT address is set correctly:

```bash
echo "ALT Address: $SOL_ALT_ADDRESS"
```

### Expected Output

```bash
ALT Address: FpXnqRcBEFtZsRVud8R5pKuSmnGjLvRDdtSHvLx8wSSQ
```

#### Register Solana Pool

In this step, you will register the token pool with Solana's Router TokenAdminRegistry. This instruction sets the Address Lookup Table as the pool definition for the token, enabling it for CCIP cross-chain transfers. The `writable_indices` parameter specifies which accounts in the ALT need write access during transactions.

### Register Pool

```bash
# Register pool with token admin registry
pnpm bs58 --env devnet --execute router \
  --instruction set-pool \
  --program-id $SOL_CCIP_ROUTER \
  --mint $SOL_TOKEN_MINT \
  --authority $SOL_WALLET_ADDRESS \
  --pool-lookup-table $SOL_ALT_ADDRESS \
  --writable-indexes "[3,4,7]"
```

### Expected Output

```bash
🔄 Generating set_pool transaction...
🔄 Building and simulating transaction...
INFO [2026-06-14 23:04:26.916 +0530]: Transaction built successfully
    instructionName: "router.set_pool"
    transactionSize: "252 bytes"
    base58Length: "343 characters"
    hexLength: "504 characters"
    accountCount: 5
    signerCount: 1
    computeUnits: 32867
INFO [2026-06-14 23:04:26.916 +0530]: Completed buildTransaction (router.set_pool)
    durationMs: 375
INFO [2026-06-14 23:04:27.080 +0530]:
INFO [2026-06-14 23:04:27.080 +0530]: 🖊️  EXECUTE MODE — signing & sending on devnet
INFO [2026-06-14 23:04:27.080 +0530]:    Signer:      GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
INFO [2026-06-14 23:04:27.080 +0530]:    Instruction: router.set_pool
INFO [2026-06-14 23:04:27.080 +0530]:    RPC:         https://api.devnet.solana.com
INFO [2026-06-14 23:04:27.080 +0530]:
   ✅ Transaction simulation completed
INFO [2026-06-14 23:04:27.967 +0530]: Transaction confirmed successfully
    signature: "5jZ5RP2U6Q3f2QBNwFLjxL5ecXPDRUpp4CQheuqHRaM97Bg5pjMSuUuWERFd9JVAzFxGbYK8t1Cnwi3AEc1aX4f8"
    attempt: 1
INFO [2026-06-14 23:04:27.967 +0530]:
INFO [2026-06-14 23:04:27.967 +0530]: 🎉 Transaction executed successfully!
INFO [2026-06-14 23:04:27.967 +0530]:
INFO [2026-06-14 23:04:27.967 +0530]: 📋 Execution Details:
INFO [2026-06-14 23:04:27.967 +0530]:    Instruction: router.set_pool
INFO [2026-06-14 23:04:27.967 +0530]:    Signature:   5jZ5RP2U6Q3f2QBNwFLjxL5ecXPDRUpp4CQheuqHRaM97Bg5pjMSuUuWERFd9JVAzFxGbYK8t1Cnwi3AEc1aX4f8
INFO [2026-06-14 23:04:27.967 +0530]:    Explorer:    https://explorer.solana.com/tx/5jZ5RP2U6Q3f2QBNwFLjxL5ecXPDRUpp4CQheuqHRaM97Bg5pjMSuUuWERFd9JVAzFxGbYK8t1Cnwi3AEc1aX4f8?cluster=devnet
INFO [2026-06-14 23:04:27.967 +0530]:
```

### Step 3: Save Complete Configuration

Save all variables for the testing phase:

### Save All Variables

```bash
# Save complete configuration for testing
cat > ~/.ccip_complete_vars << EOF
# Phase 1 - EVM
export ETH_TOKEN_ADDRESS="$ETH_TOKEN_ADDRESS"
export ETH_POOL_ADDRESS="$ETH_POOL_ADDRESS"

# Phase 2 - Solana
export SOL_TOKEN_MINT="$SOL_TOKEN_MINT"
export SOL_POOL_SIGNER_PDA="$SOL_POOL_SIGNER_PDA"
export SOL_POOL_CONFIG_PDA="$SOL_POOL_CONFIG_PDA"
export SOL_CCIP_POOL_PROGRAM="$SOL_CCIP_POOL_PROGRAM"
export SOL_CCIP_ROUTER="$SOL_CCIP_ROUTER"
export SOL_CCIP_FEE_QUOTER_PROGRAM="$SOL_CCIP_FEE_QUOTER_PROGRAM"
export ETH_SEPOLIA_CHAIN_SELECTOR="$ETH_SEPOLIA_CHAIN_SELECTOR"
export SOL_WALLET_ADDRESS="$SOL_WALLET_ADDRESS"

# Phase 4 - ALT
export SOL_ALT_ADDRESS="$SOL_ALT_ADDRESS"
EOF

echo "=== Complete Configuration Saved ==="
echo "✅ All variables saved to ~/.ccip_complete_vars"
echo "✅ Ready for cross-chain testing"
```

### Expected Output

```bash
=== Complete Configuration Saved ===
✅ All variables saved to ~/.ccip_complete_vars
✅ Ready for cross-chain testing
```

## Phase 5: Pre-Transfer Setup

Before validating your configuration, complete final setup steps.

### Step 1: Verify Pool Signer PDA

Confirm the Pool Signer PDA matches your saved configuration:

### Verify PDA

```bash
# Optional: read onchain pool state to verify addresses
pnpm bs58 --env devnet burnmint-token-pool \
  --instruction get-state \
  --program-id $SOL_CCIP_POOL_PROGRAM \
  --mint $SOL_TOKEN_MINT
```

### Expected Output

```bash
🔍 Reading token pool state...
   RPC URL: https://api.devnet.solana.com
   Program ID: 41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB
   Mint: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
   State PDA: HLRSx9TYk6Gaz9ZuWR9usmih5MyTpnKLjZg7aDCEk6nJ
✅ State account found

📊 Token Pool State Account

Program Information:
  Program Type:         Burnmint Token Pool
  Program ID:           41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB
  State Account:        HLRSx9TYk6Gaz9ZuWR9usmih5MyTpnKLjZg7aDCEk6nJ
  Version:              1

Token Configuration:
  Mint:                 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
  Decimals:             9
  Token Program:        TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

Pool Accounts:
  Pool Signer:          F8QX4ZZqjV1gMwaC3erYjVXrcm9QBsSDLNiPLbFEVwH1
  Pool Token Account:   EP2Yhkc3yvRrxBK5dTNrcWivowYvaxGcrwi3dE1aPaYy

Governance:
  Owner:                GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
  Proposed Owner:       None
  Rate Limit Admin:     GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN

Configuration:
  Router:               Ccip842gzYHhvdDkSyi2YVCoAWPbYJoApMFzSxQroE9C
  Router Onramp Auth:   H6ZviaabTYZqUPgiSoMDbeVthcNW9ULcAuUu3zRLFqDR
  RMN Remote:           RmnXLft1mSEwDgMKu2okYuHkiazxntFFcZFrrcXxYg7

Access Control:
  Allow List Enabled:   false
  Allow List Size:      0 address(es)
  Allow List:           Empty

INFO [2026-06-14 23:08:57.352 +0530]: getState command completed successfully
    command: "burnmint-token-pool.get-state"
```

Compare the onchain **Pool Signer** with your saved variable:

### Verify Saved PDA

```bash
echo "Saved Pool Signer PDA: $SOL_POOL_SIGNER_PDA"
```

### Expected Output

```bash
Saved Pool Signer PDA: F8QX4ZZqjV1gMwaC3erYjVXrcm9QBsSDLNiPLbFEVwH1
```

### Step 2: Delegate Token Authority

In this step, you will delegate token approval to the CCIP fee-billing signer PDA, which enables CCIP to transfer tokens on your behalf when sending cross-chain messages.

### Derive Fee-Billing Signer

```bash
# Derive the CCIP fee-billing signer PDA
export SOL_CCIP_FEE_BILLING_SIGNER=$(solana find-program-derived-address $SOL_CCIP_ROUTER string:fee_billing_signer | head -1)

echo "SOL_CCIP_FEE_BILLING_SIGNER=$SOL_CCIP_FEE_BILLING_SIGNER"
```

### Expected Output

```bash
SOL_CCIP_FEE_BILLING_SIGNER=2AjuzTy6z2webxEUu7eZ1DkAyLagZaqH2dgzhbBYjJiG
```

Approve the fee-billing signer to transfer tokens from your ATA:

### Delegate Authority

```bash
# --amount is u64 max (2^64 - 1): max delegation for CCIP fee billing
pnpm bs58 --env devnet --execute spl-token \
  --instruction approve \
  --authority $SOL_WALLET_ADDRESS \
  --mint $SOL_TOKEN_MINT \
  --delegate $SOL_CCIP_FEE_BILLING_SIGNER \
  --amount 18446744073709551615
```

### Expected Output

```bash
INFO [2026-06-14 23:19:12.715 +0530]: Starting approve command
    command: "spl-token.approve"
    mint: "6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz"
    delegate: "2AjuzTy6z2webxEUu7eZ1DkAyLagZaqH2dgzhbBYjJiG"
    authority: "GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN"
    amount: "18446744073709551615"
    globalOptions: {
      "environment": "devnet",
      "execute": true,
      "resolvedRpcUrl": "https://api.devnet.solana.com",
      "keypair": "/Users/syed-cll/.config/solana/id.json",
      "_signerKeypair": {
        "_keypair": {
          "publicKey": {
            "0": 230,
            "1": 211,
            "2": 30,
            ...
            "29": 179,
            "30": 114,
            "31": 73
          },
          "secretKey": {
            "0": 191,
            "1": 198,
            "2": 244,
            ...
            "61": 179,
            "62": 114,
            "63": 73
          }
        }
      }
    }
   ✅ Detected token program: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
🔍 Auto-deriving Associated Token Account...
   ✅ Derived ATA: 4PiwHZh1ZCcBCt6y1cDa7hvRWKmvzki4q9kQKYSvgHxK
🔄 Generating approve transaction...
   RPC URL: https://api.devnet.solana.com
   Token Program: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
   Mint: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
   Token Account: 4PiwHZh1ZCcBCt6y1cDa7hvRWKmvzki4q9kQKYSvgHxK
   Delegate: 2AjuzTy6z2webxEUu7eZ1DkAyLagZaqH2dgzhbBYjJiG
   Authority (Token Account Owner): GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
   Amount: 18446744073709551615
⚙️  Building transaction instruction...
   ✅ Instruction built successfully
🔄 Building and simulating transaction...
INFO [2026-06-14 23:19:13.071 +0530]: Detected SPL Token v1
    mint: "6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz"
    programId: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
INFO [2026-06-14 23:19:13.230 +0530]: Transaction built successfully
    instructionName: "approve"
    transactionSize: "180 bytes"
    base58Length: "245 characters"
    hexLength: "360 characters"
    accountCount: 3
    signerCount: 1
    computeUnits: 123
INFO [2026-06-14 23:19:13.230 +0530]: Completed buildTransaction (approve)
    durationMs: 158
INFO [2026-06-14 23:19:13.388 +0530]:
INFO [2026-06-14 23:19:13.388 +0530]: 🖊️  EXECUTE MODE — signing & sending on devnet
INFO [2026-06-14 23:19:13.388 +0530]:    Signer:      GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
INFO [2026-06-14 23:19:13.388 +0530]:    Instruction: approve
INFO [2026-06-14 23:19:13.388 +0530]:    RPC:         https://api.devnet.solana.com
INFO [2026-06-14 23:19:13.389 +0530]:
   ✅ Transaction simulation completed
INFO [2026-06-14 23:19:14.083 +0530]: Transaction confirmed successfully
    signature: "2VY1ELQgnfPd2PRcKgYe8Yd3HGJLLubU9F8mhd7Qv6TmWcTztFaA2Y1cyW1k75cmU9ypW7JWdjujssatb3wehe5X"
    attempt: 1
INFO [2026-06-14 23:19:14.083 +0530]:
INFO [2026-06-14 23:19:14.083 +0530]: 🎉 Transaction executed successfully!
INFO [2026-06-14 23:19:14.083 +0530]:
INFO [2026-06-14 23:19:14.083 +0530]: 📋 Execution Details:
INFO [2026-06-14 23:19:14.083 +0530]:    Instruction: approve
INFO [2026-06-14 23:19:14.083 +0530]:    Signature:   2VY1ELQgnfPd2PRcKgYe8Yd3HGJLLubU9F8mhd7Qv6TmWcTztFaA2Y1cyW1k75cmU9ypW7JWdjujssatb3wehe5X
INFO [2026-06-14 23:19:14.083 +0530]:    Explorer:    https://explorer.solana.com/tx/2VY1ELQgnfPd2PRcKgYe8Yd3HGJLLubU9F8mhd7Qv6TmWcTztFaA2Y1cyW1k75cmU9ypW7JWdjujssatb3wehe5X?cluster=devnet
INFO [2026-06-14 23:19:14.083 +0530]:
INFO [2026-06-14 23:19:14.083 +0530]: approve command completed successfully
    command: "spl-token.approve"
    transactionSize: "180 bytes"
    computeUnits: 123
```

### Step 3: Verify Delegation

Check that your token account is delegated to the fee-billing signer:

### Find Token Account

```bash
# Find your Associated Token Account (ATA) address
export SOL_TOKEN_ACCOUNT=$(spl-token accounts $SOL_TOKEN_MINT --owner $SOL_WALLET_ADDRESS --addresses-only)

echo "SOL_TOKEN_ACCOUNT=$SOL_TOKEN_ACCOUNT"
```

### Expected Output

```bash
SOL_TOKEN_ACCOUNT=4PiwHZh1ZCcBCt6y1cDa7hvRWKmvzki4q9kQKYSvgHxK
```

Display token account and delegation status:

### Check Delegation

```bash
spl-token display $SOL_TOKEN_ACCOUNT
```

### Expected Output

```bash
SPL Token Account
  Address: 4PiwHZh1ZCcBCt6y1cDa7hvRWKmvzki4q9kQKYSvgHxK
  Program: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
  Balance: 1000
  Decimals: 9
  Mint: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
  Owner: GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
  State: Initialized
  Delegation:
    Delegate: 2AjuzTy6z2webxEUu7eZ1DkAyLagZaqH2dgzhbBYjJiG
    Allowance: 18446744073.709551615
  Close authority: (not set)
```

## Phase 6: Test Cross-Chain Transfers

Validate your configuration, then execute bidirectional token transfers using the CCIP CLI.

> **NOTE: Cross-Chain Transfers with CCIP CLI**
>
> Use [`@chainlink/ccip-cli`](https://github.com/smartcontractkit/ccip-tools-ts) for bidirectional token transfers. Run Solana → EVM sends from Terminal 1 and EVM → Solana sends from Terminal 2. See the [CCIP CLI documentation](https://docs.chain.link/ccip/tools/cli/) for full options.

Confirm you are in the correct directory (Terminal 1):

```bash
pwd
# Should show: .../ccip-solana-bs58-generator
```

### Step 1: Load Complete Configuration

### Load All Variables

```bash
# Load complete configuration
source ~/.ccip_complete_vars
source ~/.phase2_vars

# Verify all variables
echo "=== Configuration Validation ==="
echo "✅ ETH Token: $ETH_TOKEN_ADDRESS"
echo "✅ ETH Pool: $ETH_POOL_ADDRESS"
echo "✅ SOL Token: $SOL_TOKEN_MINT"
echo "✅ Pool Signer PDA: $SOL_POOL_SIGNER_PDA"
echo "✅ ALT Address: $SOL_ALT_ADDRESS"
echo "✅ Wallet: $SOL_WALLET_ADDRESS"
```

### Expected Output

```bash
=== Configuration Validation ===
✅ ETH Token: 0xc06d7a73ba115b592961290c8c49760b97247676
✅ ETH Pool: 0x835f9b923858aa5aca7ac1c7389361482fc32c45
✅ SOL Token: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
✅ Pool Signer PDA: F8QX4ZZqjV1gMwaC3erYjVXrcm9QBsSDLNiPLbFEVwH1
✅ ALT Address: FpXnqRcBEFtZsRVud8R5pKuSmnGjLvRDdtSHvLx8wSSQ
✅ Wallet: GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
```

### Step 2: Verify Solana Pool and Chain Config

### Verification Commands

```bash
# Verify pool state
pnpm bs58 --env devnet burnmint-token-pool \
  --instruction get-state \
  --program-id $SOL_CCIP_POOL_PROGRAM \
  --mint $SOL_TOKEN_MINT

# Verify Ethereum Sepolia remote chain config
pnpm bs58 --env devnet burnmint-token-pool \
  --instruction get-chain-config \
  --program-id $SOL_CCIP_POOL_PROGRAM \
  --mint $SOL_TOKEN_MINT \
  --remote-chain-selector $ETH_SEPOLIA_CHAIN_SELECTOR

# Verify token balance and delegation
spl-token balance $SOL_TOKEN_MINT
```

### What to Confirm

Confirm the following:

- Pool owner matches `$SOL_WALLET_ADDRESS`
- Mint authority is the Pool Signer PDA (`$SOL_POOL_SIGNER_PDA`)
- Remote chain config includes your `$ETH_POOL_ADDRESS` and `$ETH_TOKEN_ADDRESS`
- Token delegation is set to the fee-billing signer
- Your wallet holds tokens for transfer testing

### Step 3: Verify Ethereum Pool (Terminal 2)

**Switch to Terminal 2** (Smart Contract Examples - Hardhat):

```bash
npx hardhat getPoolConfig \
  --pooladdress $ETH_POOL_ADDRESS \
  --network ethereumSepolia
```

Confirm the Ethereum pool recognizes Solana Devnet with your `$SOL_POOL_CONFIG_PDA` and `$SOL_TOKEN_MINT`.

### Configure CCIP CLI

Export these RPC URLs once before your first transfer:

```bash
export SOLANA_DEVNET_RPC="https://api.devnet.solana.com"
export ETHEREUM_SEPOLIA_RPC_URL="<YOUR_ETHEREUM_SEPOLIA_RPC_URL>"

export ETH_CCIP_ROUTER="0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59"
```

Use the same `ETHEREUM_SEPOLIA_RPC_URL` from your env-enc setup in Terminal 2 (`npx env-enc view`). On `ccip-cli send`, the source chain RPC quotes fees and submits the transaction; for token-only transfers in this tutorial, that is the only RPC strictly required to send. Pass both RPCs on cross-chain commands anyway: the destination RPC is required for `ccip-cli show --wait` and for optional send features such as `--estimate-gas-limit` or `send --wait`.

> **NOTE: RPC and wallet configuration**
>
> Repeat `--rpc` for multiple networks, or use `--rpcs` with comma-separated URLs. Alternatively, set `RPC_*` environment variables or a `.env` file — see [CCIP CLI configuration](https://docs.chain.link/ccip/tools/cli/configuration). Solana sends use `--wallet ~/.config/solana/id.json`. EVM sends: prefer `--wallet hardhat:<name>` from the Hardhat project directory ([Hardhat keystore](https://hardhat.org/docs/plugins/hardhat-keystore)); alternatively export `PRIVATE_KEY` manually after `npx env-enc view` (Hardhat tasks load env-enc automatically, but `ccip-cli` does not). See [CCIP CLI wallet configuration](https://docs.chain.link/ccip/tools/cli/configuration#wallet-configuration).

### Transfer Solana → Ethereum

**Terminal 1** (CCIP Solana BS58 Generator):

### Send Command

```bash
source ~/.ccip_complete_vars

export ETH_RECEIVER_ADDRESS="<YOUR_ETHEREUM_RECEIVER_ADDRESS>"


ccip-cli send \
  -s solana-devnet \
  -r $SOL_CCIP_ROUTER \
  -d ethereum-testnet-sepolia \
  --to $ETH_RECEIVER_ADDRESS \
  -t $SOL_TOKEN_MINT=0.001 \
  --wallet ~/.config/solana/id.json \
  --rpc $SOLANA_DEVNET_RPC \
  --rpc $ETHEREUM_SEPOLIA_RPC_URL
```

### Expected Output

```bash
Using rate-limited fetch for public solana nodes, commands may be slow
Fee: 17613485n = 0.017613485 SOL
🚀 Sending message to 0x8c244f0b2164e6a3bed74ab429b0ebd661bb14ca @ ethereum-testnet-sepolia , tx => WK3Fc9WeNEss7MnuS1XLib3vxyL4gijFA5Ph6PqrPhEGn4CXBBrstuLFirmyiQpYp2WsnFEzncFtXThn7DqNtcZ , messageId => 0xd613aacc883f19ca115d1441861b564daf7d959c6053a29d80017960d6cb1282
Using rate-limited fetch for public solana nodes, commands may be slow
Lane:
┌────────────────┬────────────────────────────────────────────────┬────────────────────────────┐
│ (index)        │ source                                         │ dest                       │
├────────────────┼────────────────────────────────────────────────┼────────────────────────────┤
│ name           │ 'solana-devnet'                                │ 'ethereum-testnet-sepolia' │
│ chainId        │ 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG' │ 11155111                   │
│ chainSelector  │ 16423721717087811551n                          │ 16015286601757825753n      │
│ onRamp/version │ 'Ccip842gzYHhvdDkSyi2YVCoAWPbYJoApMFzSxQroE9C' │ '1.6.0'                    │
└────────────────┴────────────────────────────────────────────────┴────────────────────────────┘
Request (source):
┌──────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────┐
│ (index)                  │ Values                                                                                    │
├──────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────┤
│ messageId                │ '0xd613aacc883f19ca115d1441861b564daf7d959c6053a29d80017960d6cb1282'                      │
│ origin                   │ 'GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN'                                            │
│ sender                   │ 'GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN'                                            │
│ receiver                 │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA'                                              │
│ sequenceNumber           │ 3075                                                                                      │
│ nonce                    │ '0 => allow out-of-order exec'                                                            │
│ gasLimit                 │ 0n                                                                                        │
│ transactionHash          │ 'WK3Fc9WeNEss7MnuS1XLib3vxyL4gijFA5Ph6PqrPhEGn4CXBBrstuLFirmyiQpYp2WsnFEzncFtXThn7DqNtcZ' │
│ logIndex                 │ 34                                                                                        │
│ blockNumber              │ 469435194                                                                                 │
│ timestamp                │ '2026-06-14 18:38:59 (1s ago)'                                                            │
│ finalized                │ '12s left'                                                                                │
│ fee                      │ '0.017613485 SOL'                                                                         │
│ tokens                   │ '0.001 CCIP-AEM'                                                                          │
│ data                     │ '0x'                                                                                      │
│ feeValueJuels            │ 151641396000000000n                                                                       │
│ allowOutOfOrderExecution │ true                                                                                      │
└──────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
CCIP Explorer: https://ccip.chain.link/msg/0xd613aacc883f19ca115d1441861b564daf7d959c6053a29d80017960d6cb1282
```

The `-t` flag uses human-readable amounts (0.001 tokens with 9 decimals = 1,000,000 smallest units).

### Monitor Transfer

```bash
# Replace with the transaction hash or message ID from the send output
ccip-cli show <TX_HASH_OR_MESSAGE_ID> --wait \
  --rpc $SOLANA_DEVNET_RPC \
  --rpc $ETHEREUM_SEPOLIA_RPC_URL
```

### Expected Output

```bash
Using rate-limited fetch for public solana nodes, commands may be slow
Lane:
┌────────────────┬────────────────────────────────────────────────┬────────────────────────────┐
│ (index)        │ source                                         │ dest                       │
├────────────────┼────────────────────────────────────────────────┼────────────────────────────┤
│ name           │ 'solana-devnet'                                │ 'ethereum-testnet-sepolia' │
│ chainId        │ 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG' │ 11155111                   │
│ chainSelector  │ 16423721717087811551n                          │ 16015286601757825753n      │
│ onRamp/version │ 'Ccip842gzYHhvdDkSyi2YVCoAWPbYJoApMFzSxQroE9C' │ '1.6.2'                    │
└────────────────┴────────────────────────────────────────────────┴────────────────────────────┘
Request (source):
┌────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────┐
│ (index)                            │ Values                                                                                    │
├────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────┤
│ messageId                          │ '0xd613aacc883f19ca115d1441861b564daf7d959c6053a29d80017960d6cb1282'                      │
│ origin                             │ 'GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN'                                            │
│ sender                             │ 'GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN'                                            │
│ receiver                           │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA'                                              │
│ sequenceNumber                     │ 3075                                                                                      │
│ nonce                              │ '0 => allow out-of-order exec'                                                            │
│ gasLimit                           │ 0n                                                                                        │
│ transactionHash                    │ 'WK3Fc9WeNEss7MnuS1XLib3vxyL4gijFA5Ph6PqrPhEGn4CXBBrstuLFirmyiQpYp2WsnFEzncFtXThn7DqNtcZ' │
│ logIndex                           │ 1                                                                                         │
│ blockNumber                        │ 469435194                                                                                 │
│ timestamp                          │ '2026-06-14 18:38:59 (9m28s ago)'                                                         │
│ finalized                          │ true                                                                                      │
│ fee                                │ '0.017613485 SOL'                                                                         │
│ tokens                             │ '0.001 CCIP-AEM'                                                                          │
│ fees.fixedFeesDetails.tokenAddress │ 'So11111111111111111111111111111111111111112'                                             │
│ fees.fixedFeesDetails.totalAmount  │ 17613485n                                                                                 │
│ finality                           │ 0n                                                                                        │
│ finalityType                       │ 'FINALIZED'                                                                               │
│ routerAddress                      │ 'Ccip842gzYHhvdDkSyi2YVCoAWPbYJoApMFzSxQroE9C'                                            │
│ allowOutOfOrderExecution           │ true                                                                                      │
│ status                             │ 'SUCCESS'                                                                                 │
│ readyForManualExecution            │ false                                                                                     │
│ receiptTransactionHash             │ '0x99c3eb95cf8f75279b606fce616cccb3a748e191730afa477f87a9a09bfdbbdd'                      │
│ receiptTimestamp                   │ '2026-06-14 18:40:48'                                                                     │
│ deliveryTime                       │ 109000n                                                                                   │
│ offRamp                            │ '0x0820f975ce90EE5c508657F0C58b71D1fcc85cE0'                                              │
└────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
CCIP Explorer: https://ccip.chain.link/msg/0xd613aacc883f19ca115d1441861b564daf7d959c6053a29d80017960d6cb1282
[SENT] Waiting for source chain finalization...
[SOURCE_FINALIZED] Source chain finalized
[SOURCE_FINALIZED] Waiting for commit on destination chain...
[SUCCESS] Message executed on destination chain
┌─────────────────┬──────────────────────────────────────────────────────────────────────┐
│ (index)         │ Values                                                               │
├─────────────────┼──────────────────────────────────────────────────────────────────────┤
│ state           │ '✅ success'                                                         │
│ gasUsed         │ 81076                                                                │
│ origin          │ '0xC9b457C56Cd21ec88929C49BF052b856744fAE5f'                         │
│ contract        │ '0x0820f975ce90EE5c508657F0C58b71D1fcc85cE0'                         │
│ transactionHash │ '0x99c3eb95cf8f75279b606fce616cccb3a748e191730afa477f87a9a09bfdbbdd' │
│ logIndex        │ 178                                                                  │
│ blockNumber     │ 11060184                                                             │
│ timestamp       │ '2026-06-14 18:40:48 (1m49s after request)'                          │
└─────────────────┴──────────────────────────────────────────────────────────────────────┘
```

### Transfer Ethereum → Solana

**Switch to Terminal 2** (Smart Contract Examples - Hardhat):

`ccip-cli` does not load Hardhat env-enc automatically. Run these commands from the Hardhat project directory. Prefer [Hardhat keystore](https://hardhat.org/docs/plugins/hardhat-keystore) over exporting a private key in plain text.

### Hardhat keystore (Recommended)

```bash
source ~/.ccip_complete_vars

ccip-cli send \
  -s ethereum-testnet-sepolia \
  -r $ETH_CCIP_ROUTER \
  -d solana-devnet \
  --to $SOL_WALLET_ADDRESS \
  -t $ETH_TOKEN_ADDRESS=1.0 \
  --wallet hardhat:<YOUR_KEYSTORE_ACCOUNT_NAME> \
  --rpc $ETHEREUM_SEPOLIA_RPC_URL \
  --rpc $SOLANA_DEVNET_RPC
```

Use the keystore account name from your Hardhat project (see [Hardhat keystore](https://hardhat.org/docs/plugins/hardhat-keystore)). This keeps the signing key encrypted instead of in shell history.

### PRIVATE\_KEY (Alternative)

```bash
source ~/.ccip_complete_vars

# ccip-cli does not read env-enc — view and export the same key used in Phase 1
npx env-enc view
export PRIVATE_KEY="<YOUR_PRIVATE_KEY_FROM_ENV_ENC>"

ccip-cli send \
  -s ethereum-testnet-sepolia \
  -r $ETH_CCIP_ROUTER \
  -d solana-devnet \
  --to $SOL_WALLET_ADDRESS \
  -t $ETH_TOKEN_ADDRESS=1.0 \
  --rpc $ETHEREUM_SEPOLIA_RPC_URL \
  --rpc $SOLANA_DEVNET_RPC
```

Do not commit or share the exported key. Prefer the Hardhat keystore tab for production-like workflows.

For token-only transfers to Solana, `--to` is the destination wallet that receives minted tokens. CCIP fees are paid in native Sepolia ETH by default — ensure your wallet has sufficient ETH for gas and fees.

> **NOTE: Pay fees in LINK (optional)**
>
> Add `--fee-token LINK` to pay CCIP fees in LINK instead of ETH (Sepolia LINK:
> `0x779877A7B0D9E8603169DdbD7836e478b4624789`).

### Monitor Transfer

```bash
ccip-cli show <TX_HASH_OR_MESSAGE_ID> --wait \
  --rpc $ETHEREUM_SEPOLIA_RPC_URL \
  --rpc $SOLANA_DEVNET_RPC
```

### Expected Output

```bash
Lane:
┌────────────────┬──────────────────────────────────────────────┬────────────────────────────────────────────────┐
│ (index)        │ source                                       │ dest                                           │
├────────────────┼──────────────────────────────────────────────┼────────────────────────────────────────────────┤
│ name           │ 'ethereum-testnet-sepolia'                   │ 'solana-devnet'                                │
│ chainId        │ 11155111                                     │ 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG' │
│ chainSelector  │ 16015286601757825753n                        │ 16423721717087811551n                          │
│ onRamp/version │ '0x23a5084Fa78104F3DF11C63Ae59fcac4f6AD9DeE' │ '1.6.0'                                        │
└────────────────┴──────────────────────────────────────────────┴────────────────────────────────────────────────┘
Request (source):
┌────────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────┐
│ (index)                            │ Values                                                                                     │
├────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ messageId                          │ '0x057a43d38b53bb700ffee472eec7a1c07ce7c9b7e61b8715401093f148e8084f'                       │
│ origin                             │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA'                                               │
│ sender                             │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA'                                               │
│ receiver                           │ '11111111111111111111111111111111'                                                         │
│ sequenceNumber                     │ 10198                                                                                      │
│ nonce                              │ '0 => allow out-of-order exec'                                                             │
│ computeUnits                       │ 0n                                                                                         │
│ transactionHash                    │ '0x3857e86ca668dd5b73ee24792cf4197a485fe7b48fa82b7d0b77a7a43be6fc95'                       │
│ logIndex                           │ 222                                                                                        │
│ blockNumber                        │ 11061690                                                                                   │
│ timestamp                          │ '2026-06-14 23:42:24 (16m12s ago)'                                                         │
│ finalized                          │ true                                                                                       │
│ fee                                │ '0.000348842365648143 WETH'                                                                │
│ tokens                             │ '1.0 BnMAEM'                                                                               │
│ accounts                           │ undefined                                                                                  │
│ fees.fixedFeesDetails.tokenAddress │ '0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534'                                               │
│ fees.fixedFeesDetails.totalAmount  │ 348842365648143n                                                                           │
│ finality                           │ 0n                                                                                         │
│ finalityType                       │ 'FINALIZED'                                                                                │
│ routerAddress                      │ '0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59'                                               │
│ accountIsWritableBitmap            │ 0n                                                                                         │
│ allowOutOfOrderExecution           │ true                                                                                       │
│ tokenReceiver                      │ 'GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN'                                             │
│ status                             │ 'SUCCESS'                                                                                  │
│ readyForManualExecution            │ false                                                                                      │
│ receiptTransactionHash             │ '2jH2XxNGYCJj3K9iUu9yErPxUEGJmgSFsLDy5NbQcXjDvmWZTbw2ivQagxnQvY3wnz4YyRMWVYoEeJHTZ5CAAFUM' │
│ receiptTimestamp                   │ '2026-06-14 23:56:22'                                                                      │
│ deliveryTime                       │ 838000n                                                                                    │
│ offRamp                            │ 'offqSMQWgQud6WJz694LRzkeN5kMYpCHTpXQr3Rkcjm'                                              │
└────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────┘
CCIP Explorer: https://ccip.chain.link/msg/0x057a43d38b53bb700ffee472eec7a1c07ce7c9b7e61b8715401093f148e8084f
[SENT] Waiting for source chain finalization...
Using rate-limited fetch for public solana nodes, commands may be slow
[SOURCE_FINALIZED] Source chain finalized
[SOURCE_FINALIZED] Waiting for commit on destination chain...
[SUCCESS] Message executed on destination chain
┌─────────────────┬────────────────────────────────────────────────────────────────────────────────────────────┐
│ (index)         │ Values                                                                                     │
├─────────────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ state           │ '✅ success'                                                                               │
│ origin          │ 'Ha3SzUZBDhrxJBz7BmDAiKfhSAkpSSAnJ9bYH3vib6Bs'                                             │
│ contract        │ 'offqSMQWgQud6WJz694LRzkeN5kMYpCHTpXQr3Rkcjm'                                              │
│ transactionHash │ '2jH2XxNGYCJj3K9iUu9yErPxUEGJmgSFsLDy5NbQcXjDvmWZTbw2ivQagxnQvY3wnz4YyRMWVYoEeJHTZ5CAAFUM' │
│ logIndex        │ 23                                                                                         │
│ blockNumber     │ 469485513                                                                                  │
│ timestamp       │ '2026-06-14 23:56:22 (14m after request)'                                                  │
└─────────────────┴────────────────────────────────────────────────────────────────────────────────────────────┘
```

**Congratulations!** Your cross-chain token infrastructure is fully configured on both chains.

## Reference: Verification Commands

Use these commands to verify your setup at any point during the tutorial. Each section focuses on a specific component of your cross-chain configuration.

### Solana Pool Verification

**Terminal 1** (CCIP Solana BS58 Generator)

```bash
# Verify pool configuration and status
pnpm bs58 --env devnet burnmint-token-pool \
  --instruction get-state \
  --program-id $SOL_CCIP_POOL_PROGRAM \
  --mint $SOL_TOKEN_MINT
```

**What this shows:**

- Pool configuration details
- Pool signer PDA information
- Token account balances
- Pool operational status

### Solana Chain Configuration

**Terminal 1** (CCIP Solana BS58 Generator)

```bash
# Verify cross-chain configuration with Ethereum Sepolia
pnpm bs58 --env devnet burnmint-token-pool \
  --instruction get-chain-config \
  --program-id $SOL_CCIP_POOL_PROGRAM \
  --mint $SOL_TOKEN_MINT \
  --remote-chain-selector $ETH_SEPOLIA_CHAIN_SELECTOR
```

**What this shows:**

- Remote chain configuration
- Token address mappings
- Pool address mappings
- Cross-chain connectivity status

### Solana Token Balance

**Terminal 1** (CCIP Solana BS58 Generator)

```bash
# Check your token balance
spl-token balance $SOL_TOKEN_MINT
```

**What this shows:**

- Current token balance in your wallet
- Token account details
- Delegation status

### Ethereum Pool Verification

**Terminal 2 (Smart Contract Examples)**

```bash
# Verify Ethereum pool configuration
npx hardhat getPoolConfig \
  --pooladdress $ETH_POOL_ADDRESS \
  --network ethereumSepolia
```

**What this shows:**

- Pool contract configuration
- Remote chain settings
- Rate limiting parameters
- Pool operational status

### Cross-Chain Transfer Status

**Both Terminals**

```bash
# Monitor CCIP message status (replace with your message ID)
# From the transfer output, look for: "Message ID: 0x..."
# Then visit: https://ccip.chain.link/msg/0x...
```

**What this shows:**

- Transfer execution status
- Cross-chain message progress
- Completion confirmation
- Error details (if any)

> **CAUTION: Educational Example Disclaimer**
>
> This page includes an educational example to use a Chainlink system, product, or service and is provided to
> demonstrate how to interact with Chainlink's systems, products, and services to integrate them into your own. This
> template is provided "AS IS" and "AS AVAILABLE" without warranties of any kind, it has not been audited, and it may be
> missing key checks or error handling to make the usage of the system, product or service more clear. Do not use the
> code in this example in a production environment without completing your own audits and application of best practices.
> Neither Chainlink Labs, the Chainlink Foundation, nor Chainlink node operators are responsible for unintended outputs
> that are generated due to errors in code.