diff --git a/src/Stratis.Bitcoin.Features.PoA/Voting/JoinFederationRequestService.cs b/src/Stratis.Bitcoin.Features.PoA/Voting/JoinFederationRequestService.cs index b3b5ebb167..fddbcd79f5 100644 --- a/src/Stratis.Bitcoin.Features.PoA/Voting/JoinFederationRequestService.cs +++ b/src/Stratis.Bitcoin.Features.PoA/Voting/JoinFederationRequestService.cs @@ -49,6 +49,23 @@ public JoinFederationRequestService(ICounterChainSettings counterChainSettings, this.votingManager = votingManager; } + public static byte[] GetFederationMemberBytes(JoinFederationRequest joinRequest, Network network, Network counterChainNetwork) + { + Script collateralScript = PayToPubkeyHashTemplate.Instance.GenerateScriptPubKey(joinRequest.CollateralMainchainAddress); + BitcoinAddress bitcoinAddress = collateralScript.GetDestinationAddress(counterChainNetwork); + var collateralFederationMember = new CollateralFederationMember(joinRequest.PubKey, false, joinRequest.CollateralAmount, bitcoinAddress.ToString()); + + return (network.Consensus.ConsensusFactory as CollateralPoAConsensusFactory).SerializeFederationMember(collateralFederationMember); + } + + public static void SetLastRemovalEventId(JoinFederationRequest joinRequest, byte[] federationMemberBytes, VotingManager votingManager) + { + Poll poll = votingManager.GetApprovedPolls().OrderByDescending(p => p.PollStartBlockData.Height).FirstOrDefault(x => x.IsExecuted && + x.VotingData.Key == VoteKey.KickFederationMember && x.VotingData.Data.SequenceEqual(federationMemberBytes)); + + joinRequest.RemovalEventId = (poll == null) ? Guid.Empty : new Guid(poll.PollExecutedBlockData.Hash.ToBytes().TakeLast(16).ToArray()); + } + public async Task JoinFederationAsync(JoinFederationRequestModel request, CancellationToken cancellationToken) { // Wait until the node is synced before joining. @@ -74,13 +91,7 @@ public async Task JoinFederationAsync(JoinFederationRequestModel request var joinRequest = new JoinFederationRequest(minerKey.PubKey, new Money(expectedCollateralAmount, MoneyUnit.BTC), addressKey); // Populate the RemovalEventId. - var collateralFederationMember = new CollateralFederationMember(minerKey.PubKey, false, joinRequest.CollateralAmount, request.CollateralAddress); - - byte[] federationMemberBytes = (this.network.Consensus.ConsensusFactory as CollateralPoAConsensusFactory).SerializeFederationMember(collateralFederationMember); - Poll poll = this.votingManager.GetApprovedPolls().FirstOrDefault(x => x.IsExecuted && - x.VotingData.Key == VoteKey.KickFederationMember && x.VotingData.Data.SequenceEqual(federationMemberBytes)); - - joinRequest.RemovalEventId = (poll == null) ? Guid.Empty : new Guid(poll.PollExecutedBlockData.Hash.ToBytes().TakeLast(16).ToArray()); + SetLastRemovalEventId(joinRequest, GetFederationMemberBytes(joinRequest, this.network, this.counterChainSettings.CounterChainNetwork), this.votingManager); // Get the signature by calling the counter-chain "signmessage" API. var signMessageRequest = new SignMessageRequest() diff --git a/src/Stratis.Features.Collateral/JoinFederationRequestMonitor.cs b/src/Stratis.Features.Collateral/JoinFederationRequestMonitor.cs index 745d4d336f..f19a201b63 100644 --- a/src/Stratis.Features.Collateral/JoinFederationRequestMonitor.cs +++ b/src/Stratis.Features.Collateral/JoinFederationRequestMonitor.cs @@ -11,6 +11,7 @@ using Stratis.Bitcoin.PoA.Features.Voting; using Stratis.Bitcoin.Signals; using Stratis.Features.Collateral.CounterChain; +using Stratis.Features.PoA.Voting; namespace Stratis.Features.Collateral { @@ -94,11 +95,7 @@ public void OnBlockConnected(BlockConnected blockConnectedData) } // Fill in the request.removalEventId (if any). - Script collateralScript = PayToPubkeyHashTemplate.Instance.GenerateScriptPubKey(request.CollateralMainchainAddress); - - var collateralFederationMember = new CollateralFederationMember(request.PubKey, false, request.CollateralAmount, collateralScript.GetDestinationAddress(this.counterChainNetwork).ToString()); - - byte[] federationMemberBytes = consensusFactory.SerializeFederationMember(collateralFederationMember); + byte[] federationMemberBytes = JoinFederationRequestService.GetFederationMemberBytes(request, this.network, this.counterChainNetwork); // Nothing to do if already voted. if (this.votingManager.AlreadyVotingFor(VoteKey.AddFederationMember, federationMemberBytes)) @@ -109,10 +106,7 @@ public void OnBlockConnected(BlockConnected blockConnectedData) } // Populate the RemovalEventId. - Poll poll = this.votingManager.GetApprovedPolls().FirstOrDefault(x => x.IsExecuted && - x.VotingData.Key == VoteKey.KickFederationMember && x.VotingData.Data.SequenceEqual(federationMemberBytes)); - - request.RemovalEventId = (poll == null) ? Guid.Empty : new Guid(poll.PollExecutedBlockData.Hash.ToBytes().TakeLast(16).ToArray()); + JoinFederationRequestService.SetLastRemovalEventId(request, federationMemberBytes, this.votingManager); // Check the signature. PubKey key = PubKey.RecoverFromMessage(request.SignatureMessage, request.Signature);