synapsecns/sanguine

View on GitHub
ethergo/backends/anvil/hardfork_test.go

Summary

Maintainability
D
2 days
Test Coverage
package anvil_test

import (
    "github.com/brianvoe/gofakeit/v6"
    "github.com/ethereum/go-ethereum/params"
    . "github.com/stretchr/testify/assert"
    "github.com/synapsecns/sanguine/ethergo/backends/anvil"
    "math/big"
    "testing"
)

func TestHardfork(t *testing.T) {
    hardforks := anvil.AllHardforks()
    for _, hardfork := range hardforks {
        chainCfg := hardfork.ToChainConfig(new(big.Int).SetUint64(gofakeit.Uint64()))
        NoError(t, chainCfg.CheckConfigForkOrder())
    }
}

// nolint: dupl, thelper
func TestToChainConfig(t *testing.T) {
    chainID := big.NewInt(1)

    tests := []struct {
        name      string
        hardfork  anvil.Hardfork
        checkFunc func(t *testing.T, chainConfig *params.ChainConfig)
    }{
        {
            name:     "Frontier",
            hardfork: anvil.Frontier,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                Nil(t, chainConfig.HomesteadBlock)
            },
        },
        {
            name:     "Homestead",
            hardfork: anvil.Homestead,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                False(t, chainConfig.IsDAOFork(big.NewInt(0)))
            },
        },
        {
            name:     "DAO",
            hardfork: anvil.DAO,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                False(t, chainConfig.IsEIP150(big.NewInt(0)))
            },
        },
        {
            name:     "Tangerine",
            hardfork: anvil.Tangerine,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                False(t, chainConfig.IsEIP155(big.NewInt(0)))
            },
        },
        {
            name:     "Spurious",
            hardfork: anvil.Spurious,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                True(t, chainConfig.IsEIP155(big.NewInt(0)))
                True(t, chainConfig.IsEIP158(big.NewInt(0)))
                False(t, chainConfig.IsByzantium(big.NewInt(0)))
            },
        },
        {
            name:     "Byzantium",
            hardfork: anvil.Byzantium,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                True(t, chainConfig.IsEIP155(big.NewInt(0)))
                True(t, chainConfig.IsEIP158(big.NewInt(0)))
                True(t, chainConfig.IsByzantium(big.NewInt(0)))
                False(t, chainConfig.IsConstantinople(big.NewInt(0)))
            },
        },
        {
            name:     "Constantinople",
            hardfork: anvil.Constantinople,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                True(t, chainConfig.IsEIP155(big.NewInt(0)))
                True(t, chainConfig.IsEIP158(big.NewInt(0)))
                True(t, chainConfig.IsByzantium(big.NewInt(0)))
                True(t, chainConfig.IsConstantinople(big.NewInt(0)))
                // IsPetersburg returns whether num is either
                // - equal to or greater than the PetersburgBlock fork block,
                // - OR is nil, and Constantinople is active
                True(t, chainConfig.IsPetersburg(big.NewInt(0)))
            },
        },
        {
            name:     "Petersburg",
            hardfork: anvil.Petersburg,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                True(t, chainConfig.IsEIP155(big.NewInt(0)))
                True(t, chainConfig.IsEIP158(big.NewInt(0)))
                True(t, chainConfig.IsByzantium(big.NewInt(0)))
                True(t, chainConfig.IsConstantinople(big.NewInt(0)))
                True(t, chainConfig.IsPetersburg(big.NewInt(0)))
                False(t, chainConfig.IsIstanbul(big.NewInt(0)))
            },
        },
        {
            name:     "Istanbul",
            hardfork: anvil.Istanbul,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                True(t, chainConfig.IsEIP155(big.NewInt(0)))
                True(t, chainConfig.IsEIP158(big.NewInt(0)))
                True(t, chainConfig.IsByzantium(big.NewInt(0)))
                True(t, chainConfig.IsConstantinople(big.NewInt(0)))
                True(t, chainConfig.IsPetersburg(big.NewInt(0)))
                True(t, chainConfig.IsIstanbul(big.NewInt(0)))
                False(t, chainConfig.IsMuirGlacier(big.NewInt(0)))
            },
        },
        {
            name:     "MuirGlacier",
            hardfork: anvil.MuirGlacier,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                True(t, chainConfig.IsEIP155(big.NewInt(0)))
                True(t, chainConfig.IsEIP158(big.NewInt(0)))
                True(t, chainConfig.IsByzantium(big.NewInt(0)))
                True(t, chainConfig.IsConstantinople(big.NewInt(0)))
                True(t, chainConfig.IsPetersburg(big.NewInt(0)))
                True(t, chainConfig.IsIstanbul(big.NewInt(0)))
                True(t, chainConfig.IsMuirGlacier(big.NewInt(0)))
                False(t, chainConfig.IsBerlin(big.NewInt(0)))
            },
        },
        {
            name:     "Berlin",
            hardfork: anvil.Berlin,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                True(t, chainConfig.IsEIP155(big.NewInt(0)))
                True(t, chainConfig.IsEIP158(big.NewInt(0)))
                True(t, chainConfig.IsByzantium(big.NewInt(0)))
                True(t, chainConfig.IsConstantinople(big.NewInt(0)))
                True(t, chainConfig.IsPetersburg(big.NewInt(0)))
                True(t, chainConfig.IsIstanbul(big.NewInt(0)))
                True(t, chainConfig.IsMuirGlacier(big.NewInt(0)))
                True(t, chainConfig.IsBerlin(big.NewInt(0)))
                False(t, chainConfig.IsLondon(big.NewInt(0)))
            },
        },
        {
            name:     "London",
            hardfork: anvil.London,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                True(t, chainConfig.IsEIP155(big.NewInt(0)))
                True(t, chainConfig.IsEIP158(big.NewInt(0)))
                True(t, chainConfig.IsByzantium(big.NewInt(0)))
                True(t, chainConfig.IsConstantinople(big.NewInt(0)))
                True(t, chainConfig.IsPetersburg(big.NewInt(0)))
                True(t, chainConfig.IsIstanbul(big.NewInt(0)))
                True(t, chainConfig.IsMuirGlacier(big.NewInt(0)))
                True(t, chainConfig.IsBerlin(big.NewInt(0)))
                True(t, chainConfig.IsLondon(big.NewInt(0)))
                False(t, chainConfig.IsArrowGlacier(big.NewInt(0)))
            },
        },
        {
            name:     "ArrowGlacier",
            hardfork: anvil.ArrowGlacier,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                True(t, chainConfig.IsEIP155(big.NewInt(0)))
                True(t, chainConfig.IsEIP158(big.NewInt(0)))
                True(t, chainConfig.IsByzantium(big.NewInt(0)))
                True(t, chainConfig.IsConstantinople(big.NewInt(0)))
                True(t, chainConfig.IsPetersburg(big.NewInt(0)))
                True(t, chainConfig.IsIstanbul(big.NewInt(0)))
                True(t, chainConfig.IsMuirGlacier(big.NewInt(0)))
                True(t, chainConfig.IsBerlin(big.NewInt(0)))
                True(t, chainConfig.IsLondon(big.NewInt(0)))
                True(t, chainConfig.IsArrowGlacier(big.NewInt(0)))
                False(t, chainConfig.IsGrayGlacier(big.NewInt(0)))
            },
        },
        {
            name:     "GrayGlacier",
            hardfork: anvil.GrayGlacier,
            checkFunc: func(t *testing.T, chainConfig *params.ChainConfig) {
                NotNil(t, chainConfig.HomesteadBlock)
                True(t, chainConfig.IsHomestead(big.NewInt(0)))
                True(t, chainConfig.IsDAOFork(big.NewInt(0)))
                True(t, chainConfig.IsEIP150(big.NewInt(0)))
                True(t, chainConfig.IsEIP155(big.NewInt(0)))
                True(t, chainConfig.IsEIP158(big.NewInt(0)))
                True(t, chainConfig.IsByzantium(big.NewInt(0)))
                True(t, chainConfig.IsConstantinople(big.NewInt(0)))
                True(t, chainConfig.IsPetersburg(big.NewInt(0)))
                True(t, chainConfig.IsIstanbul(big.NewInt(0)))
                True(t, chainConfig.IsMuirGlacier(big.NewInt(0)))
                True(t, chainConfig.IsBerlin(big.NewInt(0)))
                True(t, chainConfig.IsLondon(big.NewInt(0)))
                True(t, chainConfig.IsArrowGlacier(big.NewInt(0)))
                True(t, chainConfig.IsGrayGlacier(big.NewInt(0)))
            },
        },
        // Add other hardfork test cases here
    }

    for i := range tests {
        test := tests[i]
        t.Run(test.name, func(t *testing.T) {
            chainConfig := test.hardfork.ToChainConfig(chainID)
            Equal(t, chainID, chainConfig.ChainID)

            test.checkFunc(t, chainConfig)
        })
    }
}