import { GelatoRelay } from "@gelatonetwork/relay-sdk" import relayTransaction, { BackoffRetrierOptions } from "./relayTransaction" import { TransactionSender, TransactionSenderResponse, type TransactionSenderRequest, } from "./TransactionSender" /** * Represents the Gelato Transaction Sender config. */ export type GelatoTransactionSenderConfig = { backoffRetrier: BackoffRetrierOptions } export class GelatoTransactionSender implements TransactionSender { readonly #relay: GelatoRelay readonly #relayApiKey: string readonly #config: GelatoTransactionSenderConfig constructor( relayApiKey: string, config: GelatoTransactionSenderConfig = { backoffRetrier: { retries: 5, backoffStepMs: 1000 }, }, ) { this.#relay = new GelatoRelay() this.#relayApiKey = relayApiKey this.#config = config } async sendTransaction( tx: TransactionSenderRequest, ): Promise { try { if (!tx.chainId) { throw new Error("Transaction request does not include chain id.") } const result = await relayTransaction( this.#relay, this.#relayApiKey, { target: tx.to as string, data: tx.data ?? "", chainId: BigInt(tx.chainId), }, this.#config.backoffRetrier, ) // eslint-disable-next-line no-console console.log(`Transaction successful with hash: ${result.transactionHash}`) return { hash: result.transactionHash ?? "0x" } } catch (error) { // eslint-disable-next-line no-console console.log(`Error relaying transaction: ${error}`) throw error } } }