Files
evm/params/extras/network_upgrades_test.go
T
zeekay 162e4f6668 refactor: remove all SubnetEVM references and backward compatibility
- Rename plugin/evm/upgrade/subnetevm package to feewindow
- Rename SubnetEVMTimestamp to EVMTimestamp (JSON: evmTimestamp)
- Rename IsSubnetEVM method to IsEVM
- Rename SubnetEVMDefaultChainConfig to EVMDefaultChainConfig
- Rename TestSubnetEVMChainConfig to TestEVMChainConfig
- Rename TestPreSubnetEVMChainConfig to TestPreEVMChainConfig
- Rename ethclient/subnetevmclient to ethclient/evmclient
- Update VM factory ID from "subnetevm" to "evm"
- Remove all backward compatibility aliases
- Update all documentation and comments

Breaking change: This removes all SubnetEVM naming - only "EVM" is supported.
No backward compatibility maintained as per user requirement.
2025-12-21 10:26:52 -08:00

366 lines
9.4 KiB
Go

// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package extras
import (
"testing"
"github.com/luxfi/evm/utils"
"github.com/luxfi/upgrade"
"github.com/luxfi/upgrade/upgradetest"
"github.com/stretchr/testify/require"
)
// getTestFujiUpgrades returns a test network upgrades config with EtnaTimestamp set
// This is used for testing upgrade compatibility scenarios
func getTestFujiUpgrades() NetworkUpgrades {
return NetworkUpgrades{
EVMTimestamp: utils.NewUint64(0),
DurangoTimestamp: utils.NewUint64(0),
EtnaTimestamp: utils.NewUint64(100), // Set for testing
FortunaTimestamp: utils.NewUint64(1000),
GraniteTimestamp: nil,
}
}
// Create test upgrade configs with scheduled upgrades for testing
// These simulate network configs where Durango is already activated (at InitiallyActiveTime)
func getTestMainnetConfig() upgrade.Config {
return upgradetest.GetConfig(upgradetest.Durango)
}
func getTestFujiConfig() upgrade.Config {
return upgradetest.GetConfig(upgradetest.Durango)
}
func TestNetworkUpgradesEqual(t *testing.T) {
testcases := []struct {
name string
upgrades1 *NetworkUpgrades
upgrades2 *NetworkUpgrades
expected bool
}{
{
name: "EqualNetworkUpgrades",
upgrades1: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
upgrades2: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
expected: true,
},
{
name: "NotEqualNetworkUpgrades",
upgrades1: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
upgrades2: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(3),
},
expected: false,
},
{
name: "NilNetworkUpgrades",
upgrades1: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
upgrades2: nil,
expected: false,
},
{
name: "NilNetworkUpgrade",
upgrades1: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
upgrades2: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: nil,
},
expected: false,
},
}
for _, test := range testcases {
t.Run(test.name, func(t *testing.T) {
require.Equal(t, test.expected, test.upgrades1.Equal(test.upgrades2))
})
}
}
func TestCheckNetworkUpgradesCompatible(t *testing.T) {
testcases := []struct {
name string
upgrades1 *NetworkUpgrades
upgrades2 *NetworkUpgrades
time uint64
valid bool
}{
{
name: "Compatible_same_NetworkUpgrades",
upgrades1: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
upgrades2: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
time: 1,
valid: true,
},
{
name: "Compatible_different_NetworkUpgrades",
upgrades1: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
upgrades2: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(3),
},
time: 1,
valid: true,
},
{
name: "Compatible_nil_NetworkUpgrades",
upgrades1: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
upgrades2: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: nil,
},
time: 1,
valid: true,
},
{
name: "Incompatible_rewinded_NetworkUpgrades",
upgrades1: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
upgrades2: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(1),
},
time: 1,
valid: false,
},
{
name: "Incompatible_fastforward_NetworkUpgrades",
upgrades1: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
upgrades2: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(3),
},
time: 4,
valid: false,
},
{
name: "Incompatible_nil_NetworkUpgrades",
upgrades1: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
upgrades2: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: nil,
},
time: 2,
valid: false,
},
{
name: "Incompatible_fastforward_nil_NetworkUpgrades",
upgrades1: func() *NetworkUpgrades {
upgrades := getTestFujiUpgrades()
return &upgrades
}(),
upgrades2: func() *NetworkUpgrades {
upgrades := getTestFujiUpgrades()
upgrades.EtnaTimestamp = nil
return &upgrades
}(),
time: 500, // Time past Etna (100), so setting Etna to nil is incompatible
valid: false,
},
{
name: "Compatible_Fortuna_fastforward_nil_NetworkUpgrades",
upgrades1: func() *NetworkUpgrades {
upgrades := getTestFujiUpgrades()
return &upgrades
}(),
upgrades2: func() *NetworkUpgrades {
upgrades := getTestFujiUpgrades()
upgrades.FortunaTimestamp = nil
return &upgrades
}(),
time: 500, // Time before Fortuna (1000), so setting Fortuna to nil is compatible
valid: true,
},
}
for _, test := range testcases {
t.Run(test.name, func(t *testing.T) {
err := test.upgrades1.checkNetworkUpgradesCompatible(test.upgrades2, test.time)
if test.valid {
require.Nil(t, err)
} else {
require.NotNil(t, err)
}
})
}
}
func TestVerifyNetworkUpgrades(t *testing.T) {
testcases := []struct {
name string
upgrades *NetworkUpgrades
luxdUpgrades upgrade.Config
valid bool
}{
{
name: "ValidNetworkUpgrades_for_latest_network",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(0),
DurangoTimestamp: utils.NewUint64(0), // Must be 0 since default is 0
EtnaTimestamp: utils.NewUint64(0), // Must be 0 for Latest
FortunaTimestamp: utils.NewUint64(0), // Must be 0 for Latest
GraniteTimestamp: utils.NewUint64(0), // Must be 0 for Latest
},
luxdUpgrades: upgradetest.GetConfig(upgradetest.Latest),
valid: true,
},
{
name: "Invalid_Durango_nil_upgrade",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: nil,
},
luxdUpgrades: getTestMainnetConfig(),
valid: false,
},
{
name: "Invalid_EVM_non-zero",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(2),
},
luxdUpgrades: getTestMainnetConfig(),
valid: false,
},
{
name: "Invalid_Durango_before_default_upgrade",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(0),
DurangoTimestamp: utils.NewUint64(1), // Non-zero when default is 0
},
luxdUpgrades: getTestMainnetConfig(),
valid: false,
},
{
name: "Invalid_Mainnet_Durango_reconfigured",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(0),
DurangoTimestamp: utils.NewUint64(1000), // Changed from default 0
},
luxdUpgrades: getTestMainnetConfig(),
valid: false,
},
{
name: "Invalid_Testnet_Durango_reconfigured",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(0),
DurangoTimestamp: utils.NewUint64(1000), // Changed from default 0
},
luxdUpgrades: getTestFujiConfig(),
valid: false,
},
{
name: "Valid_Etna_nil_when_unscheduled",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(0),
DurangoTimestamp: utils.NewUint64(0), // Genesis
EtnaTimestamp: nil, // Valid when Etna is unscheduled
},
luxdUpgrades: getTestMainnetConfig(), // Durango is active, Etna is not
valid: true,
},
{
name: "Invalid_Etna_before_Durango",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(0),
DurangoTimestamp: utils.NewUint64(100),
EtnaTimestamp: utils.NewUint64(99),
},
luxdUpgrades: getTestMainnetConfig(),
valid: false,
},
{
name: "Valid_Fortuna_nil",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(0),
DurangoTimestamp: utils.NewUint64(0), // Genesis
EtnaTimestamp: utils.NewUint64(500), // Test timestamp
FortunaTimestamp: nil,
},
luxdUpgrades: getTestFujiConfig(),
valid: true,
},
}
for _, test := range testcases {
t.Run(test.name, func(t *testing.T) {
err := test.upgrades.verifyNetworkUpgrades(test.luxdUpgrades)
if test.valid {
require.Nil(t, err)
} else {
require.NotNil(t, err)
}
})
}
}
func TestForkOrder(t *testing.T) {
testcases := []struct {
name string
upgrades *NetworkUpgrades
expectedErr bool
}{
{
name: "ValidNetworkUpgrades",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(0),
DurangoTimestamp: utils.NewUint64(2),
},
expectedErr: false,
},
{
name: "Invalid order",
upgrades: &NetworkUpgrades{
EVMTimestamp: utils.NewUint64(1),
DurangoTimestamp: utils.NewUint64(0),
},
expectedErr: true,
},
}
for _, test := range testcases {
t.Run(test.name, func(t *testing.T) {
err := checkForks(test.upgrades.forkOrder(), false)
if test.expectedErr {
require.NotNil(t, err)
} else {
require.Nil(t, err)
}
})
}
}