stellar-plus
Version:
beta version of stellar-plus, an all-in-one sdk for the Stellar blockchain
94 lines (93 loc) • 5.01 kB
JavaScript
;
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;