Skip to content

Commit

Permalink
Allow proposed fed to call ADD_SIGNATURE method. Add tests. Add missi…
Browse files Browse the repository at this point in the history
…ng tests for active and retiring federation. Minor refactors
  • Loading branch information
julia-zack committed Jan 21, 2025
1 parent 2545809 commit a9ad689
Show file tree
Hide file tree
Showing 6 changed files with 337 additions and 38 deletions.
27 changes: 25 additions & 2 deletions rskj-core/src/main/java/co/rsk/peg/Bridge.java
Original file line number Diff line number Diff line change
Expand Up @@ -1475,14 +1475,37 @@ public long getEstimatedFeesForNextPegOutEvent(Object[] args) throws IOException

public static BridgeMethods.BridgeMethodExecutor activeAndRetiringFederationOnly(BridgeMethods.BridgeMethodExecutor decoratee, String funcName) {
return (self, args) -> {
boolean isFromActiveFed = BridgeUtils.isFromFederateMember(self.rskTx, self.bridgeSupport.getActiveFederation(), self.signatureCache);

Federation retiringFederation = self.bridgeSupport.getRetiringFederation();
boolean isFromRetiringFed = retiringFederation != null && BridgeUtils.isFromFederateMember(self.rskTx, retiringFederation, self.signatureCache);

if (!BridgeUtils.isFromFederateMember(self.rskTx, self.bridgeSupport.getActiveFederation(), self.signatureCache)
&& (retiringFederation == null || !BridgeUtils.isFromFederateMember(self.rskTx, retiringFederation, self.signatureCache))) {
if (!isFromActiveFed && !isFromRetiringFed) {
String errorMessage = String.format("Sender is not part of the active or retiring federations, so he is not enabled to call the function '%s'",funcName);
logger.warn(errorMessage);
throw new VMException(errorMessage);
}

return decoratee.execute(self, args);
};
}

public static BridgeMethods.BridgeMethodExecutor activeRetiringAndProposedFederationOnly(BridgeMethods.BridgeMethodExecutor decoratee, String funcName) {
return (self, args) -> {
boolean isFromActiveFed = BridgeUtils.isFromFederateMember(self.rskTx, self.bridgeSupport.getActiveFederation(), self.signatureCache);

Federation retiringFederation = self.bridgeSupport.getRetiringFederation();
boolean isFromRetiringFed = retiringFederation != null && BridgeUtils.isFromFederateMember(self.rskTx, retiringFederation, self.signatureCache);

Optional<Federation> proposedFederation = self.bridgeSupport.getProposedFederation();
boolean isFromProposedFed = proposedFederation.isPresent() && BridgeUtils.isFromFederateMember(self.rskTx, proposedFederation.get(), self.signatureCache);

if (!isFromActiveFed && !isFromRetiringFed && !isFromProposedFed) {
String errorMessage = String.format("Sender is not part of the active, retiring or proposed federations, so he is not enabled to call the function '%s'",funcName);
logger.warn(errorMessage);
throw new VMException(errorMessage);
}

return decoratee.execute(self, args);
};
}
Expand Down
2 changes: 1 addition & 1 deletion rskj-core/src/main/java/co/rsk/peg/BridgeMethods.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public enum BridgeMethods {
new String[]{}
),
fixedCost(70000L),
Bridge.activeAndRetiringFederationOnly((BridgeMethodExecutorVoid) Bridge::addSignature, "addSignature"),
Bridge.activeRetiringAndProposedFederationOnly((BridgeMethodExecutorVoid) Bridge::addSignature, "addSignature"),
fixedPermission(false)
),
COMMIT_FEDERATION(
Expand Down
5 changes: 4 additions & 1 deletion rskj-core/src/main/java/co/rsk/peg/BridgeSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -2277,12 +2277,15 @@ public Federation getActiveFederation() {
return federationSupport.getActiveFederation();
}


@Nullable
public Federation getRetiringFederation() {
return federationSupport.getRetiringFederation();
}

public Optional<Federation> getProposedFederation() {
return federationSupport.getProposedFederation();
}

public Address getActiveFederationAddress() {
return federationSupport.getActiveFederationAddress();
}
Expand Down
6 changes: 6 additions & 0 deletions rskj-core/src/test/java/co/rsk/RskTestUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ public static Block createRskBlock() {
return createRskBlock(defaultBlockNumber, defaultBlockTimestamp.toEpochMilli());
}

public static Block createRskBlock(long blockNumber) {
final Instant defaultBlockTimestamp = ZonedDateTime.parse("2020-01-20T12:00:08.400Z").toInstant();

return createRskBlock(blockNumber, defaultBlockTimestamp.toEpochMilli());
}

public static Block createRskBlock(long blockNumber, long blockTimestamp) {
BlockHeader blockHeader = new BlockHeaderBuilder(mock(ActivationConfig.class))
.setNumber(blockNumber)
Expand Down
18 changes: 18 additions & 0 deletions rskj-core/src/test/java/co/rsk/peg/BridgeSupportTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,24 @@ void getPendingFederatorPublicKeyOfType() {
assertThat(bridgeSupport.getPendingFederatorPublicKeyOfType(0, FederationMember.KeyType.MST), is(mstKey.getPubKey()));
}

@Test
void getProposedFederation_whenProposedFederationExists_shouldReturnProposedFed() {
when(federationSupport.getProposedFederation()).thenReturn(Optional.of(federation));

Optional<Federation> proposedFed = bridgeSupport.getProposedFederation();
assertTrue(proposedFed.isPresent());
assertThat(proposedFed.get(), is(federation));
}

@Test
void getProposedFederation_whenBridgeSupportReturnsEmpty_shouldReturnEmpty() {
// Act
var actualProposedFederation = bridgeSupport.getProposedFederation();

// Assert
assertFalse(actualProposedFederation.isPresent());
}

@Test
void getProposedFederationAddress_whenBridgeSupportReturnsEmpty_shouldReturnEmpty() {
// Act
Expand Down
Loading

0 comments on commit a9ad689

Please sign in to comment.