Esempio n. 1
0
        public IWebSocketsClient CreateClient(IWebSocketsModule module, WebSocket webSocket, string client)
        {
            var socketsClient = module.CreateClient(webSocket, client);

            _modules.TryAdd(module.Name, module);

            return(socketsClient);
        }
Esempio n. 2
0
        public void AddModule(IWebSocketsModule module, bool isDefault = false)
        {
            _modules.TryAdd(module.Name, module);

            if (isDefault)
            {
                defaultModule = module;
            }
        }
Esempio n. 3
0
        public NdmAccountUpdater(IWebSocketsModule module, Address accountAddress, IBlockProcessor blockProcessor, IReadOnlyStateProvider stateProvider, Address?coldWalletAddress = null)
        {
            _blockProcessor    = blockProcessor ?? throw new ArgumentNullException(nameof(blockProcessor));
            _webSocketsModule  = module ?? throw new ArgumentNullException(nameof(module));
            _accountAddress    = accountAddress ?? throw new ArgumentNullException(nameof(accountAddress));
            _stateProvider     = stateProvider ?? throw new ArgumentNullException(nameof(stateProvider));
            _coldWalletAddress = coldWalletAddress;


            _blockProcessor.BlockProcessed += UpdateAccountBalance;
            _blockProcessor.BlockProcessed += UpdateAccountNonce;

            if (_coldWalletAddress != null)
            {
                _blockProcessor.BlockProcessed += UpdateColdWalletBalance;
                _blockProcessor.BlockProcessed += UpdateColdWalletNonce;
            }
        }
Esempio n. 4
0
 public NdmNotifier(IWebSocketsModule webSocketsModule)
 {
     _webSocketsModule = webSocketsModule;
 }
Esempio n. 5
0
        protected async Task PreInitAsync(INdmApi ndmApi)
        {
            if (ndmApi == null)
            {
                throw new ArgumentNullException(nameof(ndmApi));
            }

            IDbProvider?dbProvider = ndmApi.DbProvider;

            if (dbProvider == null)
            {
                throw new ArgumentNullException(nameof(dbProvider));
            }

            IConfigProvider configProvider = ndmApi.ConfigProvider;
            ILogManager     logManager     = ndmApi.LogManager;

            if (!(configProvider.GetConfig <INdmConfig>() is NdmConfig defaultConfig))
            {
                return;
            }

            if (!defaultConfig.Enabled)
            {
                return;
            }

            if (defaultConfig.StoreConfigInDatabase && string.IsNullOrWhiteSpace(defaultConfig.Id))
            {
                throw new ArgumentException("NDM config stored in database requires an id.", nameof(defaultConfig.Id));
            }

            IConfigRepository     configRepository;
            IEthRequestRepository ethRequestRepository;

            switch (defaultConfig.Persistence?.ToLowerInvariant())
            {
            case "mongo":
                ndmApi.MongoProvider = new MongoProvider(configProvider.GetConfig <INdmMongoConfig>(), logManager);
                IMongoDatabase?database = ndmApi.MongoProvider.GetDatabase();
                if (database == null)
                {
                    throw new ApplicationException("Failed to initialize Mongo database");
                }

                configRepository     = new ConfigMongoRepository(database);
                ethRequestRepository = new EthRequestMongoRepository(database);
                break;

            default:
                ndmApi.MongoProvider = NullMongoProvider.Instance;
                var ndmDbProvider = new NdmDbInitializer(defaultConfig, ndmApi.DbProvider, ndmApi.RocksDbFactory, ndmApi.MemDbFactory);
                await ndmDbProvider.Init();

                configRepository     = new ConfigRocksRepository(ndmApi.DbProvider.GetDb <IDb>(NdmDbNames.Configs), new NdmConfigDecoder());
                ethRequestRepository = new EthRequestRocksRepository(ndmApi.DbProvider.GetDb <IDb>(NdmDbNames.EthRequests),
                                                                     new EthRequestDecoder());
                break;
            }

            ndmApi.ConfigManager = new ConfigManager(defaultConfig, configRepository);
            ndmApi.NdmConfig     = await ndmApi.ConfigManager.GetAsync(defaultConfig.Id);

            if (ndmApi.NdmConfig is null)
            {
                ndmApi.NdmConfig = defaultConfig;
                if (defaultConfig.StoreConfigInDatabase)
                {
                    await ndmApi.ConfigManager.UpdateAsync((NdmConfig)ndmApi.NdmConfig);
                }
            }

            IWebSocketsModule webSocketsModule = ndmApi.WebSocketsManager !.GetModule("ndm");

            ndmApi.NdmNotifier = new NdmNotifier(webSocketsModule);

            ndmApi.EthRequestService = new EthRequestService(ndmApi.NdmConfig.FaucetHost, logManager);

            string baseDbPath = configProvider.GetConfig <IInitConfig>().BaseDbPath;

            ndmApi.BaseDbPath = DbPath = Path.Combine(baseDbPath, ndmApi.NdmConfig.DatabasePath);

            await _ndmModule.InitAsync();

            if (ndmApi.NdmConfig.FaucetEnabled)
            {
                // faucet should be separate from NDM? but it uses MongoDB?
                // so maybe we could extract Mongo DB beyond NDM? why would it be related?
                if (string.IsNullOrWhiteSpace(ndmApi.NdmConfig.FaucetAddress))
                {
                    ndmApi.NdmFaucet = EmptyFaucet.Instance;
                    _logger.Warn("Faucet cannot be started due to missing faucet address configuration.");
                }
                else
                {
                    Address faucetAddress = new(ndmApi.NdmConfig.FaucetAddress);
                    ndmApi.NdmFaucet = new NdmFaucet(
                        ndmApi.BlockchainBridge,
                        ethRequestRepository,
                        faucetAddress,
                        ndmApi.NdmConfig.FaucetWeiRequestMaxValue,
                        ndmApi.NdmConfig.FaucetEthDailyRequestsTotalValue,
                        ndmApi.NdmConfig.FaucetEnabled,
                        ndmApi.Timestamper,
                        ndmApi.Wallet,
                        logManager);
                }
            }
            else
            {
                ndmApi.NdmFaucet = EmptyFaucet.Instance;
            }

            ndmApi.ConsumerAddress = string.IsNullOrWhiteSpace(ndmApi.NdmConfig.ConsumerAddress)
                ? Address.Zero
                : new Address(ndmApi.NdmConfig.ConsumerAddress);
            ndmApi.ProviderAddress = string.IsNullOrWhiteSpace(ndmApi.NdmConfig.ProviderAddress)
                ? Address.Zero
                : new Address(ndmApi.NdmConfig.ProviderAddress);

            await _ndmConsumersModule.Init();
        }
