Skip to main content
Version: 1.0.0

Class: SolanaChain

Defined in: solana/index.ts:197

Solana chain implementation supporting Solana networks.

Provides methods for sending CCIP cross-chain messages, querying message status, fetching fee quotes, and manually executing pending messages on Solana networks.

Remarks

Solana uses CCIP v1.6+ protocol only.

Examples

TypeScript
import { SolanaChain } from '@chainlink/ccip-sdk'

const chain = await SolanaChain.fromUrl('https://api.devnet.solana.com')
console.log(`Connected to: ${chain.network.name}`)
TypeScript
const requests = await chain.getMessagesInTx('5abc123...')
for (const req of requests) {
console.log(`Message ID: ${req.message.messageId}`)
}

Extends

Indexable

[key: symbol]: () => string

Constructors

Constructor

new SolanaChain(connection: Connection, network: NetworkInfo, ctx?: ChainContext): SolanaChain

Defined in: solana/index.ts:214

Creates a new SolanaChain instance.

Parameters

ParameterTypeDescription
connectionConnectionSolana connection instance.
networkNetworkInfoNetwork information for this chain.
ctx?ChainContext-

Returns

SolanaChain

Overrides

Chain<typeof ChainFamily.Solana>.constructor

Properties

apiClient

readonly apiClient: CCIPAPIClient | null

Defined in: chain.ts:339

CCIP API client (null if opted out)

Inherited from

Chain.apiClient


apiRetryConfig

readonly apiRetryConfig: Required<ApiRetryConfig> | null

Defined in: chain.ts:341

Retry configuration for API fallback operations (null if API client is disabled)

Inherited from

Chain.apiRetryConfig


commitment

commitment: Commitment = 'confirmed'

Defined in: solana/index.ts:206


connection

connection: Connection

Defined in: solana/index.ts:205


destroy$

readonly destroy$: Promise<void>

Defined in: solana/index.ts:207


logger

logger: Logger

Defined in: chain.ts:337

Inherited from

Chain.logger


network

readonly network: NetworkInfo<"SVM">

Defined in: chain.ts:336

Inherited from

Chain.network


decimals

readonly static decimals: 9 = 9

Defined in: solana/index.ts:203


family

readonly static family: "SVM" = ChainFamily.Solana

Defined in: solana/index.ts:202

Methods

_fetchTokenMetadata()

_fetchTokenMetadata(mintPublicKey: PublicKey): Promise<{ name: string; symbol: string; } | null>

Defined in: solana/index.ts:704

Fetches token metadata from Metaplex.

Parameters

ParameterTypeDescription
mintPublicKeyPublicKeyToken mint public key.

Returns

Promise<{ name: string; symbol: string; } | null>

Token name and symbol, or null if not found.


_getRouterConfig()

_getRouterConfig(router: string): Promise<DecodeStruct<{ fields: [{ name: "version"; type: "u8"; }, { name: "defaultCodeVersion"; type: { defined: "CodeVersion"; }; }, { name: "svmChainSelector"; type: "u64"; }, { name: "owner"; type: "publicKey"; }, { name: "proposedOwner"; type: "publicKey"; }, { name: "feeQuoter"; type: "publicKey"; }, { name: "rmnRemote"; type: "publicKey"; }, { name: "linkTokenMint"; type: "publicKey"; }, { name: "feeAggregator"; type: "publicKey"; }]; kind: "struct"; }, RecursiveDepth4<[{ name: "RampMessageHeader"; type: { fields: [{ name: "messageId"; type: { array: ["u8", 32]; }; }, { name: "sourceChainSelector"; type: "u64"; }, { name: "destChainSelector"; type: "u64"; }, { name: "sequenceNumber"; type: "u64"; }, { name: "nonce"; type: "u64"; }]; kind: "struct"; }; }, { name: "SVM2AnyRampMessage"; type: { fields: [{ name: "header"; type: { defined: "RampMessageHeader"; }; }, { name: "sender"; type: "publicKey"; }, { name: "data"; type: "bytes"; }, { name: "receiver"; type: "bytes"; }, { name: "extraArgs"; type: "bytes"; }, { name: "feeToken"; type: "publicKey"; }, { name: "tokenAmounts"; type: { vec: { defined: "SVM2AnyTokenTransfer"; }; }; }, { name: "feeTokenAmount"; type: { defined: "CrossChainAmount"; }; }, { name: "feeValueJuels"; type: { defined: "CrossChainAmount"; }; }]; kind: "struct"; }; }, { name: "SVM2AnyTokenTransfer"; type: { fields: [{ name: "sourcePoolAddress"; type: "publicKey"; }, { name: "destTokenAddress"; type: "bytes"; }, { name: "extraData"; type: "bytes"; }, { name: "amount"; type: { defined: "CrossChainAmount"; }; }, { name: "destExecData"; type: "bytes"; }]; kind: "struct"; }; }], DecodedHelper<[{ name: "RampMessageHeader"; type: { fields: [{ name: "messageId"; type: { array: [..., ...]; }; }, { name: "sourceChainSelector"; type: "u64"; }, { name: "destChainSelector"; type: "u64"; }, { name: "sequenceNumber"; type: "u64"; }, { name: "nonce"; type: "u64"; }]; kind: "struct"; }; }, { name: "SVM2AnyRampMessage"; type: { fields: [{ name: "header"; type: { defined: "RampMessageHeader"; }; }, { name: "sender"; type: "publicKey"; }, { name: "data"; type: "bytes"; }, { name: "receiver"; type: "bytes"; }, { name: "extraArgs"; type: "bytes"; }, { name: "feeToken"; type: "publicKey"; }, { name: "tokenAmounts"; type: { vec: { defined: ...; }; }; }, { name: "feeTokenAmount"; type: { defined: "CrossChainAmount"; }; }, { name: "feeValueJuels"; type: { defined: "CrossChainAmount"; }; }]; kind: "struct"; }; }, { name: "SVM2AnyTokenTransfer"; type: { fields: [{ name: "sourcePoolAddress"; type: "publicKey"; }, { name: "destTokenAddress"; type: "bytes"; }, { name: "extraData"; type: "bytes"; }, { name: "amount"; type: { defined: "CrossChainAmount"; }; }, { name: "destExecData"; type: "bytes"; }]; kind: "struct"; }; }], DecodedHelper<[{ name: "RampMessageHeader"; type: { fields: [{ name: "messageId"; type: { array: ...; }; }, { name: "sourceChainSelector"; type: "u64"; }, { name: "destChainSelector"; type: "u64"; }, { name: "sequenceNumber"; type: "u64"; }, { name: "nonce"; type: "u64"; }]; kind: "struct"; }; }, { name: "SVM2AnyRampMessage"; type: { fields: [{ name: "header"; type: { defined: ...; }; }, { name: "sender"; type: "publicKey"; }, { name: "data"; type: "bytes"; }, { name: "receiver"; type: "bytes"; }, { name: "extraArgs"; type: "bytes"; }, { name: "feeToken"; type: "publicKey"; }, { name: "tokenAmounts"; type: { vec: ...; }; }, { name: "feeTokenAmount"; type: { defined: ...; }; }, { name: "feeValueJuels"; type: { defined: ...; }; }]; kind: "struct"; }; }, { name: "SVM2AnyTokenTransfer"; type: { fields: [{ name: "sourcePoolAddress"; type: "publicKey"; }, { name: "destTokenAddress"; type: "bytes"; }, { name: "extraData"; type: "bytes"; }, { name: "amount"; type: { defined: ...; }; }, { name: "destExecData"; type: "bytes"; }]; kind: "struct"; }; }], DecodedHelper<[{ name: "RampMessageHeader"; type: { fields: [{ name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }]; kind: "struct"; }; }, { name: "SVM2AnyRampMessage"; type: { fields: [{ name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }]; kind: "struct"; }; }, { name: "SVM2AnyTokenTransfer"; type: { fields: [{ name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }]; kind: "struct"; }; }], EmptyDefined>>>>>>

