UNPKG

@xswap-link/sdk

Version:
96 lines (80 loc) 2.98 kB
// 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 }; } }