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 }