Defined in: solana/index.ts:1570

Gets the router configuration from the Config PDA.

Parameters

ParameterTypeDescription
routerstringRouter program address.

Returns

Promise<DecodeStruct<{ fields: [{ name: "version"; type: "u8"; }, { name: "defaultCodeVersion"; type: { defined: "CodeVersion"; }; }, { name: "svmChainSelector"; type: "u64"; }, { name: "owner"; type: "publicKey"; }, { name: "proposedOwner"; type: "publicKey"; }, { name: "feeQuoter"; type: "publicKey"; }, { name: "rmnRemote"; type: "publicKey"; }, { name: "linkTokenMint"; type: "publicKey"; }, { name: "feeAggregator"; type: "publicKey"; }]; kind: "struct"; }, RecursiveDepth4<[{ name: "RampMessageHeader"; type: { fields: [{ name: "messageId"; type: { array: ["u8", 32]; }; }, { name: "sourceChainSelector"; type: "u64"; }, { name: "destChainSelector"; type: "u64"; }, { name: "sequenceNumber"; type: "u64"; }, { name: "nonce"; type: "u64"; }]; kind: "struct"; }; }, { name: "SVM2AnyRampMessage"; type: { fields: [{ name: "header"; type: { defined: "RampMessageHeader"; }; }, { name: "sender"; type: "publicKey"; }, { name: "data"; type: "bytes"; }, { name: "receiver"; type: "bytes"; }, { name: "extraArgs"; type: "bytes"; }, { name: "feeToken"; type: "publicKey"; }, { name: "tokenAmounts"; type: { vec: { defined: "SVM2AnyTokenTransfer"; }; }; }, { name: "feeTokenAmount"; type: { defined: "CrossChainAmount"; }; }, { name: "feeValueJuels"; type: { defined: "CrossChainAmount"; }; }]; kind: "struct"; }; }, { name: "SVM2AnyTokenTransfer"; type: { fields: [{ name: "sourcePoolAddress"; type: "publicKey"; }, { name: "destTokenAddress"; type: "bytes"; }, { name: "extraData"; type: "bytes"; }, { name: "amount"; type: { defined: "CrossChainAmount"; }; }, { name: "destExecData"; type: "bytes"; }]; kind: "struct"; }; }], DecodedHelper<[{ name: "RampMessageHeader"; type: { fields: [{ name: "messageId"; type: { array: [..., ...]; }; }, { name: "sourceChainSelector"; type: "u64"; }, { name: "destChainSelector"; type: "u64"; }, { name: "sequenceNumber"; type: "u64"; }, { name: "nonce"; type: "u64"; }]; kind: "struct"; }; }, { name: "SVM2AnyRampMessage"; type: { fields: [{ name: "header"; type: { defined: "RampMessageHeader"; }; }, { name: "sender"; type: "publicKey"; }, { name: "data"; type: "bytes"; }, { name: "receiver"; type: "bytes"; }, { name: "extraArgs"; type: "bytes"; }, { name: "feeToken"; type: "publicKey"; }, { name: "tokenAmounts"; type: { vec: { defined: ...; }; }; }, { name: "feeTokenAmount"; type: { defined: "CrossChainAmount"; }; }, { name: "feeValueJuels"; type: { defined: "CrossChainAmount"; }; }]; kind: "struct"; }; }, { name: "SVM2AnyTokenTransfer"; type: { fields: [{ name: "sourcePoolAddress"; type: "publicKey"; }, { name: "destTokenAddress"; type: "bytes"; }, { name: "extraData"; type: "bytes"; }, { name: "amount"; type: { defined: "CrossChainAmount"; }; }, { name: "destExecData"; type: "bytes"; }]; kind: "struct"; }; }], DecodedHelper<[{ name: "RampMessageHeader"; type: { fields: [{ name: "messageId"; type: { array: ...; }; }, { name: "sourceChainSelector"; type: "u64"; }, { name: "destChainSelector"; type: "u64"; }, { name: "sequenceNumber"; type: "u64"; }, { name: "nonce"; type: "u64"; }]; kind: "struct"; }; }, { name: "SVM2AnyRampMessage"; type: { fields: [{ name: "header"; type: { defined: ...; }; }, { name: "sender"; type: "publicKey"; }, { name: "data"; type: "bytes"; }, { name: "receiver"; type: "bytes"; }, { name: "extraArgs"; type: "bytes"; }, { name: "feeToken"; type: "publicKey"; }, { name: "tokenAmounts"; type: { vec: ...; }; }, { name: "feeTokenAmount"; type: { defined: ...; }; }, { name: "feeValueJuels"; type: { defined: ...; }; }]; kind: "struct"; }; }, { name: "SVM2AnyTokenTransfer"; type: { fields: [{ name: "sourcePoolAddress"; type: "publicKey"; }, { name: "destTokenAddress"; type: "bytes"; }, { name: "extraData"; type: "bytes"; }, { name: "amount"; type: { defined: ...; }; }, { name: "destExecData"; type: "bytes"; }]; kind: "struct"; }; }], DecodedHelper<[{ name: "RampMessageHeader"; type: { fields: [{ name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }]; kind: "struct"; }; }, { name: "SVM2AnyRampMessage"; type: { fields: [{ name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }]; kind: "struct"; }; }, { name: "SVM2AnyTokenTransfer"; type: { fields: [{ name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }, { name: ...; type: ...; }]; kind: "struct"; }; }], EmptyDefined>>>>>>

Router configuration including feeQuoter.


cleanUpBuffers()

cleanUpBuffers(opts: { waitDeactivation?: boolean; wallet: unknown; }): Promise<void>

Defined in: solana/index.ts:1188

