diff --git a/src/exceptions/exceptions.ts b/src/exceptions/exceptions.ts index 73c0d639..59031150 100644 --- a/src/exceptions/exceptions.ts +++ b/src/exceptions/exceptions.ts @@ -102,6 +102,15 @@ export class CCTPDoesNotSupportedError extends SdkRootError { } } +export class TxTooLargeError extends SdkRootError { + constructor() { + super( + ErrorCode.TX_TOO_LARGE, + "Transaction too large: try again later or switch to another messenger or pay relayer fee in native gas currency" + ); + } +} + export enum ErrorCode { SDK_ERROR = "SdkError", INVALID_AMOUNT_ERROR = "InvalidAmountError", @@ -118,4 +127,5 @@ export enum ErrorCode { TIMEOUT_ERROR = "TimeoutError", NODE_RPC_URL_NOT_INITIALIZED_ERROR = "NodeRpcUrlNotInitializedError", CCTP_DOES_NOT_SUPPORTED_ERROR = "CCTPDoesNotSupportedError", + TX_TOO_LARGE = "TxTooLargeError", } diff --git a/src/services/utils/sol/compute-budget.ts b/src/services/utils/sol/compute-budget.ts index b7c1ba47..99deb963 100644 --- a/src/services/utils/sol/compute-budget.ts +++ b/src/services/utils/sol/compute-budget.ts @@ -8,6 +8,7 @@ import { VersionedTransaction, } from "@solana/web3.js"; import { Big } from "big.js"; +import { TxTooLargeError } from "../../../exceptions"; import { toPowBase10 } from "../../../utils/calculation"; import { fetchAddressLookupTableAccountsFromTx } from "../../../utils/sol/utils"; import { SolanaAutoTxFee, TxFeeParams } from "../../models"; @@ -33,6 +34,11 @@ export async function addUnitLimitAndUnitPriceToVersionedTx( const message = TransactionMessage.decompile(transaction.message, { addressLookupTableAccounts: addressLookupTableAccounts, }); + + if (transaction.serialize().length > 1232) { + throw new TxTooLargeError(); + } + /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */ const simUnitsConsumed = (await connection.simulateTransaction(transaction, { replaceRecentBlockhash: true })).value .unitsConsumed!;