github.com/ava-labs/avalanchego@v1.11.11/vms/platformvm/txs/executor/state_changes_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package executor 5 6 import ( 7 "testing" 8 "time" 9 10 "github.com/stretchr/testify/require" 11 12 "github.com/ava-labs/avalanchego/upgrade/upgradetest" 13 "github.com/ava-labs/avalanchego/vms/components/gas" 14 "github.com/ava-labs/avalanchego/vms/platformvm/config" 15 "github.com/ava-labs/avalanchego/vms/platformvm/state" 16 "github.com/ava-labs/avalanchego/vms/platformvm/state/statetest" 17 ) 18 19 func TestAdvanceTimeTo_UpdatesFeeState(t *testing.T) { 20 const ( 21 secondsToAdvance = 3 22 durationToAdvance = secondsToAdvance * time.Second 23 ) 24 25 feeConfig := gas.Config{ 26 MaxCapacity: 1000, 27 MaxPerSecond: 100, 28 TargetPerSecond: 50, 29 } 30 31 tests := []struct { 32 name string 33 fork upgradetest.Fork 34 initialState gas.State 35 expectedState gas.State 36 }{ 37 { 38 name: "Pre-Etna", 39 fork: upgradetest.Durango, 40 initialState: gas.State{}, 41 expectedState: gas.State{}, // Pre-Etna, fee state should not change 42 }, 43 { 44 name: "Etna with no usage", 45 initialState: gas.State{ 46 Capacity: feeConfig.MaxCapacity, 47 Excess: 0, 48 }, 49 expectedState: gas.State{ 50 Capacity: feeConfig.MaxCapacity, 51 Excess: 0, 52 }, 53 }, 54 { 55 name: "Etna with usage", 56 fork: upgradetest.Etna, 57 initialState: gas.State{ 58 Capacity: 1, 59 Excess: 10_000, 60 }, 61 expectedState: gas.State{ 62 Capacity: min(gas.Gas(1).AddPerSecond(feeConfig.MaxPerSecond, secondsToAdvance), feeConfig.MaxCapacity), 63 Excess: gas.Gas(10_000).SubPerSecond(feeConfig.TargetPerSecond, secondsToAdvance), 64 }, 65 }, 66 } 67 for _, test := range tests { 68 t.Run(test.name, func(t *testing.T) { 69 var ( 70 require = require.New(t) 71 72 s = statetest.New(t, statetest.Config{}) 73 nextTime = s.GetTimestamp().Add(durationToAdvance) 74 ) 75 76 // Ensure the invariant that [nextTime <= nextStakerChangeTime] on 77 // AdvanceTimeTo is maintained. 78 nextStakerChangeTime, err := state.GetNextStakerChangeTime(s) 79 require.NoError(err) 80 require.False(nextTime.After(nextStakerChangeTime)) 81 82 s.SetFeeState(test.initialState) 83 84 validatorsModified, err := AdvanceTimeTo( 85 &Backend{ 86 Config: &config.Config{ 87 DynamicFeeConfig: feeConfig, 88 UpgradeConfig: upgradetest.GetConfig(test.fork), 89 }, 90 }, 91 s, 92 nextTime, 93 ) 94 require.NoError(err) 95 require.False(validatorsModified) 96 require.Equal(test.expectedState, s.GetFeeState()) 97 require.Equal(nextTime, s.GetTimestamp()) 98 }) 99 } 100 }