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);