From 6abadbfe18b41fd8f77c3a54d4432c5c172505df Mon Sep 17 00:00:00 2001 From: Antonio Pancorbo <48168255+apancorb@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:35:25 +0000 Subject: [PATCH] fix(federate): add RSKIP419 check for proposed federation methods --- ...ederationProviderFromFederatorSupport.java | 9 +++- ...ationProviderFromFederatorSupportTest.java | 44 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/main/java/co/rsk/federate/FederationProviderFromFederatorSupport.java b/src/main/java/co/rsk/federate/FederationProviderFromFederatorSupport.java index 9eb9357b9..9dbe78598 100644 --- a/src/main/java/co/rsk/federate/FederationProviderFromFederatorSupport.java +++ b/src/main/java/co/rsk/federate/FederationProviderFromFederatorSupport.java @@ -20,6 +20,7 @@ import static co.rsk.peg.federation.FederationChangeResponseCode.FEDERATION_NON_EXISTENT; import static co.rsk.peg.federation.FederationMember.KeyType; import static org.ethereum.config.blockchain.upgrades.ConsensusRule.RSKIP123; +import static org.ethereum.config.blockchain.upgrades.ConsensusRule.RSKIP419; import co.rsk.bitcoinj.core.Address; import co.rsk.bitcoinj.core.BtcECKey; @@ -143,6 +144,10 @@ public Optional
getRetiringFederationAddress() { @Override public Optional getProposedFederation() { + if (!federatorSupport.getConfigForBestBlock().isActive(RSKIP419)) { + return Optional.empty(); + } + Integer federationSize = federatorSupport.getProposedFederationSize() .orElse(FEDERATION_NON_EXISTENT.getCode()); if (federationSize == FEDERATION_NON_EXISTENT.getCode()) { @@ -181,7 +186,9 @@ public Optional getProposedFederation() { @Override public Optional
getProposedFederationAddress() { - return federatorSupport.getProposedFederationAddress(); + return Optional.of(federatorSupport) + .filter(fedSupport -> fedSupport.getConfigForBestBlock().isActive(RSKIP419)) + .flatMap(FederatorSupport::getProposedFederationAddress); } private Federation getExpectedFederation(Federation initialFederation, Address expectedFederationAddress) { diff --git a/src/test/java/co/rsk/federate/FederationProviderFromFederatorSupportTest.java b/src/test/java/co/rsk/federate/FederationProviderFromFederatorSupportTest.java index 50842c871..643522f32 100644 --- a/src/test/java/co/rsk/federate/FederationProviderFromFederatorSupportTest.java +++ b/src/test/java/co/rsk/federate/FederationProviderFromFederatorSupportTest.java @@ -3,6 +3,7 @@ import static co.rsk.peg.federation.FederationChangeResponseCode.FEDERATION_NON_EXISTENT; import static org.ethereum.config.blockchain.upgrades.ConsensusRule.RSKIP123; import static org.ethereum.config.blockchain.upgrades.ConsensusRule.RSKIP284; +import static org.ethereum.config.blockchain.upgrades.ConsensusRule.RSKIP419; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -374,6 +375,9 @@ void getRetiringFederation_present_p2sh_erp_federation() { @Test void getProposedFederation_whenProposedFederationSizeIsNonExistent_shouldReturnEmptyOptional() { // Arrange + ActivationConfig.ForBlock configMock = mock(ActivationConfig.ForBlock.class); + when(configMock.isActive(RSKIP419)).thenReturn(true); + when(federatorSupportMock.getConfigForBestBlock()).thenReturn(configMock); when(federatorSupportMock.getProposedFederationSize()) .thenReturn(Optional.of(FEDERATION_NON_EXISTENT.getCode())); @@ -385,6 +389,9 @@ void getProposedFederation_whenProposedFederationSizeIsNonExistent_shouldReturnE @Test void getProposedFederation_whenSomeDataDoesNotExists_shouldThrowIllegalStateException() { // Arrange + ActivationConfig.ForBlock configMock = mock(ActivationConfig.ForBlock.class); + when(configMock.isActive(RSKIP419)).thenReturn(true); + when(federatorSupportMock.getConfigForBestBlock()).thenReturn(configMock); Federation expectedFederation = createP2shErpFederation( getFederationMembersFromPks(1, 1000, 2000, 3000, 4000, 5000)); Address expectedFederationAddress = expectedFederation.getAddress(); @@ -404,6 +411,9 @@ void getProposedFederation_whenSomeDataDoesNotExists_shouldThrowIllegalStateExce @Test void getProposedFederation_whenExistsAndIsP2shErpFederation_shouldReturnProposedFederation() { // Arrange + ActivationConfig.ForBlock configMock = mock(ActivationConfig.ForBlock.class); + when(configMock.isActive(RSKIP419)).thenReturn(true); + when(federatorSupportMock.getConfigForBestBlock()).thenReturn(configMock); Federation expectedFederation = createP2shErpFederation( getFederationMembersFromPks(1, 1000, 2000, 3000, 4000, 5000)); Address expectedFederationAddress = expectedFederation.getAddress(); @@ -432,9 +442,26 @@ void getProposedFederation_whenExistsAndIsP2shErpFederation_shouldReturnProposed assertEquals(expectedFederationAddress, proposedFederation.get().getAddress()); } + @Test + void getProposedFederation_whenRSKIP419IsNotActivated_shouldReturnEmptyOptional() { + // Arrange + ActivationConfig.ForBlock configMock = mock(ActivationConfig.ForBlock.class); + when(configMock.isActive(RSKIP419)).thenReturn(false); + when(federatorSupportMock.getConfigForBestBlock()).thenReturn(configMock); + + // Act + Optional result = federationProvider.getProposedFederation(); + + // Assert + assertFalse(result.isPresent()); + } + @Test void getProposedFederationAddress_whenAddressExists_shouldReturnAddress() { // Arrange + ActivationConfig.ForBlock configMock = mock(ActivationConfig.ForBlock.class); + when(configMock.isActive(RSKIP419)).thenReturn(true); + when(federatorSupportMock.getConfigForBestBlock()).thenReturn(configMock); when(federatorSupportMock.getProposedFederationAddress()).thenReturn(Optional.of(DEFAULT_ADDRESS)); // Act @@ -448,6 +475,9 @@ void getProposedFederationAddress_whenAddressExists_shouldReturnAddress() { @Test void getProposedFederationAddress_whenNoAddressExists_shouldReturnEmptyOptional() { // Arrange + ActivationConfig.ForBlock configMock = mock(ActivationConfig.ForBlock.class); + when(configMock.isActive(RSKIP419)).thenReturn(true); + when(federatorSupportMock.getConfigForBestBlock()).thenReturn(configMock); when(federatorSupportMock.getProposedFederationAddress()).thenReturn(Optional.empty()); // Act @@ -456,6 +486,20 @@ void getProposedFederationAddress_whenNoAddressExists_shouldReturnEmptyOptional( // Assert assertFalse(result.isPresent()); } + + @Test + void getProposedFederationAddress_whenRSKIP419IsNotActivated_shouldReturnEmptyOptional() { + // Arrange + ActivationConfig.ForBlock configMock = mock(ActivationConfig.ForBlock.class); + when(configMock.isActive(RSKIP419)).thenReturn(false); + when(federatorSupportMock.getConfigForBestBlock()).thenReturn(configMock); + + // Act + Optional
result = federationProvider.getProposedFederationAddress(); + + // Assert + assertFalse(result.isPresent()); + } private Federation createFederation(List members) { FederationArgs federationArgs = new FederationArgs(members, creationTime, 0L, testnetParams);