2828import co .rsk .trie .TrieStore ;
2929import co .rsk .trie .TrieStoreImpl ;
3030import org .ethereum .TestUtils ;
31- import org .ethereum .core .*;
31+ import org .ethereum .config .blockchain .upgrades .ActivationConfig ;
32+ import org .ethereum .core .Block ;
33+ import org .ethereum .core .BlockTxSignatureCache ;
34+ import org .ethereum .core .ReceivedTxSignatureCache ;
35+ import org .ethereum .core .Repository ;
36+ import org .ethereum .core .SignatureCache ;
3237import org .ethereum .datasource .HashMapDB ;
3338import org .ethereum .db .MutableRepository ;
39+ import org .ethereum .rpc .parameters .AccountOverrideParam ;
40+ import org .ethereum .rpc .parameters .HexAddressParam ;
41+ import org .ethereum .rpc .parameters .HexDataParam ;
42+ import org .ethereum .rpc .parameters .HexNumberParam ;
3443import org .ethereum .vm .DataWord ;
3544import org .ethereum .vm .OverrideablePrecompiledContracts ;
3645import org .ethereum .vm .PrecompiledContracts ;
3746import org .junit .jupiter .api .BeforeEach ;
3847import org .junit .jupiter .api .Test ;
48+ import org .junit .jupiter .params .ParameterizedTest ;
49+ import org .junit .jupiter .params .provider .Arguments ;
50+ import org .junit .jupiter .params .provider .MethodSource ;
51+
3952import java .math .BigInteger ;
4053import java .util .HashMap ;
4154import java .util .Map ;
55+ import java .util .stream .Stream ;
4256
57+ import static org .ethereum .vm .PrecompiledContracts .BRIDGE_ADDR_STR ;
4358import static org .junit .jupiter .api .Assertions .*;
4459import static org .mockito .Mockito .mock ;
4560import static org .mockito .Mockito .when ;
@@ -202,7 +217,39 @@ void applyWithMovePrecompileTo_happyPath() {
202217 stateOverrideApplier .applyToRepository (blockMock , repository , accountOverride , overrideablePrecompiledContracts );
203218
204219 // Then
205- assertEquals (overrideablePrecompiledContracts .getContractForAddress (testSystemProperties .getActivationConfig ().forBlock (blockNumber ), precompileAddressInDataWord ), overrideablePrecompiledContracts .getContractForAddress (testSystemProperties .getActivationConfig ().forBlock (blockNumber ), movePrecompileToInDataWord ));
220+ ActivationConfig .ForBlock blockActivations = testSystemProperties .getActivationConfig ().forBlock (blockNumber );
221+
222+ PrecompiledContracts .PrecompiledContract originalContract = overrideablePrecompiledContracts .getContractForAddress (blockActivations , precompileAddressInDataWord );
223+ PrecompiledContracts .PrecompiledContract movedContract = overrideablePrecompiledContracts .getContractForAddress (blockActivations , movePrecompileToInDataWord );
224+
225+ assertEquals (originalContract , movedContract );
226+ }
227+
228+ @ Test
229+ void applyWithMovePrecompileTo_notMovableContract_throwsExceptionAsExpected () {
230+ // Given
231+ RskAddress bridgeAddress = new RskAddress (BRIDGE_ADDR_STR );
232+ RskAddress movePrecompileTo = TestUtils .generateAddress ("targetAddress" );
233+
234+ AccountOverride accountOverride = new AccountOverride (bridgeAddress );
235+ accountOverride .setMovePrecompileToAddress (movePrecompileTo );
236+
237+ PrecompiledContracts precompiledContracts = getPrecompiledContracts ();
238+
239+ OverrideablePrecompiledContracts overrideablePrecompiledContracts = new OverrideablePrecompiledContracts (precompiledContracts );
240+
241+ long blockNumber = 1L ;
242+ Block blockMock = mock (Block .class );
243+ when (blockMock .getNumber ()).thenReturn (blockNumber );
244+
245+ // When
246+ IllegalStateException exception = assertThrows (IllegalStateException .class , () -> {
247+ // This is the second time calling the exact same method so the contract should be already overridden
248+ stateOverrideApplier .applyToRepository (blockMock , repository , accountOverride , overrideablePrecompiledContracts );
249+ });
250+
251+ // Then
252+ assertEquals ("Account " + bridgeAddress .toHexString () + " can not be moved" , exception .getMessage ());
206253 }
207254
208255 @ Test
@@ -234,6 +281,12 @@ void applyWithMovePrecompileTo_alreadyOverriddenContract_throwsExceptionAsExpect
234281 assertEquals ("Account " + precompileAddress .toHexString () + " has already been overridden by a precompile" , exception .getMessage ());
235282 }
236283
284+ @ ParameterizedTest
285+ @ MethodSource ("provideContainsStateChangeTestCases" )
286+ void containsStateChange_executesAsExpected (AccountOverride accountOverride , boolean expectedResult ) {
287+ assertEquals (expectedResult , stateOverrideApplier .containsStateChange (accountOverride ));
288+ }
289+
237290 private PrecompiledContracts getPrecompiledContracts () {
238291 TestSystemProperties config = new TestSystemProperties ();
239292 SignatureCache signatureCache = new BlockTxSignatureCache (new ReceivedTxSignatureCache ());
@@ -242,4 +295,25 @@ private PrecompiledContracts getPrecompiledContracts() {
242295 return new PrecompiledContracts (config , bridgeSupportFactory , signatureCache );
243296 }
244297
298+ private static Stream <Arguments > provideContainsStateChangeTestCases () {
299+ return Stream .of (
300+ Arguments .of (getAccountOverride (new AccountOverrideParam (null , null , null , null , null , null )), false ),
301+ Arguments .of (getAccountOverride (new AccountOverrideParam (null , null , null , null , null , new HexAddressParam ("0x0000000000000000000000000000000000000001" ))), false ),
302+ Arguments .of (getAccountOverride (new AccountOverrideParam (new HexNumberParam ("0x01" ), null , null , null , null , new HexAddressParam ("0x0000000000000000000000000000000000000001" ))), true ),
303+ Arguments .of (getAccountOverride (new AccountOverrideParam (new HexNumberParam ("0x01" ), null , null , null , null , null )), true ),
304+ Arguments .of (getAccountOverride (new AccountOverrideParam (null , new HexNumberParam ("0x01" ), null , null , null , null )), true ),
305+ Arguments .of (getAccountOverride (new AccountOverrideParam (null , null , new HexDataParam ("0x01" ), null , null , null )), true ),
306+ Arguments .of (getAccountOverride (new AccountOverrideParam (null , null , null , new HashMap <>(), null , null )), true ),
307+ Arguments .of (getAccountOverride (new AccountOverrideParam (null , null , null , null , new HashMap <>(), null )), true ),
308+ Arguments .of (getAccountOverride (new AccountOverrideParam (new HexNumberParam ("0x01" ), new HexNumberParam ("0x01" ), new HexDataParam ("0x01" ), new HashMap <>(), new HashMap <>(), new HexAddressParam ("0x0000000000000000000000000000000000000001" ))), true ),
309+ Arguments .of (getAccountOverride (new AccountOverrideParam (new HexNumberParam ("0x01" ), new HexNumberParam ("0x01" ), new HexDataParam ("0x01" ), new HashMap <>(), new HashMap <>(), null )), true )
310+ );
311+ }
312+
313+ private static AccountOverride getAccountOverride (AccountOverrideParam accountOverrideParam ) {
314+ RskAddress address = TestUtils .generateAddress ("test" );
315+ AccountOverride accountOverride = new AccountOverride (address );
316+ return accountOverride .fromAccountOverrideParam (accountOverrideParam );
317+ }
318+
245319}
0 commit comments