Skip to content

Commit

Permalink
Create new p2sh-p2wsh fed format version. Build new p2sh-p2wsh fed ty…
Browse files Browse the repository at this point in the history
…pe in fed factory
  • Loading branch information
julia-zack committed Jan 30, 2025
1 parent 79079e9 commit f15a515
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,20 @@ public static ErpFederation buildP2shErpFederation(
P2SH_ERP_FEDERATION.getFormatVersion()
);
}

public static ErpFederation buildP2shP2wshErpFederation(
FederationArgs federationArgs,
List<BtcECKey> erpPubKeys,
long activationDelay
) {
ErpRedeemScriptBuilder erpRedeemScriptBuilder = P2shErpRedeemScriptBuilder.builder();

return new ErpFederation(
federationArgs,
erpPubKeys,
activationDelay,
erpRedeemScriptBuilder,
P2SH_P2WSH_ERP_FEDERATION.getFormatVersion()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
public enum FederationFormatVersion {
STANDARD_MULTISIG_FEDERATION(1000),
NON_STANDARD_ERP_FEDERATION(2000),
P2SH_ERP_FEDERATION(3000);
P2SH_ERP_FEDERATION(3000),
P2SH_P2WSH_ERP_FEDERATION(4000);

private int version;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import co.rsk.peg.federation.constants.FederationTestNetConstants;
import org.bouncycastle.util.encoders.Hex;
import org.ethereum.config.blockchain.upgrades.ActivationConfig;
import org.ethereum.config.blockchain.upgrades.ActivationConfigsForTest;
import org.ethereum.config.blockchain.upgrades.ConsensusRule;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
Expand All @@ -21,42 +22,39 @@
import static co.rsk.peg.federation.FederationFormatVersion.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

class FederationFactoryTest {
private static final BtcECKey FEDERATOR_0_PUBLIC_KEY = BtcECKey.fromPublicOnly(Hex.decode("03b53899c390573471ba30e5054f78376c5f797fda26dde7a760789f02908cbad2"));
private static final BtcECKey FEDERATOR_1_PUBLIC_KEY = BtcECKey.fromPublicOnly(Hex.decode("027319afb15481dbeb3c426bcc37f9a30e7f51ceff586936d85548d9395bcc2344"));
private static final BtcECKey FEDERATOR_2_PUBLIC_KEY = BtcECKey.fromPublicOnly(Hex.decode("0355a2e9bf100c00fc0a214afd1bf272647c7824eb9cb055480962f0c382596a70"));
private static final BtcECKey FEDERATOR_3_PUBLIC_KEY = BtcECKey.fromPublicOnly(Hex.decode("02566d5ded7c7db1aa7ee4ef6f76989fb42527fcfdcddcd447d6793b7d869e46f7"));
private static final BtcECKey FEDERATOR_4_PUBLIC_KEY = BtcECKey.fromPublicOnly(Hex.decode("0294c817150f78607566e961b3c71df53a22022a80acbb982f83c0c8baac040adc"));
private static final BtcECKey FEDERATOR_5_PUBLIC_KEY = BtcECKey.fromPublicOnly(Hex.decode("0372cd46831f3b6afd4c044d160b7667e8ebf659d6cb51a825a3104df6ee0638c6"));
private static final BtcECKey FEDERATOR_6_PUBLIC_KEY = BtcECKey.fromPublicOnly(Hex.decode("0340df69f28d69eef60845da7d81ff60a9060d4da35c767f017b0dd4e20448fb44"));
private static final BtcECKey FEDERATOR_7_PUBLIC_KEY = BtcECKey.fromPublicOnly(Hex.decode("02ac1901b6fba2c1dbd47d894d2bd76c8ba1d296d65f6ab47f1c6b22afb53e73eb"));
private static final BtcECKey FEDERATOR_8_PUBLIC_KEY = BtcECKey.fromPublicOnly(Hex.decode("031aabbeb9b27258f98c2bf21f36677ae7bae09eb2d8c958ef41a20a6e88626d26"));
private static final BtcECKey FEDERATOR_9_PUBLIC_KEY = BtcECKey.fromPublicOnly(Hex.decode("0245ef34f5ee218005c9c21227133e8568a4f3f11aeab919c66ff7b816ae1ffeea"));
private static final List<BtcECKey> defaultKeys = Arrays.asList(
FEDERATOR_0_PUBLIC_KEY, FEDERATOR_1_PUBLIC_KEY, FEDERATOR_2_PUBLIC_KEY,
FEDERATOR_3_PUBLIC_KEY, FEDERATOR_4_PUBLIC_KEY, FEDERATOR_5_PUBLIC_KEY,
FEDERATOR_6_PUBLIC_KEY, FEDERATOR_7_PUBLIC_KEY, FEDERATOR_8_PUBLIC_KEY,
FEDERATOR_9_PUBLIC_KEY
);
private static final List<FederationMember> federationMembers = FederationTestUtils.getFederationMembersWithKeys(defaultKeys);
private static final Instant creationTime = ZonedDateTime.parse("2017-06-10T02:30:00Z").toInstant();
private static final long CREATION_BLOCK_NUMBER = 0L;

private FederationConstants federationConstants;
private NetworkParameters networkParameters;
private List<FederationMember> federationMembers;
private Instant creationTime;
private long creationBlockNumber;
private List<BtcECKey> emergencyKeys;
private long activationDelayValue;
private ActivationConfig.ForBlock activations;

@BeforeEach
void setUp() {
BtcECKey federator0PublicKey = BtcECKey.fromPublicOnly(Hex.decode("03b53899c390573471ba30e5054f78376c5f797fda26dde7a760789f02908cbad2"));
BtcECKey federator1PublicKey = BtcECKey.fromPublicOnly(Hex.decode("027319afb15481dbeb3c426bcc37f9a30e7f51ceff586936d85548d9395bcc2344"));
BtcECKey federator2PublicKey = BtcECKey.fromPublicOnly(Hex.decode("0355a2e9bf100c00fc0a214afd1bf272647c7824eb9cb055480962f0c382596a70"));
BtcECKey federator3PublicKey = BtcECKey.fromPublicOnly(Hex.decode("02566d5ded7c7db1aa7ee4ef6f76989fb42527fcfdcddcd447d6793b7d869e46f7"));
BtcECKey federator4PublicKey = BtcECKey.fromPublicOnly(Hex.decode("0294c817150f78607566e961b3c71df53a22022a80acbb982f83c0c8baac040adc"));
BtcECKey federator5PublicKey = BtcECKey.fromPublicOnly(Hex.decode("0372cd46831f3b6afd4c044d160b7667e8ebf659d6cb51a825a3104df6ee0638c6"));
BtcECKey federator6PublicKey = BtcECKey.fromPublicOnly(Hex.decode("0340df69f28d69eef60845da7d81ff60a9060d4da35c767f017b0dd4e20448fb44"));
BtcECKey federator7PublicKey = BtcECKey.fromPublicOnly(Hex.decode("02ac1901b6fba2c1dbd47d894d2bd76c8ba1d296d65f6ab47f1c6b22afb53e73eb"));
BtcECKey federator8PublicKey = BtcECKey.fromPublicOnly(Hex.decode("031aabbeb9b27258f98c2bf21f36677ae7bae09eb2d8c958ef41a20a6e88626d26"));
BtcECKey federator9PublicKey = BtcECKey.fromPublicOnly(Hex.decode("0245ef34f5ee218005c9c21227133e8568a4f3f11aeab919c66ff7b816ae1ffeea"));
List<BtcECKey> defaultKeys = Arrays.asList(
federator0PublicKey, federator1PublicKey, federator2PublicKey,
federator3PublicKey, federator4PublicKey, federator5PublicKey,
federator6PublicKey, federator7PublicKey, federator8PublicKey,
federator9PublicKey
);
federationMembers = FederationTestUtils.getFederationMembersWithKeys(defaultKeys);
creationTime = ZonedDateTime.parse("2017-06-10T02:30:00Z").toInstant();
creationBlockNumber = 0L;
federationConstants = FederationMainNetConstants.getInstance();
networkParameters = federationConstants.getBtcParams();
activations = ActivationConfigsForTest.all().forBlock(0L);
}

@Test
Expand All @@ -67,14 +65,24 @@ void buildStandardMultiSigFederation() {
assertEquals(STANDARD_MULTISIG_FEDERATION.getFormatVersion(), version);
}

private Federation createStandardMultisigFederation() {
FederationArgs federationArgs = new FederationArgs(
federationMembers,
creationTime,
CREATION_BLOCK_NUMBER,
networkParameters
);

return FederationFactory.buildStandardMultiSigFederation(federationArgs);
}

@Nested
@Tag("erpFeds")
class ErpFederationTests {
@BeforeEach
void setUp() {
emergencyKeys = federationConstants.getErpFedPubKeysList();
activationDelayValue = federationConstants.getErpFedActivationDelay();
activations = mock(ActivationConfig.ForBlock.class);
}

@Test
Expand All @@ -95,23 +103,24 @@ void differentNonStandardErpFederations_areNotEqualFeds_butHaveSameNonStandardFe

int version;

// in testnet it should build non standard hardcoded fed
when(activations.isActive(ConsensusRule.RSKIP201)).thenReturn(true);
// in testnet it should build non-standard hardcoded fed
activations = ActivationConfigsForTest.iris300().forBlock(0L);
ErpFederation federationPostRSKIP201 = createNonStandardErpFederation();
version = federationPostRSKIP201.getFormatVersion();

assertEquals(NON_STANDARD_ERP_FEDERATION.getFormatVersion(), version);

// build non standard fed with csv unsigned big endian
when(activations.isActive(ConsensusRule.RSKIP284)).thenReturn(true);
// build non-standard fed with csv unsigned big endian
List<ConsensusRule> exceptedRSKIP = List.of(ConsensusRule.RSKIP293);
activations = ActivationConfigsForTest.hop400(exceptedRSKIP).forBlock(0L);
ErpFederation federationPostRSKIP284 = createNonStandardErpFederation();
version = federationPostRSKIP284.getFormatVersion();

assertEquals(NON_STANDARD_ERP_FEDERATION.getFormatVersion(), version);
assertNotEquals(federationPostRSKIP201, federationPostRSKIP284);

// build non standard fed
when(activations.isActive(ConsensusRule.RSKIP293)).thenReturn(true);
// build non-standard fed
activations = ActivationConfigsForTest.hop400().forBlock(0L);
ErpFederation federationPostRSKIP293 = createNonStandardErpFederation();
version = federationPostRSKIP293.getFormatVersion();

Expand All @@ -124,23 +133,24 @@ void differentNonStandardErpFederations_areNotEqualFeds_butHaveSameNonStandardFe
void differentNonStandardErpFederations_areNotEqualFeds_butHaveSameNonStandardFedFormat_mainnet() {
int version;

// in mainnet it should build non standard fed with csv unsigned big endian
when(activations.isActive(ConsensusRule.RSKIP201)).thenReturn(true);
// in mainnet it should build non-standard fed with csv unsigned big endian
activations = ActivationConfigsForTest.iris300().forBlock(0L);
ErpFederation federationPostRSKIP201 = createNonStandardErpFederation();
version = federationPostRSKIP201.getFormatVersion();

assertEquals(NON_STANDARD_ERP_FEDERATION.getFormatVersion(), version);

// should build non standard fed with csv unsigned big endian
when(activations.isActive(ConsensusRule.RSKIP284)).thenReturn(true);
// should build non-standard fed with csv unsigned big endian
List<ConsensusRule> exceptedRSKIP = List.of(ConsensusRule.RSKIP293);
activations = ActivationConfigsForTest.hop400(exceptedRSKIP).forBlock(0L);
ErpFederation federationPostRSKIP284 = createNonStandardErpFederation();
version = federationPostRSKIP284.getFormatVersion();

assertEquals(NON_STANDARD_ERP_FEDERATION.getFormatVersion(), version);
assertEquals(federationPostRSKIP201, federationPostRSKIP284);

// build non standard fed
when(activations.isActive(ConsensusRule.RSKIP293)).thenReturn(true);
// build non-standard fed
activations = ActivationConfigsForTest.hop400().forBlock(0L);
ErpFederation federationPostRSKIP293 = createNonStandardErpFederation();
version = federationPostRSKIP293.getFormatVersion();

Expand All @@ -166,38 +176,62 @@ void p2shErpFederation_haveP2shFedFormat() {
version = federation.getFormatVersion();
assertEquals(P2SH_ERP_FEDERATION.getFormatVersion(), version);
}
}

private Federation createStandardMultisigFederation() {
FederationArgs federationArgs = new FederationArgs(
federationMembers,
creationTime,
creationBlockNumber,
networkParameters
);
private ErpFederation createNonStandardErpFederation() {
FederationArgs federationArgs = new FederationArgs(
federationMembers,
creationTime,
CREATION_BLOCK_NUMBER,
networkParameters
);

return FederationFactory.buildStandardMultiSigFederation(federationArgs);
}
return FederationFactory.buildNonStandardErpFederation(federationArgs, emergencyKeys, activationDelayValue, activations);
}

private ErpFederation createNonStandardErpFederation() {
FederationArgs federationArgs = new FederationArgs(
federationMembers,
creationTime,
creationBlockNumber,
networkParameters
);
private ErpFederation createP2shErpFederation() {
FederationArgs federationArgs = new FederationArgs(
federationMembers,
creationTime,
CREATION_BLOCK_NUMBER,
networkParameters
);

return FederationFactory.buildNonStandardErpFederation(federationArgs, emergencyKeys, activationDelayValue, activations);
}
return FederationFactory.buildP2shErpFederation(federationArgs, emergencyKeys, activationDelayValue);
}

private ErpFederation createP2shErpFederation() {
FederationArgs federationArgs = new FederationArgs(
federationMembers,
creationTime,
creationBlockNumber,
networkParameters
);
@Test
void p2shP2wshErpFederation_mainnet_hasP2shP2wshFedFormat() {
// act
ErpFederation federation = createP2shP2wshErpFederation();

return FederationFactory.buildP2shErpFederation(federationArgs, emergencyKeys, activationDelayValue);
// assert
int expectedVersion = P2SH_P2WSH_ERP_FEDERATION.getFormatVersion();
assertEquals(expectedVersion, federation.getFormatVersion());
}

@Test
void p2shP2wshErpFederation_testnet_hasP2shP2wshFedFormat() {
// arrange
federationConstants = FederationTestNetConstants.getInstance();
networkParameters = federationConstants.getBtcParams();

// act
ErpFederation federation = createP2shP2wshErpFederation();

// assert
int expectedVersion = P2SH_P2WSH_ERP_FEDERATION.getFormatVersion();
assertEquals(expectedVersion, federation.getFormatVersion());
}

private ErpFederation createP2shP2wshErpFederation() {
FederationArgs federationArgs = new FederationArgs(
federationMembers,
creationTime,
CREATION_BLOCK_NUMBER,
networkParameters
);

return FederationFactory.buildP2shP2wshErpFederation(federationArgs, emergencyKeys, activationDelayValue);
}
}
}

0 comments on commit f15a515

Please sign in to comment.