createTransactionExecutionBoundary function
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,
);
}
};
}