public async Task Monitoring() { var currentBlock = await _settingsRepository.Get <int>(Constants.ProcessingBlockSetting); if (currentBlock == 0) { currentBlock = await _rpcBitcoinClient.GetBlockCount() - 1; } var dbCommitments = (await _commitmentRepository.GetMonitoringCommitments()).GroupBy(o => o.LockedAddress).ToDictionary(o => o.Key, o => o); do { var block = await _qBitNinjaApiCaller.GetBlock(currentBlock); if (block == null) { break; } foreach (var transaction in block.Block.Transactions) { var marker = transaction.GetColoredMarker(); foreach (var transactionOutput in transaction.Outputs.AsIndexedOutputs()) { var address = transactionOutput.TxOut.ScriptPubKey.GetDestinationAddress(_connectionParams.Network)?.ToString(); if (address != null && dbCommitments.ContainsKey(address)) { var commitments = dbCommitments[address].OrderByDescending(o => o.CreateDt).ToList(); ICoin coin = new Coin(transaction, transactionOutput.TxOut).ToScriptCoin(commitments[0].LockedScript.ToScript()); decimal amount; if (marker == null) { amount = transactionOutput.TxOut.Value.ToDecimal(MoneyUnit.BTC); } else { var asset = await _assetRepository.GetAssetById(commitments[0].AssetId); var assetMoney = new AssetMoney(new BitcoinAssetId(asset.BlockChainAssetId).AssetId, marker.Quantities[transactionOutput.N - 1]); coin = ((Coin)coin).ToColoredCoin(assetMoney); amount = assetMoney.ToDecimal(asset.MultiplierPower); } var commitment = commitments.FirstOrDefault(o => o.Type == CommitmentType.Hub && o.HubAmount == amount || o.Type == CommitmentType.Client && o.ClientAmount == amount); if (commitment != null) { await ProcessBroadcastedCommitment(commitment, coin); } } } } currentBlock++; await _settingsRepository.Set(Constants.ProcessingBlockSetting, currentBlock); } while (true); }