Clean up and recycle buffers and address lookup tables owned by wallet

Parameters

ParameterTypeDescription
opts{ waitDeactivation?: boolean; wallet: unknown; }cleanUp options - wallet - wallet instance to sign txs - waitDeactivation - Whether to wait for lookup table deactivation cool down period (513 slots) to pass before closing; by default, we deactivate (if needed) and move on, to close other ready ALTs
opts.waitDeactivation?boolean-
opts.walletunknown-

Returns

Promise<void>

Throws

CCIPWalletInvalidError if wallet is not a valid Solana wallet


destroy()?

optional destroy(): void | Promise<void>

Defined in: chain.ts:375

Cleanup method to release resources (e.g., close connections).

Returns

void | Promise<void>

Inherited from

Chain.destroy


estimateReceiveExecution()?

optional estimateReceiveExecution(opts: { message: { data?: BytesLike; destTokenAmounts?: readonly { amount: bigint; token: string; }[]; messageId: string; sender?: string; sourceChainSelector: bigint; }; offRamp: string; receiver: string; }): Promise<number>

Defined in: chain.ts:1347

Estimate ccipReceive execution cost (gas, computeUnits) for this dest

Parameters

ParameterTypeDescription
opts{ message: { data?: BytesLike; destTokenAmounts?: readonly { amount: bigint; token: string; }[]; messageId: string; sender?: string; sourceChainSelector: bigint; }; offRamp: string; receiver: string; }estimation options
opts.message{ data?: BytesLike; destTokenAmounts?: readonly { amount: bigint; token: string; }[]; messageId: string; sender?: string; sourceChainSelector: bigint; }-
opts.message.data?BytesLike-
opts.message.destTokenAmounts?readonly { amount: bigint; token: string; }[]-
opts.message.messageIdstring-
opts.message.sender?string-
opts.message.sourceChainSelectorbigint-
opts.offRampstring-
opts.receiverstring-

Returns

Promise<number>

estimated execution cost (gas or computeUnits)

Inherited from

Chain.estimateReceiveExecution


execute()

execute(opts: ExecuteOpts & { wallet: unknown; } & { waitDeactivation?: boolean; }): Promise<CCIPExecution>

Defined in: solana/index.ts:1138

Execute messages in report in an offRamp.

Parameters

ParameterTypeDescription
optsExecuteOpts & { wallet: unknown; } & { waitDeactivation?: boolean; }ExecuteOpts with chain-specific wallet to sign and send tx

Returns

Promise<CCIPExecution>

Promise resolving to transaction of the execution

Throws

CCIPWalletInvalidError if wallet is not a valid Solana wallet

Overrides

Chain.execute


generateUnsignedExecute()

generateUnsignedExecute(__namedParameters: ExecuteOpts & { payer: string; }): Promise<UnsignedSolanaTx>

Defined in: solana/index.ts:1117

Generate unsigned tx to manuallyExecute a message.

Parameters

ParameterTypeDescription
__namedParametersExecuteOpts & { payer: string; }ExecuteOpts with payer address which will send the exec tx

Returns

Promise<UnsignedSolanaTx>

Promise resolving to chain-family specific unsigned txs

Throws

CCIPExecutionReportChainMismatchError if message is not a Solana message

Overrides

Chain.generateUnsignedExecute


generateUnsignedSendMessage()

generateUnsignedSendMessage(opts: SendMessageOpts & { sender: string; }): Promise<UnsignedSolanaTx>

Defined in: solana/index.ts:1071

Generate unsigned txs for ccipSend'ing a message.

Parameters

ParameterTypeDescription
optsSendMessageOpts & { sender: string; }SendMessageOpts with sender address

Returns

Promise<UnsignedSolanaTx>

Promise resolving to chain-family specific unsigned txs

Overrides

Chain.generateUnsignedSendMessage


getBalance()

getBalance(opts: GetBalanceOpts): Promise<bigint>

Defined in: solana/index.ts:678

Query token balance for an address.

Parameters

ParameterTypeDescription
optsGetBalanceOptsBalance query options

Returns

Promise<bigint>

Token balance information including raw and formatted values

Throws

CCIPTokenAccountNotFoundError if token account not found

Overrides

Chain.getBalance


getBlockTimestamp()

getBlockTimestamp(block: number | "latest" | "finalized"): Promise<number>

Defined in: solana/index.ts:334

Fetch the timestamp of a given block.

Parameters

ParameterTypeDescription
blocknumber | "latest" | "finalized"Positive block number, negative finality depth, or 'finalized' tag

Returns

Promise<number>

Promise resolving to timestamp of the block, in seconds

Throws

CCIPBlockTimeNotFoundError if block time cannot be retrieved

Overrides

Chain.getBlockTimestamp


getExecutionInput()

getExecutionInput(opts: { request: CCIPRequest; verifications: CCIPVerifications; } & Pick<LogFilter, "page">): Promise<ExecutionInput>

Defined in: chain.ts:629

Fetch input data needed for executing messages Should be called on the source instance

Parameters

ParameterTypeDescription
opts{ request: CCIPRequest; verifications: CCIPVerifications; } & Pick<LogFilter, "page">getExecutionInput options containing request and verifications

Returns

Promise<ExecutionInput>

input payload to be passed to [[execute]]

See

execute - method to execute a message

Inherited from

Chain.getExecutionInput


getExecutionReceipts()

getExecutionReceipts(opts: { messageId?: string; offRamp: string; sourceChainSelector?: bigint; verifications?: CCIPVerifications; } & Pick<LogFilter, "startBlock" | "startTime" | "watch" | "page">): AsyncIterableIterator<CCIPExecution>

Defined in: solana/index.ts:1282

Default/generic implementation of getExecutionReceipts. Yields execution receipts for a given offRamp.

Parameters

ParameterTypeDescription
opts{ messageId?: string; offRamp: string; sourceChainSelector?: bigint; verifications?: CCIPVerifications; } & Pick<LogFilter, "startBlock" | "startTime" | "watch" | "page">getExecutionReceipts options

Returns

AsyncIterableIterator<CCIPExecution>

Async generator of CCIPExecution receipts

Overrides

Chain.getExecutionReceipts


getFee()

getFee(__namedParameters: Omit<SendMessageOpts, "approveMax">): Promise<bigint>

Defined in: solana/index.ts:1060

Fetch the current fee for a given intended message.

Parameters

ParameterTypeDescription
__namedParametersOmit<SendMessageOpts, "approveMax">SendMessageOpts without approveMax

Returns

Promise<bigint>

Fee amount in the feeToken's smallest units

Overrides

Chain.getFee


getFeeTokens()

getFeeTokens(router: string): Promise<Record<string, TokenInfo>>

Defined in: solana/index.ts:1541

Fetch list and info of supported feeTokens.

Parameters

ParameterTypeDescription
routerstringRouter address on this chain

