private void PrepareBloom() { if (_bloom != null) { // already prepared return; } _contractAddress = _smartContractAddressService.GetZeroSmartContractAddress(); _interestedEvent = new ChainPrimaryTokenSymbolSet(); _logEvent = _interestedEvent.ToLogEvent(_contractAddress); _bloom = _logEvent.GetBloom(); }
public async Task <string> GetPrimaryTokenSymbol() { PrepareBloom(); var blockHeader = await _blockchainService.GetBestChainLastBlockHeaderAsync(); if (blockHeader.Height != Constants.GenesisBlockHeight) { return(null); } var block = await _blockchainService.GetBlockByHashAsync(blockHeader.GetHash()); if (!_bloom.IsIn(new Bloom(block.Header.Bloom.ToByteArray()))) { // No interested event in the block return(null); } Logger.LogTrace("ChainPrimaryTokenSymbolSet event received."); foreach (var transactionId in block.Body.TransactionIds) { var result = await _transactionResultQueryService.GetTransactionResultAsync(transactionId); if (result == null) { Logger.LogTrace($"Transaction result is null, transactionId: {transactionId}"); continue; } if (result.Status == TransactionResultStatus.Failed) { Logger.LogTrace( $"Transaction failed, transactionId: {transactionId}, error: {result.Error}"); continue; } if (result.Bloom.Length == 0 || !_bloom.IsIn(new Bloom(result.Bloom.ToByteArray()))) { continue; } foreach (var log in result.Logs) { if (log.Address != _contractAddress || log.Name != _logEvent.Name) { continue; } var message = new ChainPrimaryTokenSymbolSet(); message.MergeFrom(log); Logger.LogTrace($"Chain primary token symbol: {message.TokenSymbol}"); return(message.TokenSymbol); } } return(null); }