stellar-plus
Version:
beta version of stellar-plus, an all-in-one sdk for the Stellar blockchain
125 lines (124 loc) • 9.33 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SorobanTransactionPipeline = void 0;
const tslib_1 = require("tslib");
const build_transaction_1 = require("../../../../stellar-plus/core/pipelines/build-transaction");
const classic_sign_requirements_1 = require("../../../../stellar-plus/core/pipelines/classic-sign-requirements");
const sign_transaction_1 = require("../../../../stellar-plus/core/pipelines/sign-transaction");
const simulate_transaction_1 = require("../../../../stellar-plus/core/pipelines/simulate-transaction");
const soroban_auth_1 = require("../../../../stellar-plus/core/pipelines/soroban-auth");
const soroban_get_transaction_1 = require("../../../../stellar-plus/core/pipelines/soroban-get-transaction");
const types_1 = require("../../../../stellar-plus/core/pipelines/soroban-transaction/types");
const submit_transaction_1 = require("../../../../stellar-plus/core/pipelines/submit-transaction");
const horizon_1 = require("../../../../stellar-plus/horizon");
const rpc_1 = require("../../../../stellar-plus/rpc");
const multi_belt_pipeline_1 = require("../../../../stellar-plus/utils/pipeline/multi-belt-pipeline");
class SorobanTransactionPipeline extends multi_belt_pipeline_1.MultiBeltPipeline {
constructor(networkConfig, options) {
const internalConstructorArgs = {
beltType: types_1.SorobanTransactionPipelineType.id,
plugins: (options === null || options === void 0 ? void 0 : options.plugins) || [],
};
super(Object.assign(Object.assign({}, internalConstructorArgs), { type: types_1.SorobanTransactionPipelineType.id }));
this.networkConfig = networkConfig;
this.horizonHandler = new horizon_1.HorizonHandlerClient(this.networkConfig);
this.rpcHandler = (options === null || options === void 0 ? void 0 : options.customRpcHandler) || new rpc_1.DefaultRpcHandler(this.networkConfig);
}
process(item, itemId) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d;
const { txInvocation, operations, options } = item;
const executionPlugins = [];
if (options === null || options === void 0 ? void 0 : options.executionPlugins)
executionPlugins.push(...options.executionPlugins);
// ======================= Build Transaction ==========================
const buildTransactionPipelinePlugins = this.getInnerPluginsByType(executionPlugins, 'BuildTransactionPipeline');
const builTransactionPipeline = new build_transaction_1.BuildTransactionPipeline(buildTransactionPipelinePlugins);
const builtTx = yield builTransactionPipeline.execute({
header: txInvocation.header,
horizonHandler: this.horizonHandler,
operations,
networkPassphrase: this.networkConfig.networkPassphrase,
}, itemId);
// ======================= Simulate Transaction ==========================
const simulateTransactionPipelinePlugins = this.getInnerPluginsByType(executionPlugins, 'SimulateTransactionPipeline');
const simulateTransactionPipeline = new simulate_transaction_1.SimulateTransactionPipeline(simulateTransactionPipelinePlugins);
const successfulSimulation = yield simulateTransactionPipeline.execute({
transaction: builtTx,
rpcHandler: this.rpcHandler,
}, itemId);
if (options === null || options === void 0 ? void 0 : options.simulateOnly) {
if (this.isSimpleOutput(options)) {
return (_a = successfulSimulation === null || successfulSimulation === void 0 ? void 0 : successfulSimulation.output) === null || _a === void 0 ? void 0 : _a.value;
}
const verboseSimulatedOutput = (options === null || options === void 0 ? void 0 : options.verboseOutput)
? {
buildTransactionPipelineOutput: builtTx,
simulateTransactionPipelineOutput: successfulSimulation,
}
: {};
return Object.assign({ sorobanTransactionOutput: (_b = successfulSimulation === null || successfulSimulation === void 0 ? void 0 : successfulSimulation.output) === null || _b === void 0 ? void 0 : _b.value }, verboseSimulatedOutput);
}
// ======================= Assemble ==========================
const assembledTransaction = successfulSimulation.assembledTransaction;
// ======================= Soroban Auth ==========================
const sorobanAuthPipelinePlugins = this.getInnerPluginsByType(executionPlugins, 'SorobanAuthPipeline');
const sorobanAuthPipeline = new soroban_auth_1.SorobanAuthPipeline(sorobanAuthPipelinePlugins);
const sorobanAuthorizedTx = yield sorobanAuthPipeline.execute({
transaction: assembledTransaction,
simulation: successfulSimulation.response,
signers: txInvocation.signers,
rpcHandler: this.rpcHandler,
}, itemId);
// ======================= Calculate classic requirements ==========================
const classicSignRequirementsPipelinePlugins = this.getInnerPluginsByType(executionPlugins, 'ClassicSignRequirementsPipeline');
const classicSignRequirementsPipeline = new classic_sign_requirements_1.ClassicSignRequirementsPipeline(classicSignRequirementsPipelinePlugins);
const classicSignatureRequirements = yield classicSignRequirementsPipeline.execute(sorobanAuthorizedTx, itemId);
// ======================= Sign Transaction ==========================
const signTransactionPipelinePlugins = this.getInnerPluginsByType(executionPlugins, 'SignTransactionPipeline');
const signTransactionPipeline = new sign_transaction_1.SignTransactionPipeline(signTransactionPipelinePlugins);
const signedTransaction = yield signTransactionPipeline.execute({
transaction: sorobanAuthorizedTx,
signatureRequirements: classicSignatureRequirements,
signers: txInvocation.signers,
}, itemId);
// ======================= Submit Transaction ==========================
const submitTransactionPipelinePlugins = this.getInnerPluginsByType(executionPlugins, 'SubmitTransactionPipeline');
const submitTransactionPipeline = new submit_transaction_1.SubmitTransactionPipeline(submitTransactionPipelinePlugins);
const submissionResult = yield submitTransactionPipeline.execute({
transaction: signedTransaction,
networkHandler: this.rpcHandler,
}, itemId);
// ======================= Submission Follow Up ==========================
const sorobanGetTransactionPipelinePlugins = this.getInnerPluginsByType(executionPlugins, 'SorobanGetTransactionPipeline');
const sorobanGetTransactionPipeline = new soroban_get_transaction_1.SorobanGetTransactionPipeline({
plugins: sorobanGetTransactionPipelinePlugins,
});
const sorobanGetTransactionResult = yield sorobanGetTransactionPipeline.execute({
sorobanSubmission: submissionResult.response,
rpcHandler: this.rpcHandler,
transactionEnvelope: signedTransaction,
}, itemId);
if (this.isSimpleOutput(options)) {
return (_c = sorobanGetTransactionResult === null || sorobanGetTransactionResult === void 0 ? void 0 : sorobanGetTransactionResult.output) === null || _c === void 0 ? void 0 : _c.value;
}
const verboseExecutedOutput = (options === null || options === void 0 ? void 0 : options.verboseOutput)
? {
buildTransactionPipelineOutput: builtTx,
simulateTransactionPipelineOutput: successfulSimulation,
sorobanAuthPipelineOutput: sorobanAuthorizedTx,
classicSignRequirementsPipelineOutput: classicSignatureRequirements,
signTransactionPipelineOutput: signedTransaction,
submitTransactionPipelineOutput: submissionResult,
sorobanGetTransactionPipelineOutput: sorobanGetTransactionResult,
}
: {};
return Object.assign(Object.assign({}, verboseExecutedOutput), { sorobanTransactionOutput: (_d = sorobanGetTransactionResult === null || sorobanGetTransactionResult === void 0 ? void 0 : sorobanGetTransactionResult.output) === null || _d === void 0 ? void 0 : _d.value, hash: (options === null || options === void 0 ? void 0 : options.includeHashOutput) ? submissionResult.response.hash : undefined });
});
}
// expand with other options in the future that might require verbose output
isSimpleOutput(options) {
return !(options === null || options === void 0 ? void 0 : options.includeHashOutput) && !(options === null || options === void 0 ? void 0 : options.verboseOutput);
}
}
exports.SorobanTransactionPipeline = SorobanTransactionPipeline;