import { BlockhashWithExpiryBlockHeight, Keypair, PublicKey, SystemProgram, TransactionMessage, VersionedTransaction, } from "@solana/web3.js"; import { TransactionExecutor } from "./transaction-executor.interface"; import { logger } from "../helpers"; import axios, { AxiosError } from "axios"; import bs58 from "bs58"; import { Currency, CurrencyAmount } from "@raydium-io/raydium-sdk"; export class WarpTransactionExecutor implements TransactionExecutor { private readonly warpFeeWallet = new PublicKey("WARPzUMPnycu9eeCZ95rcAUxorqpBqHndfV3ZP5FSyS"); constructor(private readonly warpFee: string) {} public async executeAndConfirm( transaction: VersionedTransaction, payer: Keypair, latestBlockhash: BlockhashWithExpiryBlockHeight, ): Promise<{ confirmed: boolean; signature?: string; error?: string }> { logger.debug("Executing transaction..."); try { const fee = new CurrencyAmount(Currency.SOL, this.warpFee, false).raw.toNumber(); const warpFeeMessage = new TransactionMessage({ payerKey: payer.publicKey, recentBlockhash: latestBlockhash.blockhash, instructions: [ SystemProgram.transfer({ fromPubkey: payer.publicKey, toPubkey: this.warpFeeWallet, lamports: fee, }), ], }).compileToV0Message(); const warpFeeTx = new VersionedTransaction(warpFeeMessage); warpFeeTx.sign([payer]); const response = await axios.post<{ confirmed: boolean; signature: string; error?: string }>( "https://tx.warp.id/transaction/execute", { transactions: [bs58.encode(warpFeeTx.serialize()), bs58.encode(transaction.serialize())], latestBlockhash, }, { timeout: 100000, }, ); return response.data; } catch (error) { if (error instanceof AxiosError) { logger.trace({ error: error.response?.data }, "Failed to execute warp transaction"); } } return { confirmed: false }; } }