# src/util/send-and-confirm-transaction.js

    // @flow

    import {Connection} from '../connection';
    import {Transaction} from '../transaction';
    import type {Account} from '../account';
    import type {ConfirmOptions} from '../connection';
    import type {TransactionSignature} from '../transaction';

    /**
     * Sign, send and confirm a transaction.
     *
     * If `commitment` option is not specified, defaults to 'max' commitment.
     *
     * @param {Connection} connection
     * @param {Transaction} transaction
     * @param {Array<Account>} signers
     * @param {ConfirmOptions} [options]
     * @returns {Promise<TransactionSignature>}
     */
    export async function sendAndConfirmTransaction(
      connection: Connection,
      transaction: Transaction,
      signers: Array<Account>,
      options?: ConfirmOptions,
    ): Promise<TransactionSignature> {
      const sendOptions = options && {
        skipPreflight: options.skipPreflight,
        preflightCommitment: options.preflightCommitment || options.commitment,
      };

      const signature = await connection.sendTransaction(
        transaction,
        signers,
        sendOptions,
      );

      const status = (
        await connection.confirmTransaction(
          signature,
          options && options.commitment,
        )
      ).value;

      if (status.err) {
        throw new Error(
          `Transaction ${signature} failed (${JSON.stringify(status)})`,
        );
      }

      return signature;
    }