Esempio n. 6
0
        public static void UseWebSocketsModules(this IApplicationBuilder app)
        {
            IWebSocketsManager webSocketsManager;
            ILogger            logger;

            using (var scope = app.ApplicationServices.CreateScope())
            {
                webSocketsManager = scope.ServiceProvider.GetService <IWebSocketsManager>();
                logger            = scope.ServiceProvider.GetService <ILogManager>().GetClassLogger();
            }

            app.Use(async(context, next) =>
            {
                var id     = string.Empty;
                var client = string.Empty;
                IWebSocketsModule module = null;
                try
                {
                    string moduleName = String.Empty;
                    if (context.Request.Path.HasValue)
                    {
                        var path   = context.Request.Path.Value;
                        moduleName = path.Split("/").LastOrDefault();
                    }

                    module = webSocketsManager.GetModule(moduleName);
                    if (module is null)
                    {
                        context.Response.StatusCode = 400;
                        return;
                    }

                    if (!module.TryInit(context.Request))
                    {
                        context.Response.StatusCode = 400;
                        return;
                    }

                    client = context.Request.Query.TryGetValue("client", out var clientValues)
                        ? clientValues.FirstOrDefault()
                        : string.Empty;

                    if (logger.IsInfo)
                    {
                        logger.Info($"Initializing WebSockets for client: '{client}'.");
                    }
                    var webSocket     = await context.WebSockets.AcceptWebSocketAsync();
                    var socketsClient = webSocketsManager.CreateClient(module, webSocket, client);
                    id = socketsClient.Id;
                    await webSocket.ReceiveAsync(socketsClient);
                }
                catch (Exception ex)
                {
                    logger.Error("WebSockets error.", ex);
                }
                finally
                {
                    if (!(module is null) && !string.IsNullOrWhiteSpace(id))
                    {
                        module.RemoveClient(id);
                        if (logger.IsInfo)
                        {
                            logger.Info($"Closing WebSockets for client: '{client}'.");
                        }
                    }
                }
            });
        }
