github.com/palisadeinc/bor@v0.0.0-20230615125219-ab7196213d15/internal/cli/server/chains/chain.go (about)

     1  package chains
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  	"os"
     8  
     9  	"github.com/ethereum/go-ethereum/common"
    10  	"github.com/ethereum/go-ethereum/core"
    11  	"github.com/ethereum/go-ethereum/log"
    12  )
    13  
    14  type Chain struct {
    15  	Hash      common.Hash
    16  	Genesis   *core.Genesis
    17  	Bootnodes []string
    18  	NetworkId uint64
    19  	DNS       []string
    20  }
    21  
    22  var chains = map[string]*Chain{
    23  	"mainnet": mainnetBor,
    24  	"mumbai":  mumbaiTestnet,
    25  }
    26  
    27  func GetChain(name string) (*Chain, error) {
    28  	var (
    29  		chain *Chain
    30  		err   error
    31  	)
    32  
    33  	if _, fileErr := os.Stat(name); fileErr == nil {
    34  		if chain, err = ImportFromFile(name); err != nil {
    35  			return nil, fmt.Errorf("error importing chain from file: %v", err)
    36  		}
    37  
    38  		return chain, nil
    39  	} else if errors.Is(fileErr, os.ErrNotExist) {
    40  		var ok bool
    41  		if chain, ok = chains[name]; !ok {
    42  			return nil, fmt.Errorf("chain %s not found", name)
    43  		}
    44  
    45  		return chain, nil
    46  	} else {
    47  		return nil, fileErr
    48  	}
    49  }
    50  
    51  func ImportFromFile(filename string) (*Chain, error) {
    52  	data, err := os.ReadFile(filename)
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  
    57  	return importChain(data)
    58  }
    59  
    60  func importChain(content []byte) (*Chain, error) {
    61  	var chain *Chain
    62  
    63  	if err := json.Unmarshal(content, &chain); err != nil {
    64  		return nil, err
    65  	}
    66  
    67  	if chain.Genesis == nil {
    68  		log.Info("Try reading as legacy genesis")
    69  
    70  		var genesis core.Genesis
    71  		if err := json.Unmarshal(content, &genesis); err != nil {
    72  			return nil, err
    73  		}
    74  
    75  		if genesis.Config != nil {
    76  			chain.Genesis = &genesis
    77  			chain.NetworkId = genesis.Config.ChainID.Uint64()
    78  		} else {
    79  			return nil, fmt.Errorf("unable to parse chain config")
    80  		}
    81  	}
    82  
    83  	return chain, nil
    84  }