1919
2020import static co .rsk .peg .federation .FederationChangeResponseCode .FEDERATION_NON_EXISTENT ;
2121import static co .rsk .peg .federation .FederationMember .KeyType ;
22- import static org .ethereum .config .blockchain .upgrades .ConsensusRule .*;
2322
2423import co .rsk .bitcoinj .core .Address ;
2524import co .rsk .bitcoinj .core .BtcECKey ;
@@ -64,31 +63,22 @@ public FederationProviderFromFederatorSupport(
6463 public Federation getActiveFederation () {
6564 List <FederationMember > members = new ArrayList <>();
6665 int federationSize = federatorSupport .getFederationSize ();
67- boolean useTypedPublicKeyGetter = federatorSupport .getConfigForBestBlock ().isActive (RSKIP123 );
6866 for (int i = 0 ; i < federationSize ; i ++) {
69- // Select method depending on network configuration for best block
70- FederationMember member ;
71- if (useTypedPublicKeyGetter ) {
72- BtcECKey btcKey = BtcECKey .fromPublicOnly (federatorSupport .getFederatorPublicKeyOfType (i , FederationMember .KeyType .BTC ).getPubKey ());
73- ECKey rskKey = federatorSupport .getFederatorPublicKeyOfType (i , FederationMember .KeyType .RSK );
74- ECKey mstKey = federatorSupport .getFederatorPublicKeyOfType (i , FederationMember .KeyType .MST );
75-
76- member = new FederationMember (btcKey , rskKey , mstKey );
77- } else {
78- // Before the fork, all of BTC, RSK and MST keys are the same
79- BtcECKey btcKey = federatorSupport .getFederatorPublicKey (i );
80- ECKey rskMstKey = ECKey .fromPublicOnly (btcKey .getPubKey ());
81- member = new FederationMember (btcKey , rskMstKey , rskMstKey );
82- }
67+ BtcECKey btcKey = BtcECKey .fromPublicOnly (federatorSupport .getFederatorPublicKeyOfType (i , FederationMember .KeyType .BTC ).getPubKey ());
68+ ECKey rskKey = federatorSupport .getFederatorPublicKeyOfType (i , FederationMember .KeyType .RSK );
69+ ECKey mstKey = federatorSupport .getFederatorPublicKeyOfType (i , FederationMember .KeyType .MST );
8370
71+ FederationMember member = new FederationMember (btcKey , rskKey , mstKey );
8472 members .add (member );
8573 }
8674 Instant creationTime = federatorSupport .getFederationCreationTime ();
8775 long creationBlockNumber = federatorSupport .getFederationCreationBlockNumber ();
8876 NetworkParameters btcParams = federatorSupport .getBtcParams ();
8977 FederationArgs federationArgs = new FederationArgs (members , creationTime , creationBlockNumber , btcParams );
9078
91- return getExpectedFederation (federationArgs , getActiveFederationAddress ());
79+ Address activeFederationAddress = getActiveFederationAddress ();
80+ logger .debug ("[getActiveFederation] Attempting to get active federation with address {}" , activeFederationAddress );
81+ return buildFederation (federationArgs , activeFederationAddress );
9282 }
9383
9484 @ Override
@@ -105,25 +95,13 @@ public Optional<Federation> getRetiringFederation() {
10595 }
10696
10797 Address retiringFederationAddress = getRetiringFederationAddress ().orElseThrow (IllegalStateException ::new );
108- boolean useTypedPublicKeyGetter = federatorSupport .getConfigForBestBlock ().isActive (RSKIP123 );
10998 List <FederationMember > members = new ArrayList <>();
11099 for (int i = 0 ; i < federationSize ; i ++) {
111- // Select method depending on network configuration for best block
112- FederationMember member ;
113- if (useTypedPublicKeyGetter ) {
114- BtcECKey btcKey = BtcECKey .fromPublicOnly (federatorSupport .getRetiringFederatorPublicKeyOfType (i , FederationMember .KeyType .BTC ).getPubKey ());
115- ECKey rskKey = federatorSupport .getRetiringFederatorPublicKeyOfType (i , FederationMember .KeyType .RSK );
116- ECKey mstKey = federatorSupport .getRetiringFederatorPublicKeyOfType (i , FederationMember .KeyType .MST );
117-
118- member = new FederationMember (btcKey , rskKey , mstKey );
119- } else {
120- // Before the fork, all of BTC, RSK and MST keys are the same
121- BtcECKey btcKey = federatorSupport .getRetiringFederatorPublicKey (i );
122- ECKey rskMstKey = ECKey .fromPublicOnly (btcKey .getPubKey ());
123-
124- member = new FederationMember (btcKey , rskMstKey , rskMstKey );
125- }
100+ BtcECKey btcKey = BtcECKey .fromPublicOnly (federatorSupport .getRetiringFederatorPublicKeyOfType (i , FederationMember .KeyType .BTC ).getPubKey ());
101+ ECKey rskKey = federatorSupport .getRetiringFederatorPublicKeyOfType (i , FederationMember .KeyType .RSK );
102+ ECKey mstKey = federatorSupport .getRetiringFederatorPublicKeyOfType (i , FederationMember .KeyType .MST );
126103
104+ FederationMember member = new FederationMember (btcKey , rskKey , mstKey );
127105 members .add (member );
128106 }
129107
@@ -132,7 +110,8 @@ public Optional<Federation> getRetiringFederation() {
132110 NetworkParameters btcParams = federatorSupport .getBtcParams ();
133111 FederationArgs federationArgs = new FederationArgs (members , creationTime , creationBlockNumber , btcParams );
134112
135- Federation retiringFederation = getExpectedFederation (federationArgs , retiringFederationAddress );
113+ logger .debug ("[getRetiringFederation] Attempting to get retiring federation with address {}" , retiringFederationAddress );
114+ Federation retiringFederation = buildFederation (federationArgs , retiringFederationAddress );
136115 return Optional .of (retiringFederation );
137116 }
138117
@@ -143,10 +122,6 @@ public Optional<Address> getRetiringFederationAddress() {
143122
144123 @ Override
145124 public Optional <Federation > getProposedFederation () {
146- if (!federatorSupport .getConfigForBestBlock ().isActive (RSKIP419 )) {
147- return Optional .empty ();
148- }
149-
150125 int federationSize = federatorSupport .getProposedFederationSize ()
151126 .orElse (FEDERATION_NON_EXISTENT .getCode ());
152127 if (federationSize == FEDERATION_NON_EXISTENT .getCode ()) {
@@ -175,68 +150,61 @@ public Optional<Federation> getProposedFederation() {
175150 federatorSupport .getBtcParams ()
176151 );
177152
178- Federation proposedFederation = buildProposedFederation (federationArgs );
179- return Optional .of (proposedFederation );
180- }
181-
182- private Federation buildProposedFederation (FederationArgs federationArgs ) {
183- if (!federatorSupport .getConfigForBestBlock ().isActive (RSKIP305 )) {
184- return FederationFactory .buildP2shErpFederation (
185- federationArgs ,
186- federationConstants .getErpFedPubKeysList (),
187- federationConstants .getErpFedActivationDelay ());
188- }
189-
190- return FederationFactory .buildP2shP2wshErpFederation (
153+ Federation proposedFederation = FederationFactory .buildP2shP2wshErpFederation (
191154 federationArgs ,
192155 federationConstants .getErpFedPubKeysList (),
193156 federationConstants .getErpFedActivationDelay ());
157+ return Optional .of (proposedFederation );
194158 }
195159
196160 @ Override
197161 public Optional <Address > getProposedFederationAddress () {
198162 return Optional .of (federatorSupport )
199- .filter (fedSupport -> fedSupport .getConfigForBestBlock ().isActive (RSKIP419 ))
200163 .flatMap (FederatorSupport ::getProposedFederationAddress );
201164 }
202165
203- private Federation getExpectedFederation (FederationArgs federationArgs , Address expectedFederationAddress ) {
204- logger .debug ("[getExpectedFederation] Going to get expected federation with address {}" , expectedFederationAddress );
166+ private Federation buildFederation (FederationArgs federationArgs , Address expectedFederationAddress ) {
167+ return tryBuildingStandardMultiSigFederation (federationArgs , expectedFederationAddress )
168+ .or (() -> tryBuildingP2shP2wshErpFederation (federationArgs ,
169+ expectedFederationAddress ))
170+ .orElseThrow (() ->
171+ new IllegalStateException (
172+ String .format (
173+ "Cannot determine federation type for federation with address %s. Tried: standard multiSig, and P2SH-P2WSH ERP federations." ,
174+ expectedFederationAddress
175+ )
176+ )
177+ );
178+ }
205179
180+ private Optional <Federation > tryBuildingStandardMultiSigFederation (FederationArgs federationArgs , Address expectedFederationAddress ) {
206181 Federation standardMultiSigFederation = FederationFactory .buildStandardMultiSigFederation (federationArgs );
207- if (standardMultiSigFederation .getAddress ().equals (expectedFederationAddress )) {
208- logger .debug ("[getExpectedFederation ] Expected federation is a standard multiSig one." );
209- return standardMultiSigFederation ;
182+ if (! standardMultiSigFederation .getAddress ().equals (expectedFederationAddress )) {
183+ logger .debug ("[tryBuildingStandardMultiSigFederation ] Expected federation is not a standard multiSig one." );
184+ return Optional . empty () ;
210185 }
211186
212- logger .debug ("[getExpectedFederation ] Expected federation is not a standard multiSig one." );
213- List < BtcECKey > erpPubKeys = federationConstants . getErpFedPubKeysList ( );
214- long activationDelay = federationConstants . getErpFedActivationDelay ();
187+ logger .debug ("[tryBuildingStandardMultiSigFederation ] Expected federation is a standard multiSig one." );
188+ return Optional . of ( standardMultiSigFederation );
189+ }
215190
191+ private Optional <Federation > tryBuildingP2shP2wshErpFederation (FederationArgs federationArgs , Address expectedFederationAddress ) {
192+ ErpFederation p2shP2wshErpFederation ;
216193 try {
217- ErpFederation p2shErpFederation =
218- FederationFactory .buildP2shErpFederation (federationArgs , erpPubKeys , activationDelay );
219-
220- if (p2shErpFederation .getAddress ().equals (expectedFederationAddress )) {
221- logger .debug ("[getExpectedFederation] Expected federation is a p2sh erp one." );
222- return p2shErpFederation ;
223- }
194+ p2shP2wshErpFederation = FederationFactory .buildP2shP2wshErpFederation (
195+ federationArgs , federationConstants .getErpFedPubKeysList (),
196+ federationConstants .getErpFedActivationDelay ());
224197 } catch (ErpFederationCreationException | ScriptCreationException e ) {
225- logger .debug ("[getExpectedFederation] Expected federation is not a p2sh erp one." , e );
198+ logger .debug ("[tryBuildingP2shP2wshErpFederation] Failed to build p2sh-p2wsh erp federation." , e );
199+ return Optional .empty ();
226200 }
227201
228- try {
229- ErpFederation p2shP2wshErpFederation =
230- FederationFactory .buildP2shP2wshErpFederation (federationArgs , erpPubKeys , activationDelay );
231-
232- if (p2shP2wshErpFederation .getAddress ().equals (expectedFederationAddress )) {
233- logger .debug ("[getExpectedFederation] Expected federation is a p2sh-p2wsh erp one." );
234- return p2shP2wshErpFederation ;
235- }
236- } catch (ErpFederationCreationException | ScriptCreationException e ) {
237- logger .error ("[getExpectedFederation] Expected federation is not a p2sh-p2wsh erp one." , e );
202+ if (!p2shP2wshErpFederation .getAddress ().equals (expectedFederationAddress )) {
203+ logger .debug ("[tryBuildingP2shP2wshErpFederation] Expected federation is not a p2sh-p2wsh erp one." );
204+ return Optional .empty ();
238205 }
239206
240- throw new IllegalStateException ("[getExpectedFederation] Cannot get expected federation." );
207+ logger .debug ("[tryBuildingP2shP2wshErpFederation] Expected federation is a p2sh-p2wsh erp one." );
208+ return Optional .of (p2shP2wshErpFederation );
241209 }
242210}
0 commit comments