Returns

Promise<Record<string, TokenInfo>>

Promise resolving to mapping of token addresses to TokenInfo objects

Overrides

Chain.getFeeTokens


getLaneLatency()

getLaneLatency(destChainSelector: bigint): Promise<LaneLatencyResponse>

Defined in: chain.ts:1046

Fetches estimated lane latency to a destination chain. Uses this chain's selector as the source.

Parameters

ParameterTypeDescription
destChainSelectorbigintDestination CCIP chain selector (bigint)

Returns

Promise<LaneLatencyResponse>

Promise resolving to LaneLatencyResponse containing:

  • lane.sourceNetworkInfo - Source chain metadata (name, selector, chainId)
  • lane.destNetworkInfo - Destination chain metadata
  • lane.routerAddress - Router contract address on source chain
  • totalMs - Estimated delivery time in milliseconds

Throws

CCIPApiClientNotAvailableError if apiClient was disabled (set to null)

Throws

CCIPHttpError if API request fails (network error, 4xx, 5xx status)

Remarks

Each call makes a fresh API request. Consider caching results if making frequent calls for the same lane.

Example

TypeScript
const chain = await EVMChain.fromUrl('https://eth-mainnet.example.com')
try {
const latency = await chain.getLaneLatency(4949039107694359620n) // Arbitrum
console.log(`Estimated delivery: ${Math.round(latency.totalMs / 60000)} minutes`)
console.log(`Router: ${latency.lane.routerAddress}`)
} catch (err) {
if (err instanceof CCIPHttpError) {
console.error(`API error: ${err.context.apiErrorCode}`)
}
}

Inherited from

Chain.getLaneLatency


getLogs()

getLogs(opts: LogFilter & { programs?: true | string[]; }): AsyncGenerator<Pick<Log, "address" | "topics" | "index" | "blockNumber" | "transactionHash"> & { data: Record<string, unknown> | BytesLike; tx?: { blockNumber: number; error?: unknown; from: string; hash: string; logs?: readonly ChainLog[]; timestamp: number; }; } & { tx: SolanaTransaction; }>

Defined in: solana/index.ts:435

Retrieves logs from Solana transactions with enhanced chronological ordering.

Behavior:

  • If opts.startBlock or opts.startTime is provided:

    • Fetches ALL signatures for the address going back in time
    • Continues fetching until finding signatures older than the start target
    • Filters out signatures older than start criteria
    • Returns logs in chronological order (oldest first)
  • If opts.startBlock and opts.startTime are omitted:

    • Fetches signatures in reverse chronological order (newest first)
    • Returns logs in reverse chronological order (newest first)

Parameters

ParameterTypeDescription
optsLogFilter & { programs?: true | string[]; }Log filter options containing: - startBlock: Starting slot number (inclusive) - startTime: Starting Unix timestamp (inclusive) - endBlock: Ending slot number (inclusive) - endBefore: Fetch signatures before this transaction - address: Program address to filter logs by (required for Solana) - topics: Array of topics to filter logs by (optional); either 0x-8B discriminants or event names - watch: Watch for new logs - programs: Special option to allow querying by address of interest, but yielding matching logs from specific (string address) program or any (true)

Returns

AsyncGenerator<Pick<Log, "address" | "topics" | "index" | "blockNumber" | "transactionHash"> & { data: Record<string, unknown> | BytesLike; tx?: { blockNumber: number; error?: unknown; from: string; hash: string; logs?: readonly ChainLog[]; timestamp: number; }; } & { tx: SolanaTransaction; }>

AsyncIterableIterator of parsed ChainLog objects.

Throws

CCIPLogsAddressRequiredError if address is not provided

Throws

CCIPTopicsInvalidError if topics contain invalid values

Overrides

Chain.getLogs


getMessageById()

getMessageById(messageId: string, _opts?: { onRamp?: string; page?: number; }): Promise<CCIPRequest<CCIPVersion>>

Defined in: chain.ts:581

Fetch a CCIP message by its unique message ID.

Parameters

ParameterTypeDescription
messageIdstringThe unique message ID (0x + 64 hex chars)
_opts?{ onRamp?: string; page?: number; }Optional: onRamp hint for non-EVM chains
_opts.onRamp?string-
_opts.page?number-

Returns

Promise<CCIPRequest<CCIPVersion>>

CCIPRequest with metadata populated from API

Remarks

Uses the CCIP API to retrieve message details. The returned request includes a metadata field with API-specific information.

Example

TypeScript
const request = await chain.getMessageById(messageId)
console.log(`Sender: ${request.message.sender}`)

if (request.metadata) {
console.log(`Status: ${request.metadata.status}`)
if (request.metadata.deliveryTime) {
console.log(`Delivered in ${request.metadata.deliveryTime}ms`)
}
}

Throws

CCIPApiClientNotAvailableError if API disabled

Throws

CCIPMessageIdNotFoundError if message not found

Throws

CCIPOnRampRequiredError if onRamp is required but not provided

Throws

CCIPHttpError if API request fails

Inherited from

Chain.getMessageById


getMessagesInBatch()

getMessagesInBatch<R>(request: R, range: Pick<CommitReport, "minSeqNr" | "maxSeqNr">, opts?: Pick<LogFilter, "page">): Promise<R["message"][]>

Defined in: solana/index.ts:478

Fetches all CCIP messages contained in a given commit batch. To be implemented for chains supporting CCIPVersion <= v1.6.0

Type Parameters

Type ParameterDescription
R extends { lane: Lane<CCIPVersion>; log: { } & { } & { }; message: { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; }; }

Parameters

ParameterTypeDescription
requestRCCIPRequest to fetch batch for
rangePick<CommitReport, "minSeqNr" | "maxSeqNr">batch range { minSeqnr, maxSeqNr }, e.g. from [[CommitReport]]
opts?Pick<LogFilter, "page">Optional parameters (e.g., page for pagination width)

Returns

Promise<R["message"][]>

Array of messages in the batch

Overrides

Chain.getMessagesInBatch


getMessagesInTx()

getMessagesInTx(tx: string | ChainTransaction): Promise<CCIPRequest<CCIPVersion>[]>

Defined in: chain.ts:525

Fetch all CCIP requests in a transaction.

Parameters

ParameterTypeDescription
txstring | ChainTransactionChainTransaction or txHash to fetch requests from

Returns

Promise<CCIPRequest<CCIPVersion>[]>

Promise resolving to CCIP messages in the transaction (at least one)

Throws

CCIPTransactionNotFoundError if transaction does not exist

Throws

CCIPMessageNotFoundInTxError if no CCIPSendRequested events in tx

Example

TypeScript
const chain = await EVMChain.fromUrl('https://eth-mainnet.example.com')
const requests = await chain.getMessagesInTx('0xabc123...')
for (const req of requests) {
console.log(`Message ID: ${req.message.messageId}`)
}