Esempio n. 7
0
 public void AddModule(IWebSocketsModule module)
 {
     _modules.TryAdd(module.Name, module);
 }
Esempio n. 8
0
        public async Task InitAsync()
        {
            AddDecoders();
            var logManager = _api.LogManager;
            var logger     = logManager.GetClassLogger();
            var skipDepositVerification                = HasEnabledVariable("SKIP_DEPOSIT_VERIFICATION");
            var backgroundServicesDisabled             = HasEnabledVariable("BACKGROUND_SERVICES_DISABLED");
            var disableSendingPaymentClaimTransaction  = HasEnabledVariable("SENDING_PAYMENT_CLAIM_TRANSACTION_DISABLED");
            var instantPaymentClaimVerificationEnabled = HasEnabledVariable("INSTANT_PAYMENT_CLAIM_VERIFICATION_ENABLED");

            if (skipDepositVerification)
            {
                if (logger.IsWarn)
                {
                    logger.Warn("*** NDM provider skipping deposit verification ***");
                }
            }

            if (backgroundServicesDisabled)
            {
                if (logger.IsWarn)
                {
                    logger.Warn("*** NDM provider background services are disabled ***");
                }
            }

            if (disableSendingPaymentClaimTransaction)
            {
                if (logger.IsWarn)
                {
                    logger.Warn("*** NDM provider sending payment claim transaction is disabled ***");
                }
            }

            if (instantPaymentClaimVerificationEnabled)
            {
                if (logger.IsWarn)
                {
                    logger.Warn("*** NDM provider instant payment claim verification is enabled ***");
                }
            }

            var blockchainBridge = _api.BlockchainBridge;
            var ndmConfig        = _api.NdmConfig;
            var txPool           = _api.TxPool;
            var dbConfig         = _api.ConfigProvider.GetConfig <IProviderDbConfig>();
            var contractAddress  = string.IsNullOrWhiteSpace(ndmConfig.ContractAddress)
                ? Address.Zero
                : new Address(ndmConfig.ContractAddress);

            _gasPriceService = _api.GasPriceService;
            var dbInitializer = new ProviderDbInitializer(_api.DbProvider, dbConfig, _api.RocksDbFactory, _api.MemDbFactory);
            await dbInitializer.Init();

            var consumerRlpDecoder        = new ConsumerDecoder();
            var dataAssetRlpDecoder       = new DataAssetDecoder();
            var depositApprovalRlpDecoder = new DepositApprovalDecoder();
            var paymentClaimRlpDecoder    = new PaymentClaimDecoder();
            var receiptRlpDecoder         = new DataDeliveryReceiptDetailsDecoder();
            var sessionRlpDecoder         = new ProviderSessionDecoder();
            var unitsRangeRlpDecoder      = new UnitsRangeDecoder();
            var accountAddress            = string.IsNullOrWhiteSpace(ndmConfig.ProviderAddress)
                ? Address.Zero
                : new Address(ndmConfig.ProviderAddress);
            var coldWalletAddress = string.IsNullOrWhiteSpace(ndmConfig.ProviderColdWalletAddress)
                ? Address.Zero
                : new Address(ndmConfig.ProviderColdWalletAddress);
            var depositService = new DepositService(blockchainBridge, _api.AbiEncoder,
                                                    _api.Wallet, contractAddress);
            var paymentService = new PaymentService(blockchainBridge, _api.AbiEncoder,
                                                    _api.Wallet, contractAddress, logManager, txPool);
            var refundPolicy = new RefundPolicy();
            var dataAvailabilityValidator = new DataAvailabilityValidator();
            var transactionVerifier       = new TransactionVerifier(blockchainBridge, ndmConfig.BlockConfirmations);
            var transactionService        = _api.TransactionService;
            var timestamper = _api.Timestamper;

            IConsumerRepository  consumerRepository;
            IDataAssetRepository dataAssetRepository;
            IProviderDepositApprovalRepository depositApprovalRepository;
            IPaymentClaimRepository            paymentClaimRepository;
            IProviderSessionRepository         sessionRepository;
            IReceiptRepository receiptRepository;

            switch (ndmConfig.Persistence?.ToLowerInvariant())
            {
            case "mongo":
                IMongoDatabase?database = _api.MongoProvider.GetDatabase();
                if (database == null)
                {
                    throw new InvalidOperationException("Failed to initialize Mongo DB for NDM");
                }

                consumerRepository        = new ConsumerMongoRepository(database);
                dataAssetRepository       = new DataAssetMongoRepository(database);
                depositApprovalRepository = new ProviderDepositApprovalMongoRepository(database);
                paymentClaimRepository    = new PaymentClaimMongoRepository(database);
                receiptRepository         = new ReceiptMongoRepository(database, "providerReceipts");
                sessionRepository         = new ProviderSessionMongoRepository(database);
                break;

            default:
                consumerRepository = new ConsumerRocksRepository(_api.Db <IDb>(ProviderDbNames.Consumers),
                                                                 consumerRlpDecoder);
                dataAssetRepository = new DataAssetRocksRepository(_api.Db <IDb>(ProviderDbNames.DataAssets),
                                                                   dataAssetRlpDecoder);
                depositApprovalRepository = new ProviderDepositApprovalRocksRepository(
                    _api.Db <IDb>(ProviderDbNames.ProviderDepositApprovals), depositApprovalRlpDecoder);
                paymentClaimRepository = new PaymentClaimRocksRepository(_api.Db <IDb>(ProviderDbNames.PaymentClaims),
                                                                         paymentClaimRlpDecoder);
                receiptRepository = new ReceiptRocksRepository(_api.Db <IDb>(ProviderDbNames.ProviderReceipts),
                                                               receiptRlpDecoder);
                sessionRepository = new ProviderSessionRocksRepository(_api.Db <IDb>(ProviderDbNames.ProviderSessions),
                                                                       sessionRlpDecoder);
                break;
            }

            var wallet = _api.Wallet;
            var depositHandlerFactory = new DepositNodesHandlerFactory();

            _providerThresholdsService = new ProviderThresholdsService(_api.ConfigManager, ndmConfig.Id, logManager);

            var receiptsPolicies = new ReceiptsPolicies(_providerThresholdsService);

            IPaymentClaimProcessor paymentClaimProcessor = new PaymentClaimProcessor(_gasPriceService,
                                                                                     consumerRepository, paymentClaimRepository, paymentService, coldWalletAddress, timestamper,
                                                                                     unitsRangeRlpDecoder, logManager, disableSendingPaymentClaimTransaction);

            if (instantPaymentClaimVerificationEnabled)
            {
                paymentClaimProcessor = new InstantPaymentClaimProcessor(paymentClaimProcessor, paymentClaimRepository,
                                                                         logManager);
            }

            var receiptProcessor = new ReceiptProcessor(sessionRepository, _api.AbiEncoder,
                                                        _api.EthereumEcdsa, logManager);

            var sessionManager = new SessionManager(sessionRepository, _api.Timestamper,
                                                    logManager);

            _depositManager = new DepositManager(depositHandlerFactory, sessionManager, receiptsPolicies, wallet,
                                                 accountAddress, receiptProcessor, paymentClaimProcessor, consumerRepository, paymentClaimRepository,
                                                 receiptRepository, sessionRepository, timestamper, _gasPriceService, logManager);

            _providerService = new ProviderService(_api.ConfigManager, ndmConfig.Id,
                                                   consumerRepository, dataAssetRepository, depositApprovalRepository, paymentClaimRepository,
                                                   paymentClaimProcessor, sessionRepository, timestamper, _api.EthereumEcdsa,
                                                   _api.AbiEncoder, _api.NdmDataPublisher, _gasPriceService,
                                                   dataAvailabilityValidator, sessionManager, transactionVerifier, _depositManager, refundPolicy,
                                                   depositService, wallet, blockchainBridge, accountAddress, coldWalletAddress,
                                                   _api.Enode.PublicKey, ndmConfig.ProviderName, ndmConfig.FilesPath,
                                                   ndmConfig.FileMaxSize, ndmConfig.BlockConfirmations, paymentService.GasLimit, logManager,
                                                   skipDepositVerification, backgroundServicesDisabled);

            _reportService = new ReportService(consumerRepository, paymentClaimRepository);

            _providerTransactionsService = new ProviderTransactionsService(transactionService,
                                                                           paymentClaimRepository, timestamper, logManager);

            _providerGasLimitsService = new ProviderGasLimitsService(paymentService);

            IWebSocketsModule ndmWebSocketsModule = _api.WebSocketsManager.GetModule("ndm");

            _api.NdmAccountUpdater = ndmConfig.ProviderColdWalletAddress != null
                                                                        ? new NdmAccountUpdater(ndmWebSocketsModule, _providerService.GetAddress(), _api.MainBlockProcessor, _api.StateProvider, new Address(ndmConfig.ProviderColdWalletAddress))
                                                                        : new NdmAccountUpdater(ndmWebSocketsModule, _providerService.GetAddress(), _api.MainBlockProcessor, _api.StateProvider);
        }
