class ReversibleTransactionExecutor {

    public ProgramResult executeTransaction(
            Block executionBlock,
            UscAddress coinbase,
            byte[] gasPrice,
            byte[] gasLimit,
            byte[] toAddress,
            byte[] value,
            byte[] data,
            UscAddress fromAddress) {
        Repository repository = track.getSnapshotTo(executionBlock.getStateRoot()).startTracking();

        byte[] nonce = repository.getNonce(fromAddress).toByteArray();
        UnsignedTransaction tx = new UnsignedTransaction(
                nonce,
                gasPrice,
                gasLimit,
                toAddress,
                value,
                data,
                fromAddress
        );

        TransactionExecutor executor = new TransactionExecutor(
                tx, 0, coinbase, repository, blockStore, receiptStore,
                programInvokeFactory, executionBlock, new EthereumListenerAdapter(), 0, config.getVmConfig(),
                config.getBlockchainConfig(), config.playVM(), config.isRemascEnabled(), config.vmTrace(), new PrecompiledContracts(config),
                config.databaseDir(), config.vmTraceDir(), config.vmTraceCompressed()
        ).setLocalCall(true);

        executor.init();
        executor.execute();
        executor.go();
        executor.finalization();
        return executor.getResult();
    }

    @Autowired public  ReversibleTransactionExecutor(
            UscSystemProperties config,
            Repository track,
            BlockStore blockStore,
            ReceiptStore receiptStore,
            ProgramInvokeFactory programInvokeFactory);

}