Skip to main content
Version: 1.4.0

Class: TONChain

Defined in: ton/index.ts:100

TON chain implementation supporting TON networks.

TON uses two different ordering concepts:

  • seqno (sequence number): The actual block number in the blockchain
  • lt (logical time): A per-account transaction ordering timestamp

This implementation uses lt for the blockNumber field in logs and transactions because TON's transaction APIs are indexed by lt, not seqno. The lt is monotonically increasing per account and suitable for pagination and ordering.

Extends

Indexable

[key: symbol]: () => string

Constructors

Constructor

new TONChain(client: TonClient, network: NetworkInfo, ctx?: WithLogger & { apiClient?: string | CCIPAPIClient | null; apiRetryConfig?: ApiRetryConfig; } & { fetchFn?: (input: string | URL | Request, init?: RequestInit) => Promise<Response>; }): TONChain

Defined in: ton/index.ts:115

Creates a new TONChain instance.

Parameters

ParameterTypeDescription
clientTonClientTonClient instance.
networkNetworkInfoNetwork information for this chain.
ctx?WithLogger & { apiClient?: string | CCIPAPIClient | null; apiRetryConfig?: ApiRetryConfig; } & { fetchFn?: (input: string | URL | Request, init?: RequestInit) => Promise<Response>; }Context containing logger.

Returns

TONChain

Overrides

Chain<typeof ChainFamily.TON>.constructor

Properties

apiClient

readonly apiClient: CCIPAPIClient | null

Defined in: chain.ts:504

CCIP API client (null if opted out)

Inherited from

Chain.apiClient


apiRetryConfig

readonly apiRetryConfig: Required<ApiRetryConfig> | null

Defined in: chain.ts:506

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

Inherited from

Chain.apiRetryConfig


logger

logger: Logger

Defined in: chain.ts:502

Inherited from

Chain.logger


network

readonly network: NetworkInfo<"TON">

Defined in: chain.ts:501

Inherited from

Chain.network


provider

readonly provider: TonClient

Defined in: ton/index.ts:107


rateLimitedFetch

readonly rateLimitedFetch: (input: string | URL | Request, init?: RequestInit) => Promise<Response>

Defined in: ton/index.ts:106

Parameters

ParameterType
inputstring | URL | Request
init?RequestInit

Returns

Promise<Response>


decimals

readonly static decimals: 9 = 9

Defined in: ton/index.ts:105


family

readonly static family: "TON" = ChainFamily.TON

Defined in: ton/index.ts:104

Methods

destroy()?

optional destroy(): void | Promise<void>

Defined in: chain.ts:540

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 { token: string; } | { destTokenAddress: string; extraData?: string; } & { amount: bigint; }[]; messageId: string; receiver: string; sender?: string; sourceChainSelector: bigint; }; offRamp: string; } | { messageId: string; }): Promise<number>

Defined in: chain.ts:1704

Estimate ccipReceive execution cost (gas, computeUnits) for this destination chain.

Parameters

ParameterTypeDescription
opts{ message: { data?: BytesLike; destTokenAmounts?: readonly { token: string; } | { destTokenAddress: string; extraData?: string; } & { amount: bigint; }[]; messageId: string; receiver: string; sender?: string; sourceChainSelector: bigint; }; offRamp: string; } | { messageId: string; }Either: - { offRamp, message } — estimate from message fields directly. message must include sourceChainSelector, messageId, receiver, and optionally sender, data, destTokenAmounts. - { messageId } — fetch the message from the CCIP API via getMessageById, resolve the offRamp from the message metadata or getExecutionInput, then estimate. Requires apiClient to be available.

Returns

Promise<number>

Estimated execution cost (gas for EVM, compute units for Solana)

Inherited from

Chain.estimateReceiveExecution


execute()

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

Defined in: ton/index.ts:1140

Execute messages in report in an offRamp.

Parameters

ParameterTypeDescription
optsExecuteOpts & { wallet: unknown; }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 TON wallet