Esempio n. 9
0
        public async Task Init()
        {
            AddDecoders();
            ILogManager logManager = _api.LogManager;
            ILogger     logger     = logManager.GetClassLogger();

            bool disableSendingDepositTransaction  = HasEnabledVariable("SENDING_DEPOSIT_TRANSACTION_DISABLED");
            bool instantDepositVerificationEnabled = HasEnabledVariable("INSTANT_DEPOSIT_VERIFICATION_ENABLED");
            bool backgroundServicesDisabled        = HasEnabledVariable("BACKGROUND_SERVICES_DISABLED");

            if (disableSendingDepositTransaction)
            {
                if (logger.IsWarn)
                {
                    logger.Warn("*** NDM sending deposit transaction is disabled ***");
                }
            }

            if (instantDepositVerificationEnabled)
            {
                if (logger.IsWarn)
                {
                    logger.Warn("*** NDM instant deposit verification is enabled ***");
                }
            }

            if (backgroundServicesDisabled)
            {
                if (logger.IsWarn)
                {
                    logger.Warn("*** NDM background services are disabled ***");
                }
            }

            INdmConfig ndmConfig       = _api.NdmConfig;
            string     configId        = ndmConfig.Id;
            IDbConfig  dbConfig        = _api.ConfigProvider.GetConfig <IDbConfig>();
            Address    contractAddress = string.IsNullOrWhiteSpace(ndmConfig.ContractAddress)
                ? Address.Zero
                : new Address(ndmConfig.ContractAddress);
            DepositDetailsDecoder             depositDetailsRlpDecoder  = new DepositDetailsDecoder();
            DepositApprovalDecoder            depositApprovalRlpDecoder = new DepositApprovalDecoder();
            DataDeliveryReceiptDetailsDecoder receiptRlpDecoder         = new DataDeliveryReceiptDetailsDecoder();
            ConsumerSessionDecoder            sessionRlpDecoder         = new ConsumerSessionDecoder();
            ReceiptRequestValidator           receiptRequestValidator   = new ReceiptRequestValidator(logManager);

            IDepositDetailsRepository          depositRepository;
            IConsumerDepositApprovalRepository depositApprovalRepository;
            IProviderRepository        providerRepository;
            IReceiptRepository         receiptRepository;
            IConsumerSessionRepository sessionRepository;
            IDepositUnitsCalculator    depositUnitsCalculator;

            switch (ndmConfig.Persistence?.ToLowerInvariant())
            {
            case "mongo":
                IMongoDatabase?database = _api.MongoProvider.GetDatabase();
                if (database == null)
                {
                    throw new ApplicationException("Failed to initialize Mongo DB.");
                }

                sessionRepository         = new ConsumerSessionMongoRepository(database);
                depositUnitsCalculator    = new DepositUnitsCalculator(sessionRepository, _api.Timestamper);
                depositRepository         = new DepositDetailsMongoRepository(database, depositUnitsCalculator);
                depositApprovalRepository = new ConsumerDepositApprovalMongoRepository(database);
                providerRepository        = new ProviderMongoRepository(database);
                receiptRepository         = new ReceiptMongoRepository(database, "consumerReceipts");
                break;

            case "memory":
                if (logger.IsWarn)
                {
                    logger.Warn("*** NDM is using in memory database ***");
                }
                DepositsInMemoryDb depositsDatabase = new DepositsInMemoryDb();
                sessionRepository         = new ConsumerSessionInMemoryRepository();
                depositUnitsCalculator    = new DepositUnitsCalculator(sessionRepository, _api.Timestamper);
                depositRepository         = new DepositDetailsInMemoryRepository(depositsDatabase, depositUnitsCalculator);
                depositApprovalRepository = new ConsumerDepositApprovalInMemoryRepository();
                providerRepository        = new ProviderInMemoryRepository(depositsDatabase);
                receiptRepository         = new ReceiptInMemoryRepository();
                break;

            default:
                var dbInitializer = new ConsumerNdmDbInitializer(_api.DbProvider, ndmConfig, _api.RocksDbFactory, _api.MemDbFactory);
                await dbInitializer.InitAsync();

                sessionRepository = new ConsumerSessionRocksRepository(_api.Db <IDb>(ConsumerNdmDbNames.ConsumerSessions),
                                                                       sessionRlpDecoder);
                depositUnitsCalculator = new DepositUnitsCalculator(sessionRepository, _api.Timestamper);
                depositRepository      = new DepositDetailsRocksRepository(_api.Db <IDb>(ConsumerNdmDbNames.Deposits),
                                                                           depositDetailsRlpDecoder, depositUnitsCalculator);
                depositApprovalRepository = new ConsumerDepositApprovalRocksRepository(
                    _api.Db <IDb>(ConsumerNdmDbNames.ConsumerDepositApprovals), depositApprovalRlpDecoder);
                providerRepository = new ProviderRocksRepository(_api.Db <IDb>(ConsumerNdmDbNames.Deposits),
                                                                 depositDetailsRlpDecoder);
                receiptRepository = new ReceiptRocksRepository(_api.Db <IDb>(ConsumerNdmDbNames.ConsumerReceipts),
                                                               receiptRlpDecoder);

                break;
            }

            uint                 requiredBlockConfirmations = ndmConfig.BlockConfirmations;
            IAbiEncoder          abiEncoder       = _api.AbiEncoder;
            INdmBlockchainBridge blockchainBridge = _api.BlockchainBridge;
            IBlockProcessor      blockProcessor   = _api.MainBlockProcessor;
            IConfigManager       configManager    = _api.ConfigManager;
            Address              consumerAddress  = _api.ConsumerAddress;
            ICryptoRandom        cryptoRandom     = _api.CryptoRandom;
            IDepositService      depositService   = _api.DepositService;

            gasPriceService = _api.GasPriceService;
            IEthereumEcdsa ecdsa = _api.EthereumEcdsa;

            ethRequestService         = _api.EthRequestService;
            jsonRpcNdmConsumerChannel = _api.JsonRpcNdmConsumerChannel;
            INdmNotifier ndmNotifier   = _api.NdmNotifier;
            PublicKey    nodePublicKey = _api.Enode.PublicKey;

            timestamper = _api.Timestamper;
            IWallet                wallet                = _api.Wallet;
            IHttpClient            httpClient            = _api.HttpClient;
            IJsonRpcClientProxy?   jsonRpcClientProxy    = _api.JsonRpcClientProxy;
            IEthJsonRpcClientProxy?ethJsonRpcClientProxy = _api.EthJsonRpcClientProxy;
            TransactionService     transactionService    = _api.TransactionService;
            IMonitoringService     monitoringService     = _api.MonitoringService;
            IWebSocketsModule      ndmWebSocketsModule   = _api.WebSocketsManager.GetModule("ndm");

            monitoringService?.RegisterMetrics(typeof(Metrics));

            DataRequestFactory  dataRequestFactory  = new DataRequestFactory(wallet, nodePublicKey);
            TransactionVerifier transactionVerifier = new TransactionVerifier(blockchainBridge, requiredBlockConfirmations);
            DepositProvider     depositProvider     = new DepositProvider(depositRepository, depositUnitsCalculator, logManager);
            KycVerifier         kycVerifier         = new KycVerifier(depositApprovalRepository, logManager);
            ConsumerNotifier    consumerNotifier    = new ConsumerNotifier(ndmNotifier);

            DataAssetService   dataAssetService   = new DataAssetService(providerRepository, consumerNotifier, logManager);
            ProviderService    providerService    = new ProviderService(providerRepository, consumerNotifier, logManager);
            DataRequestService dataRequestService = new DataRequestService(dataRequestFactory, depositProvider, kycVerifier, wallet,
                                                                           providerService, timestamper, sessionRepository, consumerNotifier, logManager);

            SessionService sessionService = new SessionService(providerService, depositProvider, dataAssetService,
                                                               sessionRepository, timestamper, consumerNotifier, logManager);
            DataConsumerService dataConsumerService = new DataConsumerService(depositProvider, sessionService,
                                                                              consumerNotifier, timestamper, sessionRepository, logManager);
            DataStreamService dataStreamService = new DataStreamService(dataAssetService, depositProvider,
                                                                        providerService, sessionService, wallet, consumerNotifier, sessionRepository, logManager);
            DepositApprovalService depositApprovalService = new DepositApprovalService(dataAssetService, providerService,
                                                                                       depositApprovalRepository, timestamper, consumerNotifier, logManager);
            DepositConfirmationService depositConfirmationService = new DepositConfirmationService(blockchainBridge, consumerNotifier,
                                                                                                   depositRepository, depositService, logManager, requiredBlockConfirmations);

            IDepositManager depositManager = new DepositManager(depositService, depositUnitsCalculator,
                                                                dataAssetService, kycVerifier, providerService, abiEncoder, cryptoRandom, wallet, gasPriceService,
                                                                depositRepository, timestamper, logManager, requiredBlockConfirmations,
                                                                disableSendingDepositTransaction);

            if (instantDepositVerificationEnabled)
            {
                depositManager = new InstantDepositManager(depositManager, depositRepository, timestamper, logManager,
                                                           requiredBlockConfirmations);
            }

            depositReportService = new DepositReportService(depositRepository, depositUnitsCalculator, receiptRepository, sessionRepository,
                                                            timestamper);
            ReceiptService receiptService = new ReceiptService(depositProvider, providerService, receiptRequestValidator,
                                                               sessionService, timestamper, receiptRepository, sessionRepository, abiEncoder, wallet, ecdsa,
                                                               nodePublicKey, logManager);
            RefundService refundService = new RefundService(blockchainBridge, abiEncoder, depositRepository,
                                                            contractAddress, logManager, wallet);
            RefundClaimant refundClaimant = new RefundClaimant(refundService, blockchainBridge, depositRepository,
                                                               transactionVerifier, gasPriceService, timestamper, logManager);

            _api.AccountService = new AccountService(configManager, dataStreamService, providerService,
                                                     sessionService, consumerNotifier, wallet, configId, consumerAddress, logManager);
            _api.NdmAccountUpdater = new NdmAccountUpdater(ndmWebSocketsModule, consumerAddress, _api.MainBlockProcessor, _api.ChainHeadStateProvider);
            ProxyService proxyService = new ProxyService(jsonRpcClientProxy, configManager, configId, logManager);

            _api.ConsumerService = new ConsumerService(_api.AccountService, dataAssetService, dataRequestService,
                                                       dataConsumerService, dataStreamService, depositManager, depositApprovalService, providerService,
                                                       receiptService, refundService, sessionService, proxyService);
            ethPriceService             = new EthPriceService(httpClient, timestamper, logManager);
            daiPriceService             = new DaiPriceService(httpClient, timestamper, logManager);
            consumerTransactionsService = new ConsumerTransactionsService(transactionService, depositRepository,
                                                                          timestamper, logManager);
            gasLimitsService = new ConsumerGasLimitsService(depositService, refundService);

            if (!backgroundServicesDisabled)
            {
                bool useDepositTimer = ndmConfig.ProxyEnabled;
                ConsumerServicesBackgroundProcessor consumerServicesBackgroundProcessor =
                    new ConsumerServicesBackgroundProcessor(
                        _api.AccountService,
                        refundClaimant,
                        depositConfirmationService,
                        ethPriceService,
                        daiPriceService,
                        _api.GasPriceService,
                        _api.MainBlockProcessor,
                        depositRepository,
                        consumerNotifier,
                        logManager,
                        useDepositTimer,
                        ethJsonRpcClientProxy);
                consumerServicesBackgroundProcessor.Init();
            }
        }
Esempio n. 10
0
        private static async Task ReceiveAsync(WebSocket webSocket, IWebSocketsClient client, IWebSocketsModule module)
        {
            var buffer = new byte[1024 * 4];
            var result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

            while (!result.CloseStatus.HasValue)
            {
                var data = buffer.Slice(0, result.Count);
                await module.ExecuteAsync(client, data);

                result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);
            }

            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);

            module.Cleanup(client);
        }