UNPKG

stellar-plus

Version:

beta version of stellar-plus, an all-in-one sdk for the Stellar blockchain

125 lines (124 loc) 9.33 kB
"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;