UNPKG

stellar-plus

Version:

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

94 lines (93 loc) 5.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AutoRestorePlugin = void 0; const tslib_1 = require("tslib"); const stellar_sdk_1 = require("@stellar/stellar-sdk"); const types_1 = require("../../../../../../stellar-plus/core/pipelines/build-transaction/types"); const types_2 = require("../../../../../../stellar-plus/core/pipelines/simulate-transaction/types"); const soroban_transaction_1 = require("../../../../../../stellar-plus/core/pipelines/soroban-transaction"); const rpc_1 = require("../../../../../../stellar-plus/rpc"); const inject_preprocess_parameter_1 = require("../../generic/inject-preprocess-parameter"); const fee_bump_1 = require("../../submit-transaction/fee-bump"); class AutoRestorePlugin { constructor(restoreTxInvocation, networkConfig, customRpcHandler) { this.type = types_2.SimulateTransactionPipelineType.id; this.name = 'AutoRestorePlugin'; this.sorobanTransactionPipelinePlugins = []; this.restoreTxInvocation = restoreTxInvocation; this.networkConfig = networkConfig; this.rpcHandler = customRpcHandler ? customRpcHandler : new rpc_1.DefaultRpcHandler(this.networkConfig); if (restoreTxInvocation.feeBump) { this.sorobanTransactionPipelinePlugins.push(new fee_bump_1.FeeBumpWrapperPlugin(restoreTxInvocation.feeBump)); } } postProcess(item, _meta) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const { response, assembledTransaction } = item; if (stellar_sdk_1.rpc.Api.isSimulationRestore(response)) { yield this.restore(response.restorePreamble); if (assembledTransaction.source === this.restoreTxInvocation.header.source) { const updatedTransaction = this.bumpSequence(assembledTransaction, response); return Object.assign(Object.assign({}, item), { assembledTransaction: updatedTransaction }); } } return item; }); } restore(restorePreamble) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const operation = stellar_sdk_1.Operation.restoreFootprint({}); const sorobanTransactionData = restorePreamble.transactionData.build(); const injectionParameter = { sorobanData: sorobanTransactionData }; const executionPluginToInjectSorobanData = new inject_preprocess_parameter_1.InjectPreprocessParameterPlugin(injectionParameter, types_1.BuildTransactionPipelineType.id, 'preProcess'); const sorobanTransactionPipeline = new soroban_transaction_1.SorobanTransactionPipeline(this.networkConfig, { rpcHandler: this.rpcHandler, plugins: this.sorobanTransactionPipelinePlugins, }); return yield sorobanTransactionPipeline.execute({ txInvocation: this.restoreTxInvocation, operations: [operation], networkConfig: this.networkConfig, options: { executionPlugins: [executionPluginToInjectSorobanData], }, }); }); } bumpSequence(transaction, simulationResponse) { var _a, _b; let updatedTimeBounds; if (transaction.timeBounds) { const additionalTimeout = this.restoreTxInvocation.header.timeout ? this.restoreTxInvocation.header.timeout : 30; updatedTimeBounds = { minTime: (_a = transaction.timeBounds) === null || _a === void 0 ? void 0 : _a.minTime, maxTime: (Number((_b = transaction.timeBounds) === null || _b === void 0 ? void 0 : _b.maxTime) + additionalTimeout).toString(), }; } // The sequence number extracted from the existing envelope is already bumped by 1 // so building the new envelope will automatically bump it once more. const sourceAccount = new stellar_sdk_1.Account(transaction.source, transaction.sequence); const updatedTransaction = new stellar_sdk_1.TransactionBuilder(sourceAccount, { fee: transaction.fee, memo: transaction.memo, networkPassphrase: transaction.networkPassphrase, timebounds: updatedTimeBounds, ledgerbounds: transaction.ledgerBounds, minAccountSequence: transaction.minAccountSequence, minAccountSequenceAge: transaction.minAccountSequenceAge, minAccountSequenceLedgerGap: transaction.minAccountSequenceLedgerGap, extraSigners: transaction.extraSigners, sorobanData: simulationResponse.transactionData.build(), }); transaction .toEnvelope() .v1() .tx() .operations() .forEach((op) => { updatedTransaction.addOperation(op); }); return updatedTransaction.build(); } } exports.AutoRestorePlugin = AutoRestorePlugin;