// This method will check all blocks for new Events. private async Task <Dictionary <string, ChangeRequest> > checkCREvents(string contractAdress) { ChangeManagerService changeManagerService = new ChangeManagerService(new Web3(), contractAddress); Event newVoteEventLog = changeManagerService.ContractHandler.GetEvent <NewVoteEventDTO>(); Event newChangeRequestEventLog = changeManagerService.ContractHandler.GetEvent <NewChangeRequestEventDTO>(); Dictionary <string, ChangeRequest> result = new Dictionary <string, ChangeRequest>(); BlockParameter firstBlock = BlockParameter.CreateEarliest(); BlockParameter lastBlock = BlockParameter.CreateLatest(); NewFilterInput filterCR = newChangeRequestEventLog.CreateFilterInput(firstBlock, lastBlock); NewFilterInput filterVote = newVoteEventLog.CreateFilterInput(firstBlock, lastBlock); List <EventLog <NewChangeRequestEventDTO> > logCR = await newChangeRequestEventLog.GetAllChanges <NewChangeRequestEventDTO>(filterCR); List <EventLog <NewVoteEventDTO> > logVote = await newVoteEventLog.GetAllChanges <NewVoteEventDTO>(filterVote); // Get confirmation for CR creation. Then add CR to table and combobox for management vote. Debug.WriteLine("Checking for CR Events: " + logCR.Count); foreach (EventLog <NewChangeRequestEventDTO> cr in logCR) { ChangeRequest changeRequest; String gitHash = Converter.ByteArrayToBinHex(cr.Event.GitHash); HexBigInteger blocknumber = cr.Log.BlockNumber; Block block = await web3.Eth.Blocks.GetBlockWithTransactionsHashesByNumber.SendRequestAsync(blocknumber); if (result.ContainsKey(gitHash)) { changeRequest = result[gitHash]; } else { changeRequest = new ChangeRequest(this.contractAddress); result.Add(gitHash, changeRequest); } changeRequest.updateChangeRequest(gitHash, cr.Event.AdditionalInformation, cr.Event.Costs, cr.Event.Estimation, block.Timestamp.Value); } // Get vote confirmation. Then update State of the vote. Debug.WriteLine("Checking for Vote Events: " + logVote.Count); foreach (EventLog <NewVoteEventDTO> vote in logVote) { String gitHash = Converter.ByteArrayToBinHex(vote.Event.GitHash); ChangeRequest changeRequest = result[gitHash]; HexBigInteger blocknumber = vote.Log.BlockNumber; Block block = await web3.Eth.Blocks.GetBlockWithTransactionsHashesByNumber.SendRequestAsync(blocknumber); if (!changeRequest.votes.ContainsKey(vote.Event.Voter)) { changeRequest.updateVotes((State)vote.Event.CurrentState, vote.Event.VoteInfo, vote.Event.VotesLeft, vote.Event.Voter, vote.Event.Vote, block.Timestamp.Value); } } return(result); }
// This method only checks the yet unchecked blocks for new Events and updates the CR and vote tables. private async void checkEventsAndUpdateTable(object sender, EventArgs e) { lastBlock = BlockParameter.CreateLatest(); NewFilterInput filterCR = newChangeRequestEventLog.CreateFilterInput(firstBlock, lastBlock); NewFilterInput filterVote = newVoteEventLog.CreateFilterInput(firstBlock, lastBlock); firstBlock = lastBlock; List <EventLog <NewChangeRequestEventDTO> > logCR = await newChangeRequestEventLog.GetAllChanges <NewChangeRequestEventDTO>(filterCR); List <EventLog <NewVoteEventDTO> > logVote = await newVoteEventLog.GetAllChanges <NewVoteEventDTO>(filterVote); // Get confirmation for CR creation. Then add CR to table and combobox for management vote. Debug.WriteLine("Checking for CR Events: " + logCR.Count); foreach (EventLog <NewChangeRequestEventDTO> cr in logCR) { ChangeRequest changeRequest; String gitHash = Converter.ByteArrayToBinHex(cr.Event.GitHash); HexBigInteger blocknumber = cr.Log.BlockNumber; Block block = await web3.Eth.Blocks.GetBlockWithTransactionsHashesByNumber.SendRequestAsync(blocknumber); if (changeRequests.ContainsKey(gitHash)) { changeRequest = changeRequests[gitHash]; } else { changeRequest = new ChangeRequest(this.contractAddress); changeRequests.Add(gitHash, changeRequest); } changeRequest.updateChangeRequest(gitHash, cr.Event.AdditionalInformation, cr.Event.Costs, cr.Event.Estimation, block.Timestamp.Value); } // Get vote confirmation. Then update State of the vote. Debug.WriteLine("Checking for Vote Events: " + logVote.Count); foreach (EventLog <NewVoteEventDTO> vote in logVote) { String gitHash = Converter.ByteArrayToBinHex(vote.Event.GitHash); ChangeRequest changeRequest = changeRequests[gitHash]; HexBigInteger blocknumber = vote.Log.BlockNumber; Block block = await web3.Eth.Blocks.GetBlockWithTransactionsHashesByNumber.SendRequestAsync(blocknumber); if (!changeRequest.votes.ContainsKey(vote.Event.Voter)) { changeRequest.updateVotes((State)vote.Event.CurrentState, vote.Event.VoteInfo, vote.Event.VotesLeft, vote.Event.Voter, vote.Event.Vote, block.Timestamp.Value); } } updateVoteTableAndTabs(); this.changeRequestsTable.ItemsSource = changeRequests.Values.ToList(); }