Inherited from

Chain.getMessagesInTx


getNativeTokenForRouter()

getNativeTokenForRouter(_router: string): Promise<string>

Defined in: solana/index.ts:551

Get the native token address for a Router.

Parameters

ParameterTypeDescription
_routerstringRouter contract address

Returns

Promise<string>

Promise resolving to native token address (usually wrapped)

Overrides

Chain.getNativeTokenForRouter


getOffchainTokenData()

getOffchainTokenData(request: { message: { ccipReceiveGasLimit: number; ccvAndExecutorHash: string; data: string; destBlob: string; destChainSelector: bigint; encodedMessage: string; executionGasLimit: number; feeToken: string; feeTokenAmount: bigint; finality: number; messageId: string; messageNumber: bigint; offRampAddress: string; onRampAddress: string; receipts: readonly { destBytesOverhead: bigint; destGasLimit: bigint; extraArgs: string; feeTokenAmount: bigint; issuer: string; }[]; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmountBeforeTokenPoolFees: bigint; tokenAmounts: readonly TokenTransferV1[]; verifierBlobs: readonly string[]; } | { data: string; feeToken: string; feeTokenAmount: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; sourceTokenData: readonly string[]; strict: boolean; tokenAmounts: readonly { amount: bigint; token: string; }[]; } | CCIPMessage_V1_5_EVM | CCIPMessage_V1_6_EVM | CCIPMessage_V1_6_Solana | CCIPMessage_V1_6_Sui; tx: { hash: string; }; }): Promise<OffchainTokenData[]>

Defined in: chain.ts:926

Fetch supported offchain token data for a request from this network. It logs but doesn't throw in case it can't fetch attestation, as the transfers may not be from the expected attestation providers. It returns default offchainData=undefined for those.

Parameters

ParameterTypeDescription
request{ message: { ccipReceiveGasLimit: number; ccvAndExecutorHash: string; data: string; destBlob: string; destChainSelector: bigint; encodedMessage: string; executionGasLimit: number; feeToken: string; feeTokenAmount: bigint; finality: number; messageId: string; messageNumber: bigint; offRampAddress: string; onRampAddress: string; receipts: readonly { destBytesOverhead: bigint; destGasLimit: bigint; extraArgs: string; feeTokenAmount: bigint; issuer: string; }[]; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmountBeforeTokenPoolFees: bigint; tokenAmounts: readonly TokenTransferV1[]; verifierBlobs: readonly string[]; } | { data: string; feeToken: string; feeTokenAmount: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; sourceTokenData: readonly string[]; strict: boolean; tokenAmounts: readonly { amount: bigint; token: string; }[]; } | CCIPMessage_V1_5_EVM | CCIPMessage_V1_6_EVM | CCIPMessage_V1_6_Solana | CCIPMessage_V1_6_Sui; tx: { hash: string; }; }CCIP request, with tx.hash and message
request.message{ ccipReceiveGasLimit: number; ccvAndExecutorHash: string; data: string; destBlob: string; destChainSelector: bigint; encodedMessage: string; executionGasLimit: number; feeToken: string; feeTokenAmount: bigint; finality: number; messageId: string; messageNumber: bigint; offRampAddress: string; onRampAddress: string; receipts: readonly { destBytesOverhead: bigint; destGasLimit: bigint; extraArgs: string; feeTokenAmount: bigint; issuer: string; }[]; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmountBeforeTokenPoolFees: bigint; tokenAmounts: readonly TokenTransferV1[]; verifierBlobs: readonly string[]; } | { data: string; feeToken: string; feeTokenAmount: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; sourceTokenData: readonly string[]; strict: boolean; tokenAmounts: readonly { amount: bigint; token: string; }[]; } | CCIPMessage_V1_5_EVM | CCIPMessage_V1_6_EVM | CCIPMessage_V1_6_Solana | CCIPMessage_V1_6_Sui-
request.tx{ hash: string; }Transaction that emitted the request.
request.tx.hashstringTransaction hash.

Returns

Promise<OffchainTokenData[]>

Promise resolving to array with one offchain token data for each token transfer

Example

TypeScript
const offchainData = await source.getOffchainTokenData(request)
// Use in execution report

Inherited from

Chain.getOffchainTokenData


getOffRampsForRouter()

getOffRampsForRouter(router: string, sourceChainSelector: bigint): Promise<string[]>

Defined in: solana/index.ts:559

Fetch the OffRamps allowlisted in a Router. Used to discover OffRamp connected to an OnRamp.

Parameters

ParameterTypeDescription
routerstringRouter contract address
sourceChainSelectorbigintSource chain selector

Returns

Promise<string[]>

Promise resolving to array of OffRamp addresses

Throws

CCIPSolanaOffRampEventsNotFoundError if no OffRamp events found

Overrides

Chain.getOffRampsForRouter


getOnRampForRouter()

getOnRampForRouter(router: string, _destChainSelector: bigint): Promise<string>

Defined in: solana/index.ts:580

Fetch the OnRamp registered in a Router for a destination chain.

Parameters

ParameterTypeDescription
routerstringRouter contract address
_destChainSelectorbigintDestination chain selector

Returns

Promise<string>

Promise resolving to OnRamp address

Overrides

Chain.getOnRampForRouter


getOnRampsForOffRamp()

getOnRampsForOffRamp(offRamp: string, sourceChainSelector: bigint): Promise<string[]>

Defined in: solana/index.ts:585

Fetch the OnRamps addresses set in OffRamp config. Used to discover OffRamp connected to an OnRamp.

Parameters

ParameterTypeDescription
offRampstringOffRamp contract address
sourceChainSelectorbigintSource chain selector

Returns

Promise<string[]>

Promise resolving to OnRamps addresses

Overrides

Chain.getOnRampsForOffRamp


getRegistryTokenConfig()

getRegistryTokenConfig(registry: string, token: string): Promise<{ administrator: string; pendingAdministrator?: string; tokenPool?: string; }>

Defined in: solana/index.ts:1311

Fetch token configuration from a TokenAdminRegistry.

Parameters

ParameterTypeDescription
registrystringTokenAdminRegistry contract address.
tokenstringToken address to query.

Returns

Promise<{ administrator: string; pendingAdministrator?: string; tokenPool?: string; }>

RegistryTokenConfig containing administrator and pool information.

Remarks

The TokenAdminRegistry is a contract that tracks token administrators and their associated pools. Each token has an administrator who can update pool configurations.

Throws

CCIPTokenNotConfiguredError if token is not configured in registry

Overrides

Chain.getRegistryTokenConfig


getRouterForOffRamp()

getRouterForOffRamp(offRamp: string, _sourceChainSelector: bigint): Promise<string>

Defined in: solana/index.ts:529

Fetch the Router address set in OffRamp config.

Parameters