Throws

CCIPReceiptNotFoundError if execution receipt not found within timeout

Overrides

Chain.execute


generateUnsignedExecute()

generateUnsignedExecute(opts: ExecuteOpts & { payer: string; }): Promise<UnsignedTONTx>

Defined in: ton/index.ts:1117

Generate unsigned tx to manuallyExecute a message.

Parameters

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

Returns

Promise<UnsignedTONTx>

Promise resolving to chain-family specific unsigned txs

Throws

CCIPExtraArgsInvalidError if extra args are not EVMExtraArgsV2 format

Overrides

Chain.generateUnsignedExecute


generateUnsignedSendMessage()

generateUnsignedSendMessage(__namedParameters: SendMessageOpts & { sender: string; }): Promise<UnsignedTONTx>

Defined in: ton/index.ts:1024

Generate unsigned txs for ccipSend'ing a message.

Parameters

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

Returns

Promise<UnsignedTONTx>

Promise resolving to chain-family specific unsigned txs

Overrides

Chain.generateUnsignedSendMessage


getBalance()

getBalance(opts: GetBalanceOpts): Promise<bigint>

Defined in: ton/index.ts:566

Query token balance for an address.

Parameters

ParameterTypeDescription
optsGetBalanceOptsBalance query options

Returns

Promise<bigint>

Token balance information including raw and formatted values

Overrides

Chain.getBalance


getBlockTimestamp()

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

Defined in: ton/index.ts:254

Fetch the timestamp for a given logical time (lt) or finalized block.

Note: For TON, the block parameter represents logical time (lt), not block seqno. This is because TON transaction APIs are indexed by lt. The lt must have been previously cached via getLogs or getTransaction calls.

Parameters

ParameterTypeDescription
blocknumber | "finalized"Logical time (lt) as number, or 'finalized' for latest block timestamp

Returns

Promise<number>

Unix timestamp in seconds

Throws

CCIPNotImplementedError if lt is not in cache

Overrides

Chain.getBlockTimestamp


getExecutionInput()

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

Defined in: chain.ts:794

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: chain.ts:1354

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

Example

TypeScript
for await (const exec of dest.getExecutionReceipts({
offRamp: offRampAddress,
messageId: request.message.messageId,
startBlock: commit.log.blockNumber,
})) {
console.log(`State: ${exec.receipt.state}`)
if (exec.receipt.state === ExecutionState.Success) break
}

Inherited from

Chain.getExecutionReceipts


getFee()

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

Defined in: ton/index.ts:1010

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<never>

Defined in: ton/index.ts:1222

Fetch list and info of supported feeTokens.

Parameters

ParameterTypeDescription
_routerstringRouter address on this chain

Returns

Promise<never>

Promise resolving to mapping of token addresses to TokenInfo objects

Throws

CCIPNotImplementedError always (not implemented for TON)

Overrides

Chain.getFeeTokens


getLaneFeatures()

getLaneFeatures(_opts: { destChainSelector: bigint; router: string; token?: string; }): Promise<Partial<LaneFeatures>>

Defined in: chain.ts:1327

Retrieve features for a lane (router/destChainSelector/token triplet).

Parameters

ParameterTypeDescription
_opts{ destChainSelector: bigint; router: string; token?: string; }Options containing router address, destChainSelector, and optional token address (the token to be transferred in a hypothetical message on this lane)
_opts.destChainSelectorbigint-
_opts.routerstring-
_opts.token?string-

Returns

Promise<Partial<LaneFeatures>>

Promise resolving to partial lane features record

Throws

CCIPNotImplementedError if not implemented for this chain family

Example

TypeScript
const features = await chain.getLaneFeatures({
router: '0x...',
destChainSelector: 4949039107694359620n,
})
// MIN_BLOCK_CONFIRMATIONS has three states:
// - undefined: FTF is not supported on this lane (pre-v2.0)
// - 0: the lane supports FTF, but it is not enabled for this token
// - > 0: FTF is enabled with this many block confirmations
const ftf = features.MIN_BLOCK_CONFIRMATIONS
if (ftf != null && ftf > 0) {
console.log(`FTF enabled with ${ftf} confirmations`)
} else if (ftf === 0) {
console.log('FTF supported on this lane but not enabled for this token')
}

