public async Task <string> LoadHistoryFromActualTx() { try { var allLoaded = false; var actualTxLoading = ActualStateTxId; while (!allLoaded) { var info = await NeblioTransactionHelpers.TransactionInfoAsync(null, TransactionTypes.Neblio, actualTxLoading); if (info == null) { return(await Task.FromResult("OK - No History yet.")); } if (info.VoutTokens != null) { if (info.VoutTokens.Count > 0) { var token = info.VoutTokens[0]; if (token.Metadata != null) { if (token.Metadata.Count > 0) { if (token.Metadata.TryGetValue("GameId", out var gameid)) { if (gameid == Id.ToString()) { if (token.Metadata.TryGetValue("GameData", out var gameData)) { if (!string.IsNullOrEmpty(gameData)) { try { var parsedData = JsonConvert.DeserializeObject <ChessGameDto>(gameData); if (parsedData != null) { if (parsedData.GameId == Id.ToString() && parsedData.Type == GameDtoTypes.ChessGame) { GameHistoryTxIds.Add(actualTxLoading); if (Players.Count == 0 && parsedData.Players.Count > 0) { Players = parsedData.Players; } GameHistory.Add(parsedData); if (parsedData.LastGameRecordTxId != "StartOfNewGame") { actualTxLoading = parsedData.LastGameRecordTxId; } else { allLoaded = true; } } } } catch (Exception ex) { log.Error("Chess Game - wrong format of gameData in token metadata. Cannot load history", ex); return(null); } } } } } } } } } } // loading is going from newset to oldest one, so it is important to reverse whole list GameHistoryTxIds.Reverse(); GameHistory.Reverse(); return(await Task.FromResult("OK")); } catch (Exception ex) { log.Error("Chess Game - Cannot load game History!", ex); return(await Task.FromResult("ERROR")); } }