@xswap-link/sdk
Version:
JavaScript SDK for XSwap platform
96 lines (80 loc) • 2.98 kB
text/typescript
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { createErrorEnhancer } from "../../utils/errors";
import { CCIPContext } from "../models";
/**
* Parses a CCIP message sent event from a transaction
*
* @param context SDK context with provider, config and logger
* @param txSignature Transaction signature
* @returns Parsed event data with messageId if available
*/
export async function parseCCIPMessageSentEvent(
context: CCIPContext,
txSignature: string,
): Promise<{
messageId?: string;
}> {
if (!context.logger) {
throw new Error("Logger is required for parseCCIPMessageSentEvent");
}
const logger = context.logger;
const config = context.config;
const connection = context.provider.connection;
const enhanceError = createErrorEnhancer(logger);
try {
logger.info(
`Parsing CCIP message sent event for transaction: ${txSignature}`,
);
// Get transaction details with logs
logger.debug(`Fetching transaction details with logs`);
const tx = await connection.getParsedTransaction(txSignature, {
commitment: "confirmed",
maxSupportedTransactionVersion: 0,
});
if (!tx || !tx.meta || !tx.meta.logMessages) {
logger.warn(`No transaction logs found for ${txSignature}`);
return { messageId: undefined };
}
// Get the router program ID as string for comparison
const routerProgramId = config.ccipRouterProgramId.toString();
logger.debug(
`Looking for program return log from CCIP Router: ${routerProgramId}`,
);
// Log messages in TRACE mode
logger.trace("Transaction logs:", tx.meta.logMessages);
// Look for the program return log from the CCIP Router program
const programReturnLog = tx.meta.logMessages.find((log) =>
log.includes(`Program return: ${routerProgramId}`),
);
if (programReturnLog) {
logger.debug(`Found CCIP program return log`);
// Extract the base64 data after the program ID
const parts = programReturnLog.split(
`Program return: ${routerProgramId} `,
);
if (parts.length > 1) {
const base64Data = parts[1].trim();
logger.trace(`Extracted base64 data: ${base64Data}`);
const buffer = Buffer.from(base64Data, "base64");
// The buffer should contain the messageId (32 bytes)
const messageIdHex = "0x" + buffer.toString("hex");
logger.info(`Successfully extracted messageId: ${messageIdHex}`);
return {
messageId: messageIdHex,
};
}
}
logger.warn(
`Could not find CCIP Router program return log in transaction logs`,
);
return { messageId: undefined };
} catch (error) {
enhanceError(new Error(`Failed to parse message ID from transaction`), {
operation: "parseCCIPMessageSentEvent",
txSignature,
error: error instanceof Error ? error.message : String(error),
});
return { messageId: undefined };
}
}