Cross-Chain Token Setup: BurnMint with Direct Mint Authority Transfer
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.
What You Will Build
This tutorial implements the direct mint authority transfer variant of Path A from the CCIP Cross-Chain Token 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 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:
- Source Chain: Burns tokens from sender's account
- CCIP Protocol: Transmits message cross-chain
- 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.
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 recommended) - pnpm: Required for the BS58 generator (
npm install -g pnpm) - Solana CLI: Installation guide (includes
spl-token) - Git: For cloning repositories
- CCIP CLI: For cross-chain transfer testing in the final phase
Install the CCIP CLI globally:
npm install -g @chainlink/ccip-cli
ccip-cli --help
See the CCIP CLI documentation for RPC and wallet configuration.
Tutorial Workflow
| Terminal | Repository | Purpose | Commands |
|---|---|---|---|
| Terminal 1 | CCIP Solana BS58 Generator | Solana setup and configuration | pnpm bs58 |
| Terminal 2 | Smart Contract Examples (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):
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:
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 below.
Otherwise, run only the steps you need:
# 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
Terminal 2: Smart Contract Examples (Hardhat)
Clone, install, and compile (skip git clone if you already have the repo):
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:
# 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 or InfuraPRIVATE_KEY: Your testnet wallet private key (MetaMask export guide)ETHERSCAN_API_KEY: API key from Etherscan
Fund your EVM wallet:
- Acquire ETH on Ethereum Sepolia for transaction gas and CCIP fees (Chainlink faucet or Google Cloud Faucet)
- LINK is optional — use
--fee-token LINKon 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) so the signing key stays encrypted. Hardhat tasks load env-enc automatically;ccip-clidoes not. As an alternative, view the same key withnpx env-enc viewand exportPRIVATE_KEYmanually for the send command.
RPC endpoints (required for source and destination chains). You can provide them any of these ways — see CCIP CLI configuration:
- Command line: pass
--rpcon each command (repeat for multiple networks), or--rpcswith comma-separated URLs - Environment variables: export
RPC_*variables (e.g.,RPC_SEPOLIA,RPC_SOLANA_DEVNET) or the tutorial'sSOLANA_DEVNET_RPCandETHEREUM_SEPOLIA_RPC_URLexports - File: create a
.envfile in the directory where you runccip-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 |
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: Solana CLI command details,
--executeEOA workflow, and options - Smart Contract Examples README: 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.
Step 1: Deploy ERC20 Token
Deploy a burnable and mintable ERC20 token that will serve as your cross-chain asset:
# Deploy BurnMint ERC20 token with verification
npx hardhat deployToken \
--name "BnM Cross-Chain Token" \
--symbol "BnMAEM" \
--decimals 18 \
--verifycontract \
--network ethereumSepolia
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
This command:
- Deploys a BurnMintERC20 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:
# REPLACE with your actual deployed token address
export ETH_TOKEN_ADDRESS="<INSERT_YOUR_TOKEN_ADDRESS_HERE>"
Verify it's set correctly:
echo "Ethereum Token: $ETH_TOKEN_ADDRESS"
Ethereum Token: 0xc06d7a73ba115b592961290c8c49760b97247676
Step 2: Deploy BurnMint Token Pool
Deploy a CCIP token pool that will manage burning and minting operations:
# Deploy BurnMint pool for your token
npx hardhat deployTokenPool \
--tokenaddress $ETH_TOKEN_ADDRESS \
--localtokendecimals 18 \
--pooltype burnMint \
--verifycontract \
--network ethereumSepolia
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
This command:
- Deploys a BurnMintTokenPool 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:
# REPLACE with your actual deployed pool address
export ETH_POOL_ADDRESS="<INSERT_YOUR_POOL_ADDRESS_HERE>"
Verify both addresses are set:
echo "Ethereum Token: $ETH_TOKEN_ADDRESS"
echo "Ethereum Pool: $ETH_POOL_ADDRESS"
Ethereum Token: 0xc06d7a73ba115b592961290c8c49760b97247676
Ethereum Pool: 0x835f9b923858aa5aca7ac1c7389361482fc32c45
Step 3: Mint Initial Token Supply
Mint tokens to your wallet for testing cross-chain transfers:
# Mint 1000 tokens (with 18 decimals)
npx hardhat mintTokens \
--tokenaddress $ETH_TOKEN_ADDRESS \
--amount 1000000000000000000000 \
--network ethereumSepolia
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 admin role for your token
npx hardhat claimAdmin \
--tokenaddress $ETH_TOKEN_ADDRESS \
--network ethereumSepolia
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)
This command:
- Calls the RegistryModuleOwnerCustom 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 the admin role to finalize
npx hardhat acceptAdminRole \
--tokenaddress $ETH_TOKEN_ADDRESS \
--network ethereumSepolia
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 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"
=== 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.
Step 1: Prepare Environment
Load EVM variables from Phase 1 and set Solana CCIP constants:
# 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"
✅ 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 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
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:
# Copy the mint address from the command output above
export SOL_TOKEN_MINT="<INSERT_YOUR_MINT_ADDRESS_HERE>"
Verify the variables:
echo "Solana Token Mint: $SOL_TOKEN_MINT"
echo "Solana pool program: $SOL_CCIP_POOL_PROGRAM"
Solana Token Mint: 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
CCIP Pool Program: 41FGToCmdaWa1dgZLKFAjvmx6e6AjVTX7SVRibvsMGVB
Step 3: Initialize CCIP Token Pool
Initialize the token pool configuration on Solana:
# 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
🔄 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]:
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.
Save the Pool Signer PDA and Pool Config PDA. Derive them from the onchain pool configuration:
# 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
🔍 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:
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:
echo "Pool Signer PDA: $SOL_POOL_SIGNER_PDA"
echo "Pool Config PDA: $SOL_POOL_CONFIG_PDA"
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 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
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 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
🔄 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 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
🔄 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
# Transfer mint authority to Pool Signer PDA
spl-token authorize $SOL_TOKEN_MINT mint $SOL_POOL_SIGNER_PDA
Updating 6bqTkW43Xchd638N4EKymyVecSLVmVhwULHFw5R4hkz
Current mint: GY3V5RAtSxoJf2dZGqAbzaSxDyXWb8RPMWQdv1mC5PXN
New mint: F8QX4ZZqjV1gMwaC3erYjVXrcm9QBsSDLNiPLbFEVwH1
Signature: 5zD2r6aMiijkQTuanvPQw9QSeJbqdTcT48ueafDEK1YcoNiQMrnbbdb5gZ8rZ6zGay12y6jyYmhMgRCABLtajyT7
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 that maintain administrative control while enabling autonomous CCIP operations.
Verify the authority transfer:
spl-token display $SOL_TOKEN_MINT
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 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"
=== 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
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"
✅ 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 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
🔄 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 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
🔄 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)
pwd
# Should output: ../smart-contract-examples/ccip/cct/hardhat
Load Variables from Previous Phases
Load all variables needed for EVM cross-chain configuration:
# 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"
✅ 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.
# 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
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)
pwd
# Should output: ../smart-contract-examples/ccip/cct/hardhat
Register the BurnMint token pool with your token in the TokenAdminRegistry:
# Register the pool with your token
npx hardhat setPool \
--tokenaddress $ETH_TOKEN_ADDRESS \
--pooladdress $ETH_POOL_ADDRESS \
--network ethereumSepolia
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)
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)
pwd
# Should show: .../ccip-solana-bs58-generator
Load variables from previous phases:
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 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
🔄 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]:
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:
Replace with your ALT address from the output:
export SOL_ALT_ADDRESS="<INSERT_YOUR_ALT_ADDRESS>"
Verify the ALT address is set correctly:
echo "ALT Address: $SOL_ALT_ADDRESS"
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 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]"
🔄 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 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"
=== 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:
# 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
🔍 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:
echo "Saved Pool Signer PDA: $SOL_POOL_SIGNER_PDA"
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 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"
SOL_CCIP_FEE_BILLING_SIGNER=2AjuzTy6z2webxEUu7eZ1DkAyLagZaqH2dgzhbBYjJiG
Approve the fee-billing signer to transfer tokens from your ATA:
# --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
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 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"
SOL_TOKEN_ACCOUNT=4PiwHZh1ZCcBCt6y1cDa7hvRWKmvzki4q9kQKYSvgHxK
Display token account and delegation status:
spl-token display $SOL_TOKEN_ACCOUNT
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.
Confirm you are in the correct directory (Terminal 1):
pwd
# Should show: .../ccip-solana-bs58-generator
Step 1: Load Complete Configuration
# 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"
=== 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
# 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
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_ADDRESSand$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):
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:
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.
Transfer Solana → Ethereum
Terminal 1 (CCIP Solana BS58 Generator):
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
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).
# 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
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 over exporting a private key in plain text.
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). This keeps the signing key encrypted instead of in shell history.
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.
ccip-cli show <TX_HASH_OR_MESSAGE_ID> --wait \
--rpc $ETHEREUM_SEPOLIA_RPC_URL \
--rpc $SOLANA_DEVNET_RPC
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)
# 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)
# 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)
# 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)
# 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
# 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)