ParameterTypeDescription
offRampstringOffRamp contract address
_sourceChainSelectorbigintSource chain selector

Returns

Promise<string>

Promise resolving to Router address

Throws

CCIPSolanaRefAddressesNotFoundError if reference addresses PDA not found

Overrides

Chain.getRouterForOffRamp


getRouterForOnRamp()

getRouterForOnRamp(onRamp: string, _destChainSelector: bigint): Promise<string>

Defined in: solana/index.ts:521

Fetch the Router address set in OnRamp config. Used to discover OffRamp connected to OnRamp.

Parameters

ParameterTypeDescription
onRampstringOnRamp contract address
_destChainSelectorbigintDestination chain selector

Returns

Promise<string>

Promise resolving to Router address

Overrides

Chain.getRouterForOnRamp


getSupportedTokens()

getSupportedTokens(router: string): Promise<string[]>

Defined in: solana/index.ts:1513

List tokens supported by given TokenAdminRegistry contract.

Parameters

ParameterTypeDescription
routerstringUsually TokenAdminRegistry, but chain may support receiving Router, OnRamp, etc.

Returns

Promise<string[]>

Promise resolving to array of supported token addresses

Overrides

Chain.getSupportedTokens


getTokenAdminRegistryFor()

getTokenAdminRegistryFor(address: string): Promise<string>

Defined in: solana/index.ts:1052

Fetch TokenAdminRegistry configured in a given OnRamp, Router, etc. Needed to map a source token to its dest counterparts.

Parameters

ParameterTypeDescription
addressstringContract address (OnRamp, Router, etc.)

Returns

Promise<string>

Promise resolving to TokenAdminRegistry address

Throws

CCIPContractNotRouterError if address is not a Router

Overrides

Chain.getTokenAdminRegistryFor


getTokenForTokenPool()

getTokenForTokenPool(tokenPool: string): Promise<string>

Defined in: solana/index.ts:611

Fetch the TokenPool's token/mint.

Parameters

ParameterTypeDescription
tokenPoolstringTokenPool address

Returns

Promise<string>

Promise resolving to token or mint address

Throws

CCIPTokenPoolInfoNotFoundError if token pool info not found

Overrides

Chain.getTokenForTokenPool


getTokenInfo()

getTokenInfo(token: string): Promise<TokenInfo>

Defined in: solana/index.ts:626

Fetch token metadata.

Parameters

ParameterTypeDescription
tokenstringToken address

Returns

Promise<TokenInfo>

Promise resolving to token symbol, decimals, and optionally name

Throws

CCIPSplTokenInvalidError if token is not a valid SPL token

Throws

CCIPTokenDataParseError if token data cannot be parsed

Overrides

Chain.getTokenInfo


getTokenPoolConfig()

getTokenPoolConfig(tokenPool: string): Promise<{ router: string; token: string; tokenPoolProgram: string; typeAndVersion?: string; }>

Defined in: solana/index.ts:1368

Fetch configuration of a token pool.

Parameters

ParameterTypeDescription
tokenPoolstringToken pool contract address.

Returns

Promise<{ router: string; token: string; tokenPoolProgram: string; typeAndVersion?: string; }>

TokenPoolConfig containing token, router, and version info.

Remarks

Return type varies by chain:

  • EVM: typeAndVersion is always present (required)
  • Solana: Includes extra tokenPoolProgram field
  • Aptos: Standard fields only
  • Sui/TON: Throws CCIPNotImplementedError

Throws

CCIPTokenPoolStateNotFoundError if token pool state not found

Overrides

Chain.getTokenPoolConfig


getTokenPoolRemote()

getTokenPoolRemote(tokenPool: string, remoteChainSelector: bigint): Promise<TokenPoolRemote>

Defined in: chain.ts:1271

Fetch remote chain configuration for a token pool for a specific destination.

Parameters

ParameterTypeDescription
tokenPoolstringToken pool address on the current chain.
remoteChainSelectorbigintChain selector of the desired remote chain.

Returns

Promise<TokenPoolRemote>

TokenPoolRemote config for the specified remote chain.

Remarks

Convenience wrapper around getTokenPoolRemotes that returns a single configuration instead of a Record. Use this when you need configuration for a specific destination chain.

Example

TypeScript
const arbitrumSelector = 4949039107694359620n
const remote = await chain.getTokenPoolRemote(poolAddress, arbitrumSelector)
console.log(`Remote token: ${remote.remoteToken}`)
console.log(`Remote pools: ${remote.remotePools.join(', ')}`)

Throws

CCIPTokenPoolChainConfigNotFoundError if no configuration found for the specified remote chain.

Inherited from

Chain.getTokenPoolRemote


getTokenPoolRemotes()

getTokenPoolRemotes(tokenPool: string, remoteChainSelector?: bigint): Promise<Record<string, TokenPoolRemote>>

Defined in: solana/index.ts:1405

Fetch remote chain configurations for a token pool.

Parameters

ParameterTypeDescription
tokenPoolstringToken pool address on the current chain.
remoteChainSelector?bigintOptional chain selector to filter results to a single destination.

Returns

Promise<Record<string, TokenPoolRemote>>

Record where keys are chain names (e.g., "ethereum-mainnet") and values are TokenPoolRemote configs.

Remarks

A token pool maintains configurations for each destination chain it supports. The returned Record maps chain names to their respective configurations.

Throws

CCIPTokenPoolStateNotFoundError if token pool state not found

Throws

CCIPTokenPoolChainConfigNotFoundError if chain config not found for specified selector

Overrides

Chain.getTokenPoolRemotes


getTransaction()

getTransaction(hash: string): Promise<SolanaTransaction>

Defined in: solana/index.ts:357

Fetch a transaction by its hash.

Parameters

ParameterTypeDescription
hashstringTransaction hash

Returns

Promise<SolanaTransaction>

Promise resolving to generic transaction details

Throws

CCIPTransactionNotFoundError if transaction not found

Overrides

Chain.getTransaction


getTransactionsForAddress()

getTransactionsForAddress(opts: Omit<LogFilter, "topics">): AsyncGenerator<SolanaTransaction>

Defined in: solana/index.ts:399

Internal method to get transactions for an address with pagination.

Parameters

ParameterTypeDescription
optsOmit<LogFilter, "topics">Log filter options.

Returns

AsyncGenerator<SolanaTransaction>

Async generator of Solana transactions.


getVerifications()

getVerifications(opts: { offRamp: string; request: { lane: Lane<CCIPVersion>; message: { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } & { messageId: string; } | { messageId: string; } | { messageId: string; } | { messageId: string; } | { messageId: string; } | { messageId: string; }; tx: { timestamp: number; }; }; } & Pick<LogFilter, "startBlock" | "watch" | "page">): Promise<CCIPVerifications>

Defined in: solana/index.ts:1226

Solana specialization: use getProgramAccounts to fetch commit reports from PDAs

