/// <param name="settings">Application config</param>
        /// <param name="storage">Permanent storage object</param>
        /// <param name="useLegacyOrderbook"></param>
        public ExecutionContext(BaseSettings settings, IStorage storage, StellarDataProviderBase stellarDataProvider, bool useLegacyOrderbook = false)
        {
            PermanentStorage    = storage ?? throw new ArgumentNullException(nameof(storage));
            Settings            = settings ?? throw new ArgumentNullException(nameof(settings));
            StellarDataProvider = stellarDataProvider ?? throw new ArgumentNullException(nameof(settings));

            ExtensionsManager = new ExtensionsManager(settings.ExtensionsConfigFilePath);

            PersistenceManager = new PersistenceManager(PermanentStorage);
            QuantumProcessor   = new QuantumProcessorsStorage();

            PendingUpdatesManager = new PendingUpdatesManager(this);
            PendingUpdatesManager.OnBatchSaved += PendingUpdatesManager_OnBatchSaved;

            QuantumStorage = new QuantumStorage();

            this.useLegacyOrderbook = useLegacyOrderbook;
        }
        public virtual async Task Init()
        {
            DynamicSerializersInitializer.Init();

            await PermanentStorage.OpenConnection(Settings.ConnectionString);

            //try to load last settings, we need it to know current auditors
            var lastHash = new byte[] { };
            var lastApex = await PersistenceManager.GetLastApex();

            if (lastApex >= 0)
            {
                var lastQuantum = await PersistenceManager.GetQuantum(lastApex);

                lastHash = lastQuantum.Message.ComputeHash();
                var snapshot = await PersistenceManager.GetSnapshot(lastApex);
                await Setup(snapshot);

                if (IsAlpha)
                {
                    AppState.State = ApplicationState.Rising;//Alpha should ensure that it has all quanta from auditors
                }
                else
                {
                    AppState.State = ApplicationState.Running;
                }
            }
            else
            {
                //if no snapshot, the application is in initialization state
                AppState.State = ApplicationState.WaitingForInit;
            }

            var lastQuantumApex = lastApex < 0 ? 0 : lastApex;

            QuantumStorage.Init(lastQuantumApex, lastHash);
            QuantumHandler.Start();
        }