@@ -891,6 +891,44 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) {
891
891
}
892
892
}
893
893
894
+ func TestEtnaStandardTxExecutorAddSubnetValidator (t * testing.T ) {
895
+ require := require .New (t )
896
+ env := newEnvironment (t , upgradetest .Etna )
897
+ env .ctx .Lock .Lock ()
898
+ defer env .ctx .Lock .Unlock ()
899
+
900
+ nodeID := genesisNodeIDs [0 ]
901
+
902
+ builder , signer := env .factory .NewWallet (testSubnet1ControlKeys [0 ], testSubnet1ControlKeys [1 ])
903
+ utx , err := builder .NewAddSubnetValidatorTx (
904
+ & txs.SubnetValidator {
905
+ Validator : txs.Validator {
906
+ NodeID : nodeID ,
907
+ Start : uint64 (defaultValidateStartTime .Unix () + 1 ),
908
+ End : uint64 (defaultValidateEndTime .Unix ()),
909
+ Wght : defaultWeight ,
910
+ },
911
+ Subnet : testSubnet1 .ID (),
912
+ },
913
+ )
914
+ require .NoError (err )
915
+ tx , err := walletsigner .SignUnsigned (context .Background (), signer , utx )
916
+ require .NoError (err )
917
+
918
+ onAcceptState , err := state .NewDiff (lastAcceptedID , env )
919
+ require .NoError (err )
920
+
921
+ onAcceptState .SetSubnetManager (testSubnet1 .ID (), ids .GenerateTestID (), []byte {'a' , 'd' , 'd' , 'r' , 'e' , 's' , 's' })
922
+
923
+ executor := StandardTxExecutor {
924
+ Backend : & env .backend ,
925
+ State : onAcceptState ,
926
+ Tx : tx ,
927
+ }
928
+ err = tx .Unsigned .Visit (& executor )
929
+ require .ErrorIs (err , errIsImmutable )
930
+ }
931
+
894
932
func TestBanffStandardTxExecutorAddValidator (t * testing.T ) {
895
933
require := require .New (t )
896
934
env := newEnvironment (t , upgradetest .Banff )
@@ -1984,6 +2022,32 @@ func TestStandardExecutorRemoveSubnetValidatorTx(t *testing.T) {
1984
2022
},
1985
2023
expectedErr : ErrFlowCheckFailed ,
1986
2024
},
2025
+ {
2026
+ name : "attempted to remove subnet validator after subnet manager is set" ,
2027
+ newExecutor : func (ctrl * gomock.Controller ) (* txs.RemoveSubnetValidatorTx , * StandardTxExecutor ) {
2028
+ env := newValidRemoveSubnetValidatorTxVerifyEnv (t , ctrl )
2029
+ env .state .EXPECT ().GetSubnetManager (env .unsignedTx .Subnet ).Return (ids .GenerateTestID (), []byte {'a' , 'd' , 'd' , 'r' , 'e' , 's' , 's' }, nil ).AnyTimes ()
2030
+ env .state .EXPECT ().GetTimestamp ().Return (env .latestForkTime ).AnyTimes ()
2031
+
2032
+ cfg := & config.Config {
2033
+ UpgradeConfig : upgradetest .GetConfigWithUpgradeTime (upgradetest .Etna , env .latestForkTime ),
2034
+ }
2035
+ e := & StandardTxExecutor {
2036
+ Backend : & Backend {
2037
+ Config : cfg ,
2038
+ Bootstrapped : & utils.Atomic [bool ]{},
2039
+ Fx : env .fx ,
2040
+ FlowChecker : env .flowChecker ,
2041
+ Ctx : & snow.Context {},
2042
+ },
2043
+ Tx : env .tx ,
2044
+ State : env .state ,
2045
+ }
2046
+ e .Bootstrapped .Set (true )
2047
+ return env .unsignedTx , e
2048
+ },
2049
+ expectedErr : ErrRemoveValidatorManagedSubnet ,
2050
+ },
1987
2051
}
1988
2052
1989
2053
for _ , tt := range tests {
@@ -2213,6 +2277,7 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) {
2213
2277
subnetOwner := fx .NewMockOwner (ctrl )
2214
2278
env .state .EXPECT ().GetTimestamp ().Return (env .latestForkTime ).AnyTimes ()
2215
2279
env .state .EXPECT ().GetSubnetOwner (env .unsignedTx .Subnet ).Return (subnetOwner , nil )
2280
+ env .state .EXPECT ().GetSubnetManager (env .unsignedTx .Subnet ).Return (ids .Empty , nil , database .ErrNotFound ).Times (1 )
2216
2281
env .state .EXPECT ().GetSubnetTransformation (env .unsignedTx .Subnet ).Return (nil , database .ErrNotFound ).Times (1 )
2217
2282
env .fx .EXPECT ().VerifyPermission (gomock .Any (), env .unsignedTx .SubnetAuth , env .tx .Creds [len (env .tx .Creds )- 1 ], subnetOwner ).Return (nil )
2218
2283
env .flowChecker .EXPECT ().VerifySpend (
@@ -2242,6 +2307,41 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) {
2242
2307
},
2243
2308
err : ErrFlowCheckFailed ,
2244
2309
},
2310
+ {
2311
+ name : "invalid if subnet manager is set" ,
2312
+ newExecutor : func (ctrl * gomock.Controller ) (* txs.TransformSubnetTx , * StandardTxExecutor ) {
2313
+ env := newValidTransformSubnetTxVerifyEnv (t , ctrl )
2314
+
2315
+ // Set dependency expectations.
2316
+ subnetOwner := fx .NewMockOwner (ctrl )
2317
+ env .state .EXPECT ().GetTimestamp ().Return (env .latestForkTime ).AnyTimes ()
2318
+ env .state .EXPECT ().GetSubnetOwner (env .unsignedTx .Subnet ).Return (subnetOwner , nil ).Times (1 )
2319
+ env .state .EXPECT ().GetSubnetManager (env .unsignedTx .Subnet ).Return (ids .GenerateTestID (), make ([]byte , 20 ), nil )
2320
+ env .state .EXPECT ().GetSubnetTransformation (env .unsignedTx .Subnet ).Return (nil , database .ErrNotFound ).Times (1 )
2321
+ env .fx .EXPECT ().VerifyPermission (env .unsignedTx , env .unsignedTx .SubnetAuth , env .tx .Creds [len (env .tx .Creds )- 1 ], subnetOwner ).Return (nil ).Times (1 )
2322
+
2323
+ cfg := & config.Config {
2324
+ UpgradeConfig : upgradetest .GetConfigWithUpgradeTime (upgradetest .Durango , env .latestForkTime ),
2325
+ MaxStakeDuration : math .MaxInt64 ,
2326
+ }
2327
+ feeCalculator := state .PickFeeCalculator (cfg , env .state )
2328
+ e := & StandardTxExecutor {
2329
+ Backend : & Backend {
2330
+ Config : cfg ,
2331
+ Bootstrapped : & utils.Atomic [bool ]{},
2332
+ Fx : env .fx ,
2333
+ FlowChecker : env .flowChecker ,
2334
+ Ctx : & snow.Context {},
2335
+ },
2336
+ FeeCalculator : feeCalculator ,
2337
+ Tx : env .tx ,
2338
+ State : env .state ,
2339
+ }
2340
+ e .Bootstrapped .Set (true )
2341
+ return env .unsignedTx , e
2342
+ },
2343
+ err : errIsImmutable ,
2344
+ },
2245
2345
{
2246
2346
name : "valid tx" ,
2247
2347
newExecutor : func (ctrl * gomock.Controller ) (* txs.TransformSubnetTx , * StandardTxExecutor ) {
@@ -2251,6 +2351,7 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) {
2251
2351
subnetOwner := fx .NewMockOwner (ctrl )
2252
2352
env .state .EXPECT ().GetTimestamp ().Return (env .latestForkTime ).AnyTimes ()
2253
2353
env .state .EXPECT ().GetSubnetOwner (env .unsignedTx .Subnet ).Return (subnetOwner , nil ).Times (1 )
2354
+ env .state .EXPECT ().GetSubnetManager (env .unsignedTx .Subnet ).Return (ids .Empty , nil , database .ErrNotFound ).Times (1 )
2254
2355
env .state .EXPECT ().GetSubnetTransformation (env .unsignedTx .Subnet ).Return (nil , database .ErrNotFound ).Times (1 )
2255
2356
env .fx .EXPECT ().VerifyPermission (env .unsignedTx , env .unsignedTx .SubnetAuth , env .tx .Creds [len (env .tx .Creds )- 1 ], subnetOwner ).Return (nil ).Times (1 )
2256
2357
env .flowChecker .EXPECT ().VerifySpend (
0 commit comments