createTransactionExecutionBoundary function

TransactionExecutionBoundary createTransactionExecutionBoundary(
  1. TransactionExecutionBoundaryConfig config
)

Creates a higher-level execution boundary from explicit planning, signing, and sending functions.

Implementation

TransactionExecutionBoundary createTransactionExecutionBoundary(
  TransactionExecutionBoundaryConfig config,
) {
  final executor = createTransactionPlanExecutor(
    TransactionPlanExecutorConfig(
      executeTransactionMessage: (context, message) async {
        final Transaction transaction;
        try {
          transaction = await config.signTransactionMessage(message);
          context['transaction'] = transaction;
        } on Object catch (error) {
          throw _TransactionExecutionStageError(
            TransactionExecutionFailureStage.signing,
            error,
          );
        }

        try {
          final signature = await config.sendSignedTransaction(transaction);
          context['signature'] = signature;
          return transaction;
        } on Object catch (error) {
          throw _TransactionExecutionStageError(
            TransactionExecutionFailureStage.sending,
            error,
          );
        }
      },
    ),
  );

  return (instructionPlan) async {
    final TransactionPlan transactionPlan;
    try {
      transactionPlan = await config.planTransactions(instructionPlan);
    } on Object catch (error) {
      return FailedTransactionExecution(
        stage: TransactionExecutionFailureStage.planning,
        error: error,
      );
    }

    try {
      final transactionPlanResult = await executor(transactionPlan);
      return SuccessfulTransactionExecution(
        transactionPlan: transactionPlan,
        transactionPlanResult: transactionPlanResult,
      );
    } on Object catch (error) {
      TransactionPlanResult? transactionPlanResult;
      if (isSolanaError(
        error,
        SolanaErrorCode.instructionPlansFailedToExecuteTransactionPlan,
      )) {
        final solanaError = error as SolanaError;
        final value = solanaError.context['transactionPlanResult'];
        if (value is TransactionPlanResult) {
          transactionPlanResult = value;
        }
      }

      transactionPlanResult ??= await _passthroughExecutionFailure(error);

      final failure = _extractExecutionFailure(error, transactionPlanResult);
      return FailedTransactionExecution(
        stage: failure.stage,
        error: failure.error,
        transactionPlan: transactionPlan,
        transactionPlanResult: transactionPlanResult,
      );
    }
  };
}