{"version":3,"file":"broadcastTransaction.cjs","sources":["../../../../src/transactions/broadcastTransaction.ts"],"sourcesContent":["import type {\n  Rpc,\n  SolanaRpcApi,\n  Base64EncodedWireTransaction,\n} from \"@solana/kit\";\nimport { BroadcastOptions } from \"./types\";\n\nexport const broadcastTransactionFactory = (raw: Rpc<SolanaRpcApi>) => {\n  return async function broadcastBase64(\n    wireTx64: string,\n    {\n      lastValidBlockHeightOffset = 150,\n      pollTimeoutMs = 60_000,\n      pollIntervalMs = 2_000,\n      skipPreflight = true,\n      commitment = \"confirmed\",\n      maxRetries = 0n,\n    }: BroadcastOptions = {}\n  ): Promise<string> {\n    if (lastValidBlockHeightOffset < 0) {\n      throw new Error(\"lastValidBlockHeightOffset must be a positive number\");\n    }\n\n    const signature = await raw\n      .sendTransaction(wireTx64 as Base64EncodedWireTransaction, {\n        encoding: \"base64\",\n        skipPreflight,\n        preflightCommitment: commitment,\n        maxRetries,\n      })\n      .send();\n\n    const bhInfo = await raw.getLatestBlockhash({ commitment }).send();\n    let lastValidBlockHeight = bhInfo.value.lastValidBlockHeight;\n\n    const chainHeight = Number(await raw.getBlockHeight().send());\n    const expiry = Math.min(\n      Number(lastValidBlockHeight),\n      chainHeight + lastValidBlockHeightOffset\n    );\n\n    // Poll signature status\n    const started = Date.now();\n\n    while (true) {\n      if (Date.now() - started > pollTimeoutMs) {\n        throw new Error(\"Transaction confirmation timed-out\");\n      }\n\n      const { value } = await raw\n        .getSignatureStatuses([signature], { searchTransactionHistory: false })\n        .send();\n      const status = value[0];\n\n      if (status) {\n        if (status.err) {\n          throw new Error(\n            `Transaction failed on-chain: ${JSON.stringify(status.err)}`\n          );\n        }\n        if (\n          status.confirmationStatus === \"confirmed\" ||\n          status.confirmationStatus === \"finalized\"\n        ) {\n          return signature;\n        }\n      }\n\n      const blockHeight = Number(await raw.getBlockHeight().send());\n      if (blockHeight > expiry) {\n        throw new Error(\n          \"Block height exceeded lastValidBlockHeight, and the transaction failed to land on-chain\"\n        );\n      }\n\n      await new Promise((r) => setTimeout(r, pollIntervalMs));\n    }\n  };\n};\n"],"names":[],"mappings":";;AAOO,MAAM,2BAA2B,GAAG,CAAC,GAAsB,KAAI;AACpE,IAAA,OAAO,eAAe,eAAe,CACnC,QAAgB,EAChB,EACE,0BAA0B,GAAG,GAAG,EAChC,aAAa,GAAG,KAAM,EACtB,cAAc,GAAG,IAAK,EACtB,aAAa,GAAG,IAAI,EACpB,UAAU,GAAG,WAAW,EACxB,UAAU,GAAG,EAAE,MACK,EAAE,EAAA;AAExB,QAAA,IAAI,0BAA0B,GAAG,CAAC,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC;QACzE;QAEA,MAAM,SAAS,GAAG,MAAM;aACrB,eAAe,CAAC,QAAwC,EAAE;AACzD,YAAA,QAAQ,EAAE,QAAQ;YAClB,aAAa;AACb,YAAA,mBAAmB,EAAE,UAAU;YAC/B,UAAU;SACX;AACA,aAAA,IAAI,EAAE;AAET,QAAA,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE;AAClE,QAAA,IAAI,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC,oBAAoB;AAE5D,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;AAC7D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CACrB,MAAM,CAAC,oBAAoB,CAAC,EAC5B,WAAW,GAAG,0BAA0B,CACzC;;AAGD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;QAE1B,OAAO,IAAI,EAAE;YACX,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,aAAa,EAAE;AACxC,gBAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;YACvD;AAEA,YAAA,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM;iBACrB,oBAAoB,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE;AACrE,iBAAA,IAAI,EAAE;AACT,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;YAEvB,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,MAAM,CAAC,GAAG,EAAE;AACd,oBAAA,MAAM,IAAI,KAAK,CACb,CAAA,6BAAA,EAAgC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,CAAE,CAC7D;gBACH;AACA,gBAAA,IACE,MAAM,CAAC,kBAAkB,KAAK,WAAW;AACzC,oBAAA,MAAM,CAAC,kBAAkB,KAAK,WAAW,EACzC;AACA,oBAAA,OAAO,SAAS;gBAClB;YACF;AAEA,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;AAC7D,YAAA,IAAI,WAAW,GAAG,MAAM,EAAE;AACxB,gBAAA,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F;YACH;AAEA,YAAA,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACzD;AACF,IAAA,CAAC;AACH;;;;"}