Parameters

ParameterType
opts{ offRamp: string; request: { lane: Lane<CCIPVersion>; message: { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } | { sequenceNumber: bigint; } & { messageId: string; } | { messageId: string; } | { messageId: string; } | { messageId: string; } | { messageId: string; } | { messageId: string; }; tx: { timestamp: number; }; }; } & Pick<LogFilter, "startBlock" | "watch" | "page">

Returns

Promise<CCIPVerifications>

Overrides

Chain.getVerifications


sendMessage()

sendMessage(opts: SendMessageOpts & { wallet: unknown; }): Promise<CCIPRequest<CCIPVersion>>

Defined in: solana/index.ts:1097

Send a CCIP message through a router using provided wallet.

Parameters

ParameterTypeDescription
optsSendMessageOpts & { wallet: unknown; }SendMessageOpts with chain-specific wallet for signing

Returns

Promise<CCIPRequest<CCIPVersion>>

Promise resolving to CCIP request with message details

Throws

CCIPWalletInvalidError if wallet is not a valid Solana wallet

Overrides

Chain.sendMessage


typeAndVersion()

typeAndVersion(address: string): Promise<[string, string, string, string]>

Defined in: solana/index.ts:503

Fetch typeAndVersion for a given CCIP contract address.

Parameters

ParameterTypeDescription
addressstringCCIP contract address

Returns

Promise<[string, string, string, string]>

Promise resolving to tuple:

  • type - Parsed type of the contract, e.g. OnRamp
  • version - Parsed version of the contract, e.g. 1.6.0
  • typeAndVersion - Original (unparsed) typeAndVersion() string
  • suffix - Suffix of the version, if any (e.g. -dev)

Overrides

Chain.typeAndVersion


waitFinalized()

waitFinalized(opts: { cancel$?: Promise<unknown>; finality?: number | "finalized"; request: { log: { } & { } & { } & { } & { tx?: { timestamp: number; }; }; tx?: { timestamp: number; }; }; }): Promise<true>

Defined in: chain.ts:441

Confirm a log tx is finalized or wait for it to be finalized.

Parameters

ParameterTypeDescription
opts{ cancel$?: Promise<unknown>; finality?: number | "finalized"; request: { log: { } & { } & { } & { } & { tx?: { timestamp: number; }; }; tx?: { timestamp: number; }; }; }Options containing the request, finality level, and optional cancel promise
opts.cancel$?Promise<unknown>-
opts.finality?number | "finalized"-
opts.request{ log: { } & { } & { } & { } & { tx?: { timestamp: number; }; }; tx?: { timestamp: number; }; }-
opts.request.log{ } & { } & { } & { } & { tx?: { timestamp: number; }; }-
opts.request.tx?{ timestamp: number; }Transaction that emitted the request.
opts.request.tx.timestampnumberUnix timestamp of the block.

Returns

Promise<true>

true when the transaction is finalized

Throws

CCIPTransactionNotFinalizedError if the transaction is not included (e.g., due to a reorg)

Example

TypeScript
const request = await source.getMessagesInTx(txHash)
try {
await source.waitFinalized({ request: request[0] })
console.log('Transaction finalized')
} catch (err) {
if (err instanceof CCIPTransactionNotFinalizedError) {
console.log('Transaction not yet finalized')
}
}

Inherited from

Chain.waitFinalized


_getConnection()

static _getConnection(url: string, ctx?: WithLogger): Connection

Defined in: solana/index.ts:279

Creates a Solana connection from a URL.

Parameters

