{"version":3,"file":"TransactionBuilderGroup.mjs","sources":["../../src/TransactionBuilderGroup.ts"],"sourcesContent":["import type { Context } from './Context';\nimport type {\n  RpcConfirmTransactionResult,\n  RpcSendTransactionOptions,\n} from './RpcInterface';\nimport { RpcConfirmTransactionStrategy } from './RpcInterface';\nimport { signAllTransactions } from './Signer';\nimport type {\n  BlockhashWithExpiryBlockHeight,\n  Transaction,\n  TransactionSignature,\n} from './Transaction';\nimport {\n  TransactionBuilder,\n  TransactionBuilderSendAndConfirmOptions,\n} from './TransactionBuilder';\nimport { zipMap } from './utils';\n\nexport type TransactionBuilderGroupOptions = {\n  /** Whether to run the builders in parallel or, if false, sequentially. */\n  parallel?: boolean;\n};\n\nexport class TransactionBuilderGroup {\n  constructor(\n    readonly builders: TransactionBuilder[] = [],\n    readonly options: TransactionBuilderGroupOptions = {}\n  ) {}\n\n  prepend(\n    builder: TransactionBuilder | TransactionBuilder[]\n  ): TransactionBuilderGroup {\n    const newBuilders = Array.isArray(builder) ? builder : [builder];\n    return new TransactionBuilderGroup(\n      [...newBuilders, ...this.builders],\n      this.options\n    );\n  }\n\n  append(\n    builder: TransactionBuilder | TransactionBuilder[]\n  ): TransactionBuilderGroup {\n    const newBuilders = Array.isArray(builder) ? builder : [builder];\n    return new TransactionBuilderGroup(\n      [...this.builders, ...newBuilders],\n      this.options\n    );\n  }\n\n  add(\n    builder: TransactionBuilder | TransactionBuilder[]\n  ): TransactionBuilderGroup {\n    return this.append(builder);\n  }\n\n  sequential(): TransactionBuilderGroup {\n    return new TransactionBuilderGroup(this.builders, {\n      ...this.options,\n      parallel: false,\n    });\n  }\n\n  parallel(): TransactionBuilderGroup {\n    return new TransactionBuilderGroup(this.builders, {\n      ...this.options,\n      parallel: true,\n    });\n  }\n\n  isParallel(): boolean {\n    return this.options.parallel ?? false;\n  }\n\n  merge(): TransactionBuilder {\n    if (this.builders.length === 0) {\n      return new TransactionBuilder();\n    }\n    return this.builders.reduce(\n      (builder, next) => builder.add(next),\n      this.builders[0].empty()\n    );\n  }\n\n  build(context: Pick<Context, 'transactions' | 'payer'>): Transaction[] {\n    return this.builders.map((builder) => builder.build(context));\n  }\n\n  async setLatestBlockhash(\n    context: Pick<Context, 'rpc'>\n  ): Promise<TransactionBuilderGroup> {\n    const hasBlockhashlessBuilder = this.builders.some(\n      (builder) => !builder.options.blockhash\n    );\n    if (!hasBlockhashlessBuilder) return this;\n    const blockhash = await context.rpc.getLatestBlockhash();\n    return this.map((builder) =>\n      builder.options.blockhash ? builder : builder.setBlockhash(blockhash)\n    );\n  }\n\n  async buildWithLatestBlockhash(\n    context: Pick<Context, 'transactions' | 'rpc' | 'payer'>\n  ): Promise<Transaction[]> {\n    return (await this.setLatestBlockhash(context)).build(context);\n  }\n\n  async buildAndSign(\n    context: Pick<Context, 'transactions' | 'rpc' | 'payer'>\n  ): Promise<Transaction[]> {\n    const transactions = await this.buildWithLatestBlockhash(context);\n    const signers = this.builders.map((builder) => builder.getSigners(context));\n    return signAllTransactions(\n      zipMap(transactions, signers, (transaction, txSigners) => ({\n        transaction,\n        signers: txSigners ?? [],\n      }))\n    );\n  }\n\n  async send(\n    context: Pick<Context, 'transactions' | 'rpc' | 'payer'>,\n    options: RpcSendTransactionOptions = {}\n  ): Promise<TransactionSignature[]> {\n    return this.runAll(await this.buildAndSign(context), async (tx) =>\n      context.rpc.sendTransaction(tx, options)\n    );\n  }\n\n  async sendAndConfirm(\n    context: Pick<Context, 'transactions' | 'rpc' | 'payer'>,\n    options: TransactionBuilderSendAndConfirmOptions = {}\n  ): Promise<\n    Array<{\n      signature: TransactionSignature;\n      result: RpcConfirmTransactionResult;\n    }>\n  > {\n    const blockhashWithExpiryBlockHeight = this.builders.find(\n      (builder) => typeof builder.options.blockhash === 'object'\n    )?.options.blockhash as BlockhashWithExpiryBlockHeight | undefined;\n\n    let strategy: RpcConfirmTransactionStrategy;\n    if (options.confirm?.strategy) {\n      strategy = options.confirm.strategy;\n    } else {\n      const blockhash =\n        blockhashWithExpiryBlockHeight ??\n        (await context.rpc.getLatestBlockhash());\n      strategy = options.confirm?.strategy ?? {\n        type: 'blockhash',\n        ...blockhash,\n      };\n    }\n\n    return this.runAll(await this.buildAndSign(context), async (tx) => {\n      const signature = await context.rpc.sendTransaction(tx, options.send);\n      const result = await context.rpc.confirmTransaction(signature, {\n        ...options.confirm,\n        strategy,\n      });\n      return { signature, result };\n    });\n  }\n\n  map(\n    fn: (\n      builder: TransactionBuilder,\n      index: number,\n      array: TransactionBuilder[]\n    ) => TransactionBuilder\n  ): TransactionBuilderGroup {\n    return new TransactionBuilderGroup(this.builders.map(fn));\n  }\n\n  filter(\n    fn: Parameters<Array<TransactionBuilder>['filter']>[0]\n  ): TransactionBuilderGroup {\n    return new TransactionBuilderGroup(this.builders.filter(fn));\n  }\n\n  async runAll<T, U>(\n    array: T[],\n    fn: (item: T, index: number, array: T[]) => Promise<U>\n  ): Promise<U[]> {\n    if (this.isParallel()) {\n      return Promise.all(array.map(fn));\n    }\n    return array.reduce(\n      async (promise, ...args) => [...(await promise), await fn(...args)],\n      Promise.resolve([] as U[])\n    );\n  }\n}\n\nexport function transactionBuilderGroup(\n  builders: TransactionBuilder[] = []\n): TransactionBuilderGroup {\n  return new TransactionBuilderGroup(builders);\n}\n"],"names":["TransactionBuilderGroup","constructor","builders","options","prepend","builder","newBuilders","Array","isArray","append","add","sequential","parallel","isParallel","merge","length","TransactionBuilder","reduce","next","empty","build","context","map","setLatestBlockhash","hasBlockhashlessBuilder","some","blockhash","rpc","getLatestBlockhash","setBlockhash","buildWithLatestBlockhash","buildAndSign","transactions","signers","getSigners","signAllTransactions","zipMap","transaction","txSigners","send","runAll","tx","sendTransaction","sendAndConfirm","blockhashWithExpiryBlockHeight","find","strategy","confirm","type","signature","result","confirmTransaction","fn","filter","array","Promise","all","promise","args","resolve","transactionBuilderGroup"],"mappings":"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"}