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  }