Inherited from

Chain.getLaneFeatures


getLaneLatency()

getLaneLatency(destChainSelector: bigint, numberOfBlocks?: number): Promise<LaneLatencyResponse>

Defined in: chain.ts:1286

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

Parameters

ParameterTypeDescription
destChainSelectorbigintDestination CCIP chain selector (bigint)
numberOfBlocks?numberOptional number of block confirmations to use for latency calculation. When omitted or 0, uses the lane's default finality. When provided as a positive integer, the API returns latency for that custom finality value.

Returns

Promise<LaneLatencyResponse>

Promise resolving to LaneLatencyResponse containing:

  • 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.

Examples

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`)
} catch (err) {
if (err instanceof CCIPHttpError) {
console.error(`API error: ${err.context.apiErrorCode}`)
}
}
TypeScript
const latency = await chain.getLaneLatency(4949039107694359620n, 10)
console.log(`Latency with 10 confirmations: ${Math.round(latency.totalMs / 60000)} minutes`)

Inherited from

Chain.getLaneLatency


getLogs()

getLogs(opts: LogFilter): AsyncIterableIterator<ChainLog>

Defined in: ton/index.ts:382

Async generator that yields logs from TON transactions.

Note: For TON, startBlock and endBlock in opts represent logical time (lt), not block sequence numbers. This is because TON transaction APIs are indexed by lt.

Parameters

ParameterTypeDescription
optsLogFilterLog filter options (startBlock/endBlock are interpreted as lt values)

Returns

AsyncIterableIterator<ChainLog>

Throws

CCIPTopicsInvalidError if topics format is invalid

Overrides

Chain.getLogs


getMessageById()

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

Defined in: chain.ts:746

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: ton/index.ts:404

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

Type Parameters

Type ParameterDescription
R extends { lane: { destChainSelector: bigint; onRamp: string; sourceChainSelector: bigint; version: 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:690

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: ton/index.ts:465

Get the native token address for a Router.

Parameters

ParameterTypeDescription
_routerstringRouter contract address

Returns

Promise<string>

Promise resolving to native token address (usually wrapped)

Throws

CCIPNotImplementedError always (not implemented for TON)

Overrides

Chain.getNativeTokenForRouter


getOffchainTokenData()

getOffchainTokenData(request: { message: { 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: 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; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; token: string; }[]; } | { allowOutOfOrderExecution: boolean; data: string; destChainSelector: bigint; extraArgs: string; feeToken: string; feeTokenAmount: bigint; feeValueJuels: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmounts: readonly { amount: bigint; destExecData: string; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; }[]; } | { accountIsWritableBitmap: bigint; accounts: string[]; allowOutOfOrderExecution: boolean; computeUnits: bigint; data: string; destChainSelector: bigint; extraArgs: string; feeToken: string; feeTokenAmount: bigint; feeValueJuels: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmounts: readonly { amount: bigint; destExecData: string; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; }[]; tokenReceiver: string; } | { allowOutOfOrderExecution: boolean; data: string; destChainSelector: bigint; extraArgs: string; feeToken: string; feeTokenAmount: bigint; feeValueJuels: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; receiverObjectIds: string[]; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmounts: readonly { amount: bigint; destExecData: string; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; }[]; tokenReceiver: string; } | { 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 { amount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; sourceTokenAddress: string; tokenReceiver: string; }[]; verifierBlobs: readonly string[]; }; tx: { hash: string; }; }): Promise<OffchainTokenData[]>

Defined in: chain.ts:1091

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: { 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: 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; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; token: string; }[]; } | { allowOutOfOrderExecution: boolean; data: string; destChainSelector: bigint; extraArgs: string; feeToken: string; feeTokenAmount: bigint; feeValueJuels: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmounts: readonly { amount: bigint; destExecData: string; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; }[]; } | { accountIsWritableBitmap: bigint; accounts: string[]; allowOutOfOrderExecution: boolean; computeUnits: bigint; data: string; destChainSelector: bigint; extraArgs: string; feeToken: string; feeTokenAmount: bigint; feeValueJuels: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmounts: readonly { amount: bigint; destExecData: string; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; }[]; tokenReceiver: string; } | { allowOutOfOrderExecution: boolean; data: string; destChainSelector: bigint; extraArgs: string; feeToken: string; feeTokenAmount: bigint; feeValueJuels: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; receiverObjectIds: string[]; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmounts: readonly { amount: bigint; destExecData: string; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; }[]; tokenReceiver: string; } | { 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 { amount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; sourceTokenAddress: string; tokenReceiver: string; }[]; verifierBlobs: readonly string[]; }; tx: { hash: string; }; }CCIP request, with tx.hash and message
request.message{ 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: 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; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; token: string; }[]; } | { allowOutOfOrderExecution: boolean; data: string; destChainSelector: bigint; extraArgs: string; feeToken: string; feeTokenAmount: bigint; feeValueJuels: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmounts: readonly { amount: bigint; destExecData: string; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; }[]; } | { accountIsWritableBitmap: bigint; accounts: string[]; allowOutOfOrderExecution: boolean; computeUnits: bigint; data: string; destChainSelector: bigint; extraArgs: string; feeToken: string; feeTokenAmount: bigint; feeValueJuels: bigint; messageId: string; nonce: bigint; receiver: string; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmounts: readonly { amount: bigint; destExecData: string; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; }[]; tokenReceiver: string; } | { allowOutOfOrderExecution: boolean; data: string; destChainSelector: bigint; extraArgs: string; feeToken: string; feeTokenAmount: bigint; feeValueJuels: bigint; gasLimit: bigint; messageId: string; nonce: bigint; receiver: string; receiverObjectIds: string[]; sender: string; sequenceNumber: bigint; sourceChainSelector: bigint; tokenAmounts: readonly { amount: bigint; destExecData: string; destGasAmount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; }[]; tokenReceiver: string; } | { 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 { amount: bigint; destTokenAddress: string; extraData: string; sourcePoolAddress: string; sourceTokenAddress: string; tokenReceiver: string; }[]; verifierBlobs: readonly string[]; }-
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: ton/index.ts:472

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

Overrides

Chain.getOffRampsForRouter


getOnRampForRouter()

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

Defined in: ton/index.ts:482

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: ton/index.ts:495

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

Throws

CCIPSourceChainUnsupportedError if source chain is not configured

Overrides

Chain.getOnRampsForOffRamp


getRegistryTokenConfig()

getRegistryTokenConfig(_address: string, _tokenName: string): Promise<never>

Defined in: ton/index.ts:1198

Fetch token configuration from a TokenAdminRegistry.

Parameters

ParameterTypeDescription
_addressstringTokenAdminRegistry contract address.
_tokenNamestringToken address to query.

Returns

Promise<never>

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

CCIPNotImplementedError always (not implemented for TON)

Overrides

Chain.getRegistryTokenConfig


getRouterForOffRamp()

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

Defined in: ton/index.ts:454

Fetch the Router address set in OffRamp config.

Parameters

ParameterTypeDescription
offRampstringOffRamp contract address
sourceChainSelectorbigintSource chain selector

Returns

Promise<string>

Promise resolving to Router address

Overrides

Chain.getRouterForOffRamp


getRouterForOnRamp()

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

Defined in: ton/index.ts:444

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(_address: string): Promise<string[]>

Defined in: ton/index.ts:1190

List tokens supported by given TokenAdminRegistry contract.

Parameters

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

Returns

Promise<string[]>

Promise resolving to array of supported token addresses

Throws

CCIPNotImplementedError always (not implemented for TON)

Overrides

Chain.getSupportedTokens


getTokenAdminRegistryFor()

getTokenAdminRegistryFor(_address: string): Promise<string>

Defined in: ton/index.ts:601

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

CCIPNotImplementedError always (not implemented for TON)

Overrides

Chain.getTokenAdminRegistryFor


getTokenForTokenPool()

getTokenForTokenPool(_tokenPool: string): Promise<string>

Defined in: ton/index.ts:538

Fetch the TokenPool's token/mint.

Parameters

ParameterTypeDescription
_tokenPoolstringTokenPool address

Returns

Promise<string>

Promise resolving to token or mint address

Throws

CCIPNotImplementedError always (not implemented for TON)

Overrides

Chain.getTokenForTokenPool


getTokenInfo()

getTokenInfo(token: string): Promise<{ decimals: number; symbol: string; }>

Defined in: ton/index.ts:543

Fetch token metadata.

Parameters

ParameterTypeDescription
tokenstringToken address

Returns

Promise<{ decimals: number; symbol: string; }>

Promise resolving to token symbol, decimals, and optionally name

Overrides

Chain.getTokenInfo


getTokenPoolConfig()

getTokenPoolConfig(_tokenPool: string, _feeOpts?: TokenTransferFeeOpts): Promise<never>

Defined in: ton/index.ts:1206

Fetch configuration of a token pool.

Parameters

ParameterTypeDescription
_tokenPoolstringToken pool contract address.
_feeOpts?TokenTransferFeeOptsOptional parameters to also fetch token transfer fee config.

Returns

Promise<never>

TokenPoolConfig containing token, router, version info, and optionally fee config.

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

CCIPNotImplementedError always (not implemented for TON)

Overrides

Chain.getTokenPoolConfig


getTokenPoolRemote()

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

Defined in: chain.ts:1557

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): Promise<never>

Defined in: ton/index.ts:1214

Fetch remote chain configurations for a token pool.

Parameters

ParameterTypeDescription
_tokenPoolstringToken pool address on the current chain.

Returns

Promise<never>

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

CCIPNotImplementedError always (not implemented for TON)

Overrides

Chain.getTokenPoolRemotes


getTokenPrice()

getTokenPrice(_opts: { router: string; timestamp?: number; token: string; }): Promise<TokenPrice>

Defined in: chain.ts:1688

Fetch the on-chain USD price of a token from the FeeQuoter or PriceRegistry.

Parameters

ParameterType
_opts{ router: string; timestamp?: number; token: string; }
_opts.routerstring
_opts.timestamp?number
_opts.tokenstring

Returns

Promise<TokenPrice>

Promise resolving to TokenPrice with the USD price per whole token.

Remarks

On EVM, the price contract is resolved via the Router's OnRamp: PriceRegistry for v1.2/v1.5 lanes, FeeQuoter for v1.6+ lanes. When timestamp is provided on EVM, the price is read at the block closest to that timestamp (requires archive node). On Solana and Aptos, the FeeQuoter is resolved directly from the Router config; timestamp is not yet supported and will be ignored.

Throws

CCIPNotImplementedError if not implemented for this chain family

Example

TypeScript
const { price } = await chain.getTokenPrice({
router: routerAddress,
token: linkAddress,
})
console.log(`LINK: $${price.toFixed(2)}`)

Inherited from

Chain.getTokenPrice


getTotalFeesEstimate()

getTotalFeesEstimate(_opts: Omit<SendMessageOpts, "approveMax">): Promise<TotalFeesEstimate>

Defined in: chain.ts:1654

Estimate total fees for a cross-chain message.

Returns two components:

  • ccipFee: from Router.getFee(), denominated in the message's feeToken (native token if omitted). Includes gas, DON costs, and FeeQuoter-level token transfer overhead (all CCIP versions).
  • tokenTransferFee: pool-level BPS fee deducted from the transferred token amount (v2.0+ only). The recipient receives amount - feeDeducted on the destination chain. Absent on pre-v2.0 lanes or data-only messages.

Parameters

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

Returns

Promise<TotalFeesEstimate>

Promise resolving to TotalFeesEstimate

Throws

CCIPNotImplementedError if not implemented for this chain family

Inherited from

Chain.getTotalFeesEstimate


getTransaction()

getTransaction(tx: string | Transaction): Promise<ChainTransaction>

Defined in: ton/index.ts:283

Fetches a transaction by its hash.

Supports two formats:

  1. Composite format: "workchain:address:lt:hash" (e.g., "0:abc123...def:12345:abc123...def")
  2. Raw hash format: 64-character hex string resolved via TonCenter V3 API

Note: TonClient requires (address, lt, hash) for lookups. Raw hash lookups use TonCenter's V3 index API to resolve the hash to a full identifier first.

Parameters

ParameterTypeDescription
txstring | TransactionTransaction identifier in either format

Returns

Promise<ChainTransaction>

ChainTransaction with transaction details Note: blockNumber contains logical time (lt), not block seqno

Throws

CCIPArgumentInvalidError if hash format is invalid

Throws

CCIPTransactionNotFoundError if transaction not found

Overrides

Chain.getTransaction


getVerifications()

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

Defined in: chain.ts:1233

Look for a CommitReport at dest for given CCIP request. May be specialized by some subclasses.

Parameters

ParameterTypeDescription
opts{ offRamp: string; request: { lane: { destChainSelector: bigint; onRamp: string; sourceChainSelector: bigint; version: CCIPVersion; }; message: { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; } | { messageId: string; sequenceNumber: bigint; }; tx: { timestamp: number; }; }; } & Pick<LogFilter, "startBlock" | "watch" | "page">getVerifications options

Returns

Promise<CCIPVerifications>

CCIPVerifications

Throws

CCIPCommitNotFoundError if no commit found for the request (transient)

Example

TypeScript
const verifications = await dest.getVerifications({
offRamp: offRampAddress,
request,
})
console.log(`Committed at block: ${verifications.log.blockNumber}`)

Inherited from

Chain.getVerifications


resolveExecuteOpts()

protected resolveExecuteOpts(opts: ExecuteOpts): Promise<{ input: ExecutionInput; offRamp: string; } & { forceBuffer?: boolean; forceLookupTable?: boolean; gasLimit?: number; tokensGasLimit?: number; }>

Defined in: chain.ts:1108

Resolves ExecuteOpts that may contain a messageId (API shorthand) into the canonical { offRamp, input } form required by generateUnsignedExecute.

When opts already contains input the method is a no-op and returns it unchanged. When opts contains only a messageId it calls apiClient.getExecutionInput and merges the result back with any extra opts fields (e.g. gasLimit). If opts.gasLimit is undefined and estimateReceiveExecution is available, try to estimate gasLimitOverride

Parameters

ParameterType
optsExecuteOpts

Returns

Promise<{ input: ExecutionInput; offRamp: string; } & { forceBuffer?: boolean; forceLookupTable?: boolean; gasLimit?: number; tokensGasLimit?: number; }>

Throws

CCIPApiClientNotAvailableError if messageId is provided but no apiClient

Inherited from

Chain.resolveExecuteOpts


sendMessage()

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

Defined in: ton/index.ts:1054

Send a CCIP message through a router using provided wallet.

Parameters

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

Returns

Promise<CCIPRequest<CCIPVersion>>

Promise resolving to CCIP request with message details

Overrides

Chain.sendMessage


typeAndVersion()

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

Defined in: ton/index.ts:418

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:606

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.log.tx?{ timestamp: number; }Optional reference to the containing transaction.
opts.request.log.tx.timestampnumberUnix timestamp of the block.
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


buildMessageForDest()

static buildMessageForDest(message: MessageInput): AnyMessage

Defined in: chain.ts:1600

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

A message suitable for sendMessage to this destination chain family.

Remarks

V3 (GenericExtraArgsV3) is auto-detected when any V3-only field is present (e.g. blockConfirmations, ccvs, ccvArgs, executor, executorArgs, tokenReceiver, tokenArgs). Otherwise defaults to V2 (EVMExtraArgsV2).

Throws

CCIPArgumentInvalidError if extraArgs contains unknown fields for the detected version.

Inherited from

Chain.buildMessageForDest


decodeCommits()

static decodeCommits(log: { data: unknown; topics?: readonly string[]; }, lane?: Lane<CCIPVersion>): { maxSeqNr: bigint; merkleRoot: string; minSeqNr: bigint; onRampAddress: string; sourceChainSelector: bigint; }[] | undefined

Defined in: ton/index.ts:768

Decodes commit reports from a TON log event (CommitReportAccepted).

Parameters

ParameterTypeDescription
log{ data: unknown; topics?: readonly string[]; }Log with data field (base64-encoded BOC).
log.dataunknown-
log.topics?readonly string[]-
lane?Lane<CCIPVersion>Optional lane info for filtering.

Returns

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

Array of CommitReport or undefined if not a valid commit event.


decodeExtraArgs()

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

Defined in: ton/index.ts:733

Decodes extra arguments from TON messages. Handles both raw bit-packed data (starts with EVMExtraArgsV2 tag directly) and BOC-wrapped data (starts with TON BOC magic 0xb5ee9c72, unwrapped first). Returns undefined if parsing fails or the tag doesn't match.

Currently only supports EVMExtraArgsV2 (GenericExtraArgsV2) encoding since TON lanes are only connected to EVM chains. When new lanes are planned to be added, this should be extended to support them (eg. Solana and SVMExtraArgsV1)

Parameters

ParameterTypeDescription
extraArgsBytesLikeExtra args as hex string or bytes (raw bit-packed or BOC-wrapped)

Returns

Decoded EVMExtraArgsV2 (GenericExtraArgsV2) object or undefined if invalid

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


undefined


decodeMessage()

static decodeMessage(log: { data: unknown; topics?: readonly string[]; }): CCIPMessage_V1_6_EVM | undefined

Defined in: ton/index.ts:610

Decodes a CCIP message from a TON log event.

Parameters

ParameterTypeDescription
log{ data: unknown; topics?: readonly string[]; }Log with data field.
log.dataunknown-
log.topics?readonly string[]-

Returns

CCIPMessage_V1_6_EVM | undefined

Decoded CCIPMessage, or undefined if the data is not a valid CCIP message (parse errors are caught and silently return undefined).


decodeReceipt()

static decodeReceipt(log: { data: unknown; topics?: readonly string[]; }): ExecutionReceipt | undefined

Defined in: ton/index.ts:840

Decodes an execution receipt from a TON log event.

The ExecutionStateChanged event structure (topic is in message header, not body):

  • sourceChainSelector: uint64 (8 bytes)
  • sequenceNumber: uint64 (8 bytes)
  • messageId: uint256 (32 bytes)
  • state: uint8 (1 byte) - InProgress=1, Success=2, Failed=3

Parameters

ParameterTypeDescription
log{ data: unknown; topics?: readonly string[]; }Log with data field (base64-encoded BOC).
log.dataunknown-
log.topics?readonly string[]-

Returns

ExecutionReceipt | undefined

ExecutionReceipt or undefined if not valid.


encodeExtraArgs()

static encodeExtraArgs(args: ExtraArgs): string

Defined in: ton/index.ts:715

Encodes extra args from TON messages into BOC serialization format.

Currently only supports GenericExtraArgsV2 (EVMExtraArgsV2) encoding since TON lanes are only connected to EVM chains. When new lanes are planned to be added, this should be extended to support them (eg. Solana and SVMExtraArgsV1)

Parameters

ParameterTypeDescription
argsExtraArgsExtra arguments containing gas limit and execution flags

Returns

string

Hex string of BOC-encoded extra args (0x-prefixed)

Throws

CCIPExtraArgsInvalidError if args contains fields other than gasLimit and allowOutOfOrderExecution


formatAddress()

static formatAddress(address: string): string

Defined in: ton/index.ts:939

Formats a TON address for human-friendly display. Converts raw format (workchain:hash) to user-friendly format (EQ..., UQ..., etc.)

Parameters

ParameterTypeDescription
addressstringAddress in any recognized format

Returns

string

User-friendly TON address string


formatTxHash()

static formatTxHash(hash: string): string

Defined in: ton/index.ts:957

Formats a TON transaction hash for human-friendly display. Extracts the raw 64-char hash from composite format for cleaner display.

Parameters

ParameterTypeDescription
hashstringTransaction hash in composite or raw format

Returns

string

The raw 64-char hex hash for display


fromClient()

static fromClient(client: TonClient, ctx?: WithLogger & { apiClient?: string | CCIPAPIClient | null; apiRetryConfig?: ApiRetryConfig; } & { fetchFn?: (input: string | URL | Request, init?: RequestInit) => Promise<Response>; }): Promise<TONChain>

Defined in: ton/index.ts:190

Detect client network and instantiate a TONChain instance.

Parameters

ParameterTypeDescription
clientTonClientTonClient instance connected to the TON network.
ctx?WithLogger & { apiClient?: string | CCIPAPIClient | null; apiRetryConfig?: ApiRetryConfig; } & { fetchFn?: (input: string | URL | Request, init?: RequestInit) => Promise<Response>; }Optional chain context with logger, API client, and fetch function.

Returns

Promise<TONChain>

TONChain instance configured for the detected network (mainnet or testnet).


fromUrl()

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

Defined in: ton/index.ts:213

Creates a TONChain instance from an RPC URL. Verifies the connection and detects the network.

Parameters

ParameterTypeDescription
urlstringRPC endpoint URL for TonClient (v2).
ctx?ChainContextContext containing logger.

Returns

Promise<TONChain>

A new TONChain instance.

Throws

CCIPHttpError if connection to the RPC endpoint fails


getAddress()

static getAddress(bytes: BytesLike): string

Defined in: ton/index.ts:892

Converts bytes to a TON address. Handles:

  • 36-byte CCIP format: workchain(4 bytes, big-endian) + hash(32 bytes)
  • 33-byte format: workchain(1 byte) + hash(32 bytes)
  • 32-byte format: hash only (assumes workchain 0) Also handles user-friendly format strings (e.g., "EQ...", "UQ...", "kQ...", "0Q...") and raw format strings ("workchain:hash").

Parameters

ParameterTypeDescription
bytesBytesLikeBytes or string to convert.

Returns

string

TON raw address string in format "workchain:hash".

Throws

CCIPArgumentInvalidError if bytes length is invalid


getDestLeafHasher()

static getDestLeafHasher(lane: Lane, _ctx?: WithLogger): LeafHasher

Defined in: ton/index.ts:1005

Gets the leaf hasher for TON destination chains.

Parameters

ParameterTypeDescription
laneLaneLane configuration.
_ctx?WithLoggerContext containing logger.

Returns

LeafHasher

Leaf hasher function.


isTxHash()

static isTxHash(v: unknown): v is string

Defined in: ton/index.ts:973

Validates a transaction hash format for TON. Supports:

  • Raw 64-char hex hash (with or without 0x prefix)
  • Composite format: "workchain:address:lt:hash"

Parameters

ParameterType
vunknown

Returns

v is string


parse()

static parse(data: unknown): EVMExtraArgsV1 & { allowOutOfOrderExecution: boolean; } & { _tag: "EVMExtraArgsV2"; } | undefined

Defined in: ton/index.ts:1179

Parses raw TON data into typed structures.

Parameters

ParameterTypeDescription
dataunknownRaw data to parse.

Returns

Parsed data or undefined.

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


undefined