ParameterTypeDescription
urlstringRPC endpoint URL (https://, http://, wss://, or ws://).
ctx?WithLoggercontext containing logger.

Returns

Connection

Solana Connection instance.

Throws

CCIPDataFormatUnsupportedError if URL format is invalid


buildMessageForDest()

static buildMessageForDest(message: MessageInput): AnyMessage & { extraArgs: SVMExtraArgsV1; }

Defined in: solana/index.ts:1590

Returns a copy of a message, populating missing fields like extraArgs with defaults. It's expected to return a message suitable at least for basic token transfers.

Parameters

ParameterTypeDescription
messageMessageInputAnyMessage (from source), containing at least receiver

Returns

AnyMessage & { extraArgs: SVMExtraArgsV1; }

A message suitable for sendMessage to this destination chain family

Throws

CCIPArgumentInvalidError if tokenReceiver missing when sending tokens with data

Overrides

Chain.buildMessageForDest


decodeCommits()

static decodeCommits(log: Pick<ChainLog, "data">, lane?: Omit<Lane<CCIPVersion>, "destChainSelector">): { maxSeqNr: bigint; merkleRoot: string; minSeqNr: bigint; onRampAddress: string; sourceChainSelector: bigint; }[] | undefined

Defined in: solana/index.ts:895

Decodes commit reports from a Solana log event.

Parameters

ParameterTypeDescription
logPick<ChainLog, "data">Log with data field.
lane?Omit<Lane<CCIPVersion>, "destChainSelector">Lane info for filtering.

Returns

{ maxSeqNr: bigint; merkleRoot: string; minSeqNr: bigint; onRampAddress: string; sourceChainSelector: bigint; }[] | undefined

Array of CommitReport or undefined if not valid.

Throws

CCIPLogDataMissingError if log data is missing


decodeExtraArgs()

static decodeExtraArgs(extraArgs: BytesLike): EVMExtraArgsV1 & { allowOutOfOrderExecution: boolean; } & { _tag: "EVMExtraArgsV2"; } | undefined

Defined in: solana/index.ts:850

Decodes extra arguments from Solana CCIP messages.

Parameters

ParameterTypeDescription
extraArgsBytesLikeEncoded extra arguments bytes.

Returns

EVMExtraArgsV1 & { allowOutOfOrderExecution: boolean; } & { _tag: "EVMExtraArgsV2"; }

undefined

Decoded EVMExtraArgsV2 or undefined if unknown format.

Throws

CCIPExtraArgsLengthInvalidError if extra args length is invalid


decodeMessage()

static decodeMessage(log: { data: unknown; }): CCIPMessage | undefined

Defined in: solana/index.ts:772

Decodes a CCIP message from a Solana log event.

Parameters

ParameterTypeDescription
log{ data: unknown; }Log with data field.
log.dataunknown-

Returns

CCIPMessage | undefined

Decoded CCIPMessage or undefined if not valid.

Throws

CCIPExtraArgsInvalidError if extra args cannot be decoded


decodeReceipt()

static decodeReceipt(log: Pick<ChainLog, "data" | "tx" | "index">): ExecutionReceipt | undefined

Defined in: solana/index.ts:951

Decodes an execution receipt from a Solana log event.

Parameters

ParameterTypeDescription
logPick<ChainLog, "data" | "tx" | "index">Log with data, tx, and index fields.

Returns

ExecutionReceipt | undefined

ExecutionReceipt or undefined if not valid.

Throws

CCIPLogDataMissingError if log data is missing

Throws

CCIPExecutionStateInvalidError if execution state is invalid


encodeExtraArgs()

static encodeExtraArgs(args: ExtraArgs): string

Defined in: solana/index.ts:878

Encodes extra arguments for Solana CCIP messages.

Parameters

ParameterTypeDescription
argsExtraArgsExtra arguments to encode.

Returns

string

Encoded extra arguments as hex string.

Throws

CCIPSolanaExtraArgsEncodingError if SVMExtraArgsV1 encoding is attempted


fromConnection()

static fromConnection(connection: Connection, ctx?: ChainContext): Promise<SolanaChain>

Defined in: solana/index.ts:302

Creates a SolanaChain instance from an existing connection.

Parameters

ParameterTypeDescription
connectionConnectionSolana Connection instance.
ctx?ChainContextcontext containing logger.

Returns

Promise<SolanaChain>

A new SolanaChain instance.


fromUrl()

static fromUrl(url: string, ctx?: ChainContext): Promise<SolanaChain>

Defined in: solana/index.ts:324

Creates a SolanaChain instance from an RPC URL.

Parameters

ParameterTypeDescription
urlstringRPC endpoint URL (https://, http://, wss://, or ws://).
ctx?ChainContextOptional context containing logger and API client configuration.

Returns

Promise<SolanaChain>

A new SolanaChain instance connected to the specified network.

Throws

CCIPChainNotFoundError if chain cannot be identified from genesis hash

Example

TypeScript
// Create from devnet URL
const chain = await SolanaChain.fromUrl('https://api.devnet.solana.com')

// With custom logger
const chain = await SolanaChain.fromUrl(url, { logger: customLogger })

getAddress()

static getAddress(bytes: BytesLike): string

Defined in: solana/index.ts:1017

Converts bytes to a Solana address (Base58).

Parameters

ParameterTypeDescription
bytesBytesLikeBytes to convert.

Returns

string

Base58-encoded Solana address.


getDestLeafHasher()

static getDestLeafHasher(lane: Lane, ctx?: WithLogger): LeafHasher<"1.6.0">

Defined in: solana/index.ts:1044

Gets the leaf hasher for Solana destination chains.

Parameters

ParameterTypeDescription
laneLaneLane configuration.
ctx?WithLogger-

Returns

LeafHasher<"1.6.0">

Leaf hasher function.


isTxHash()

static isTxHash(v: unknown): v is string

Defined in: solana/index.ts:1029

Validates a transaction hash format for Solana

Parameters

ParameterType
vunknown

Returns

v is string


parse()

static parse(data: unknown): { ccipReceiveGasLimit: number; ccvAndExecutorHash: string; data: string; destBlob: string; destChainSelector: bigint; encodedMessage: string; executionGasLimit: number; feeToken: string; feeTokenAmount: bigint; finality: number; messageId: string; messageNumber: bigint; offRampAddress: string; onRampAddress: string; receipts: readonly { destBytesOverhead: bigint; destGasLimit: bigint; extraArgs: string; feeTokenAmount: bigint; issuer: string; }[]; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmountBeforeTokenPoolFees: bigint; tokenAmounts: readonly TokenTransferV1[]; verifierBlobs: readonly string[]; } | { data: string; feeToken: string; feeTokenAmount: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; sourceTokenData: readonly string[]; strict: boolean; tokenAmounts: readonly { amount: bigint; token: string; }[]; } | CCIPMessage_V1_6_EVM | CCIPMessage_V1_6_Solana | {[k: string]: string; program: string; } | EVMExtraArgsV1 & { allowOutOfOrderExecution: boolean; } & { _tag: "EVMExtraArgsV2"; } | { message: unknown; program: string; } | undefined

Defined in: solana/index.ts:1199

Parses raw Solana data into typed structures.

Parameters

ParameterTypeDescription
dataunknownRaw data to parse.

Returns

{ ccipReceiveGasLimit: number; ccvAndExecutorHash: string; data: string; destBlob: string; destChainSelector: bigint; encodedMessage: string; executionGasLimit: number; feeToken: string; feeTokenAmount: bigint; finality: number; messageId: string; messageNumber: bigint; offRampAddress: string; onRampAddress: string; receipts: readonly { destBytesOverhead: bigint; destGasLimit: bigint; extraArgs: string; feeTokenAmount: bigint; issuer: string; }[]; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmountBeforeTokenPoolFees: bigint; tokenAmounts: readonly TokenTransferV1[]; verifierBlobs: readonly string[]; }

ccipReceiveGasLimit

ccipReceiveGasLimit: number

ccvAndExecutorHash

ccvAndExecutorHash: string

data

data: string

destBlob

destBlob: string

destChainSelector

destChainSelector: bigint

encodedMessage

encodedMessage: string

executionGasLimit

executionGasLimit: number

feeToken

feeToken: string

feeTokenAmount

feeTokenAmount: bigint

finality

finality: number

messageId

messageId: string

messageNumber

messageNumber: bigint

offRampAddress

offRampAddress: string

onRampAddress

onRampAddress: string

receipts

receipts: readonly { destBytesOverhead: bigint; destGasLimit: bigint; extraArgs: string; feeTokenAmount: bigint; issuer: string; }[]

receiver

receiver: string

sender

sender: string

sequenceNumber

sequenceNumber: bigint

sourceChainSelector

sourceChainSelector: bigint

tokenAmountBeforeTokenPoolFees

tokenAmountBeforeTokenPoolFees: bigint

tokenAmounts

tokenAmounts: readonly TokenTransferV1[]

verifierBlobs

verifierBlobs: readonly string[]

{ data: string; feeToken: string; feeTokenAmount: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; sourceTokenData: readonly string[]; strict: boolean; tokenAmounts: readonly { amount: bigint; token: string; }[]; }

data

data: string

feeToken

feeToken: string

feeTokenAmount

feeTokenAmount: bigint

gasLimit

gasLimit: bigint

messageId

messageId: string

nonce

nonce: bigint

receiver

receiver: string

sender

sender: string

sequenceNumber

sequenceNumber: bigint

sourceChainSelector

sourceChainSelector: bigint

sourceTokenData

sourceTokenData: readonly string[]

strict

strict: boolean

tokenAmounts

tokenAmounts: readonly { amount: bigint; token: string; }[]

CCIPMessage_V1_6_EVM

CCIPMessage_V1_6_Solana

{[k: string]: string; program: string; }

Index Signature

[k: string]: string

program

program: string

EVMExtraArgsV1 & { allowOutOfOrderExecution: boolean; } & { _tag: "EVMExtraArgsV2"; }

{ message: unknown; program: string; }

message

message: unknown = data.transactionMessage

program

program: string

undefined

Parsed data or undefined.