Skip to main content
The cctp sub-client enables cross-chain USDC transfers using Circle’s Cross-Chain Transfer Protocol (CCTP). This allows GLAM vaults to bridge USDC between Solana and EVM chains.

Bridge USDC (Outgoing)

Send USDC from the vault on Solana to a destination on another chain:
import { GlamClient } from "@glamsystems/glam-sdk";
import { PublicKey } from "@solana/web3.js";
import { BN } from "@coral-xyz/anchor";

const glamClient = new GlamClient();

const txSig = await glamClient.cctp.bridgeUsdc(
  new BN(1_000_000), // 1 USDC (6 decimals)
  0, // destination domain (0 = Ethereum)
  new PublicKey("EvmAddr1111111111111111111111111"), // destination address as PublicKey
  {
    maxFee: new BN(500_000), // max fee in USDC units
    minFinalityThreshold: 1000,
  },
);

CCTP Domain IDs

Domain IDChain
0Ethereum
1Avalanche
2Optimism
3Arbitrum
5Solana
6Base
7Polygon

Receive USDC (Incoming)

Receive USDC from another chain into the vault. You need either the source transaction hash or nonce:
// Receive using transaction hash
const txSig = await glamClient.cctp.receiveUsdc(
  0, // source domain (Ethereum)
  { txHash: "0xabc123..." },
);

// Receive using nonce
const txSig = await glamClient.cctp.receiveUsdc(
  0,
  { nonce: "0x..." },
);

Query Bridge Events

Outgoing Events

Get all Solana-to-EVM bridge events for the vault:
const events = await glamClient.cctp.getOutgoingBridgeEvents({
  commitment: "confirmed",
});

for (const event of events) {
  console.log(event.amount.toString(), event.destinationDomain, event.status);
}

Incoming Events

Get all EVM-to-Solana bridge events for the vault:
const events = await glamClient.cctp.getIncomingBridgeEvents({
  commitment: "confirmed",
});