mirror of
https://github.com/luxfi/evm.git
synced 2026-09-24 00:27:44 +00:00
Updates dependencies: - github.com/luxfi/vm v1.0.22 → v1.0.23 (adds ZAP transport Serve) - github.com/luxfi/log v1.3.0 → v1.4.1 (fixes module path declaration) - github.com/luxfi/consensus v1.22.53 → v1.22.56 - github.com/luxfi/crypto v1.17.39 → v1.17.40 - github.com/luxfi/database v1.17.38 → v1.17.39 - github.com/luxfi/geth v1.16.69 → v1.16.73 - github.com/luxfi/p2p v1.18.7 → v1.18.8 - github.com/luxfi/warp v1.18.4 → v1.18.5 The vm package now provides a ZAP-based Serve function by default, eliminating the need for the grpc build tag for VM plugins. Also includes various improvements to validators, warp service, and precompile interfaces.
130 lines
4.5 KiB
Go
130 lines
4.5 KiB
Go
// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package extras
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/luxfi/evm/precompile/modules"
|
|
"github.com/luxfi/geth/common"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// TestAllGenesisPrecompilesDeterminism verifies that AllGenesisPrecompiles
|
|
// returns consistent results across multiple calls.
|
|
func TestAllGenesisPrecompilesDeterminism(t *testing.T) {
|
|
// Call multiple times and verify results are identical
|
|
result1 := AllGenesisPrecompiles()
|
|
result2 := AllGenesisPrecompiles()
|
|
|
|
require.Equal(t, len(result1), len(result2), "AllGenesisPrecompiles should return same number of precompiles")
|
|
|
|
for key, config1 := range result1 {
|
|
config2, ok := result2[key]
|
|
require.True(t, ok, "key %s should exist in both results", key)
|
|
require.Equal(t, config1.Key(), config2.Key(), "config keys should match")
|
|
// All genesis configs should have timestamp = 0
|
|
require.NotNil(t, config1.Timestamp(), "genesis config timestamp should not be nil")
|
|
require.Equal(t, uint64(0), *config1.Timestamp(), "genesis config timestamp should be 0")
|
|
}
|
|
|
|
// Verify all registered modules are present
|
|
for _, module := range modules.RegisteredModules() {
|
|
_, ok := result1[module.ConfigKey]
|
|
require.True(t, ok, "module %s should be in AllGenesisPrecompiles", module.ConfigKey)
|
|
}
|
|
}
|
|
|
|
// TestPrecompilesMarshalDeterministic verifies that MarshalJSONDeterministic
|
|
// produces consistent output regardless of map iteration order.
|
|
func TestPrecompilesMarshalDeterministic(t *testing.T) {
|
|
precompiles := AllGenesisPrecompiles()
|
|
|
|
// Marshal multiple times and verify output is identical
|
|
json1, err := precompiles.MarshalJSONDeterministic()
|
|
require.NoError(t, err)
|
|
|
|
json2, err := precompiles.MarshalJSONDeterministic()
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, string(json1), string(json2), "deterministic marshal should produce identical output")
|
|
|
|
// Verify it's valid JSON
|
|
var parsed map[string]json.RawMessage
|
|
err = json.Unmarshal(json1, &parsed)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(precompiles), len(parsed), "parsed JSON should have same number of keys")
|
|
}
|
|
|
|
// TestAddressBookResolution verifies that address resolution works correctly
|
|
// with addressBook overrides.
|
|
func TestAddressBookResolution(t *testing.T) {
|
|
// Skip if no modules are registered (shouldn't happen in normal build)
|
|
registeredMods := modules.RegisteredModules()
|
|
if len(registeredMods) == 0 {
|
|
t.Skip("no precompile modules registered")
|
|
}
|
|
|
|
// Use the first registered module for testing
|
|
testModule := registeredMods[0]
|
|
testKey := testModule.ConfigKey
|
|
defaultAddr := testModule.Address
|
|
|
|
// Create a different address for override
|
|
overrideAddr := common.HexToAddress("0x1234567890123456789012345678901234567890")
|
|
|
|
config := &ChainConfig{
|
|
AddressBook: map[string]common.Address{
|
|
testKey: overrideAddr,
|
|
},
|
|
}
|
|
|
|
// With addressBook override, should return override address
|
|
addr := config.GetPrecompileAddress(testKey)
|
|
require.Equal(t, overrideAddr, addr, "addressBook should override module address")
|
|
|
|
// Without addressBook override, should return module default
|
|
configNoOverride := &ChainConfig{}
|
|
addrDefault := configNoOverride.GetPrecompileAddress(testKey)
|
|
require.Equal(t, defaultAddr, addrDefault, "without addressBook, should use module address")
|
|
|
|
// Test LegacyWarpAddress constant is valid
|
|
require.NotEqual(t, common.Address{}, LegacyWarpAddress, "LegacyWarpAddress should be set")
|
|
}
|
|
|
|
// TestEmptyPrecompilesMarshal verifies that empty Precompiles marshal correctly.
|
|
func TestEmptyPrecompilesMarshal(t *testing.T) {
|
|
empty := Precompiles{}
|
|
json, err := empty.MarshalJSONDeterministic()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "{}", string(json), "empty Precompiles should marshal to {}")
|
|
}
|
|
|
|
// TestChainConfigGenesisPrecompilesRoundTrip tests that GenesisPrecompiles
|
|
// survive JSON round-trip through custom marshal/unmarshal.
|
|
func TestChainConfigGenesisPrecompilesRoundTrip(t *testing.T) {
|
|
original := &ChainConfig{
|
|
GenesisPrecompiles: AllGenesisPrecompiles(),
|
|
}
|
|
|
|
// Marshal
|
|
jsonBytes, err := json.Marshal(original)
|
|
require.NoError(t, err)
|
|
|
|
// Unmarshal
|
|
var restored ChainConfig
|
|
err = json.Unmarshal(jsonBytes, &restored)
|
|
require.NoError(t, err)
|
|
|
|
// Verify GenesisPrecompiles are restored
|
|
require.Equal(t, len(original.GenesisPrecompiles), len(restored.GenesisPrecompiles),
|
|
"GenesisPrecompiles should have same length after round-trip")
|
|
|
|
for key := range original.GenesisPrecompiles {
|
|
_, ok := restored.GenesisPrecompiles[key]
|
|
require.True(t, ok, "key %s should exist after round-trip", key)
|
|
}
|
|
}
|