Files
2026-01-08 20:36:16 -08:00

66 lines
1.9 KiB
Go

// Copyright (C) 2022-2025, Lux Industries Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package utils
import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/luxfi/constants"
"github.com/luxfi/evm/params/extras"
"github.com/luxfi/evm/rpc"
"github.com/onsi/gomega"
)
const chainConfigAPI = "eth_getChainConfig"
func CheckUpgradeIsDeployed(rpcEndpoint string, deployedUpgrades extras.UpgradeConfig) error {
ctx, cancel := context.WithTimeout(context.Background(), constants.E2ERequestTimeout)
defer cancel()
rpcClient, err := rpc.DialContext(ctx, rpcEndpoint)
if err != nil {
return err
}
// evm doesn't serialize the 'upgrades' section in a way that maps to go objects
// (serialized with `json:"-"`)
// therefore we need to do it manually:
// first we get the response as a JSON string
var chainConfig json.RawMessage
if err := rpcClient.CallContext(ctx, &chainConfig, chainConfigAPI); err != nil {
return err
}
// we want the "upgrades" section - easiest is to first unmarshal to a map...
var jsonToGo map[string]interface{}
if err := json.Unmarshal(chainConfig, &jsonToGo); err != nil {
return fmt.Errorf("failed to unpack JSON string to go map[string]interface{}")
}
// ...then access the part we need...
upgradesI, ok := jsonToGo["upgrades"]
if !ok {
return errors.New("failed to find the 'upgrades' section in the JSON response")
}
// then we serialize that back to a byte slice...
serialized, err := json.Marshal(upgradesI)
if err != nil {
return fmt.Errorf("failed to serialize 'upgrades' section: %w", err)
}
// ...so that we finally can unmarshal to the object we need
var appliedUpgrades extras.UpgradeConfig
if err := json.Unmarshal(serialized, &appliedUpgrades); err != nil {
return fmt.Errorf("failed to unpack JSON strings to params.UpgradeConfig")
}
gomega.Expect(appliedUpgrades).Should(gomega.Equal(deployedUpgrades))
return nil
}