github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/build/tools/trezor-common/sync-coins.go (about)

     1  //usr/bin/go run $0 $@ ; exit
     2  package main
     3  
     4  import (
     5  	"encoding/json"
     6  	"errors"
     7  	"fmt"
     8  	"io"
     9  	"io/ioutil"
    10  	"net/http"
    11  	"os"
    12  	"path/filepath"
    13  	"strconv"
    14  	"strings"
    15  
    16  	build "github.com/trezor/blockbook/build/tools"
    17  )
    18  
    19  const (
    20  	configsDir          = "configs"
    21  	trezorCommonDefsURL = "https://raw.githubusercontent.com/trezor/trezor-firmware/master/common/defs/bitcoin/"
    22  )
    23  
    24  type trezorCommonDef struct {
    25  	Name                  string `json:"coin_name"`
    26  	Shortcut              string `json:"coin_shortcut"`
    27  	Label                 string `json:"coin_label"`
    28  	XPubMagic             uint32 `json:"xpub_magic"`
    29  	XPubMagicSegwitP2sh   uint32 `json:"xpub_magic_segwit_p2sh"`
    30  	XPubMagicSegwitNative uint32 `json:"xpub_magic_segwit_native"`
    31  	Slip44                uint32 `json:"slip44,omitempty"`
    32  }
    33  
    34  func getTrezorCommonDef(coin string) (*trezorCommonDef, error) {
    35  	req, err := http.NewRequest("GET", trezorCommonDefsURL+coin+".json", nil)
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  	resp, err := http.DefaultClient.Do(req)
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  	defer resp.Body.Close()
    44  	if resp.StatusCode != http.StatusOK {
    45  		return nil, errors.New("Github request status code " + strconv.Itoa(resp.StatusCode))
    46  	}
    47  	bb, err := ioutil.ReadAll(resp.Body)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  	var tcd trezorCommonDef
    52  	json.Unmarshal(bb, &tcd)
    53  	return &tcd, nil
    54  }
    55  
    56  func writeConfig(coin string, config *build.Config) error {
    57  	path := filepath.Join(configsDir, "coins", coin+".json")
    58  	out, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
    59  	if err != nil {
    60  		return err
    61  	}
    62  	defer out.Close()
    63  	buf, err := json.MarshalIndent(config, "", "  ")
    64  	if err != nil {
    65  		return err
    66  	}
    67  	n, err := out.Write(buf)
    68  	if err != nil {
    69  		return err
    70  	}
    71  	if n < len(buf) {
    72  		return io.ErrShortWrite
    73  	}
    74  	return nil
    75  }
    76  
    77  func main() {
    78  	var coins []string
    79  	if len(os.Args) < 2 {
    80  		filepath.Walk(filepath.Join(configsDir, "coins"), func(path string, info os.FileInfo, err error) error {
    81  			n := strings.TrimSuffix(info.Name(), ".json")
    82  			if n != info.Name() {
    83  				coins = append(coins, n)
    84  			}
    85  			return nil
    86  		})
    87  	} else {
    88  		coins = append(coins, os.Args[1])
    89  	}
    90  	for _, coin := range coins {
    91  		config, err := build.LoadConfig(configsDir, coin)
    92  		if err == nil {
    93  			var tcd *trezorCommonDef
    94  			tcd, err = getTrezorCommonDef(coin)
    95  			if err == nil {
    96  				if tcd.Name != "" {
    97  					config.Coin.Name = tcd.Name
    98  				}
    99  				if tcd.Shortcut != "" {
   100  					config.Coin.Shortcut = tcd.Shortcut
   101  				}
   102  				if tcd.Label != "" {
   103  					config.Coin.Label = tcd.Label
   104  				}
   105  				if tcd.XPubMagic != 0 {
   106  					config.Blockbook.BlockChain.XPubMagic = tcd.XPubMagic
   107  				}
   108  				if tcd.XPubMagicSegwitP2sh != 0 {
   109  					config.Blockbook.BlockChain.XPubMagicSegwitP2sh = tcd.XPubMagicSegwitP2sh
   110  				}
   111  				if tcd.XPubMagicSegwitNative != 0 {
   112  					config.Blockbook.BlockChain.XPubMagicSegwitNative = tcd.XPubMagicSegwitNative
   113  				}
   114  				if tcd.Slip44 != 0 {
   115  					config.Blockbook.BlockChain.Slip44 = tcd.Slip44
   116  				}
   117  				err = writeConfig(coin, config)
   118  				if err == nil {
   119  					fmt.Printf("%v updated\n", coin)
   120  				}
   121  			}
   122  		}
   123  		if err != nil {
   124  			fmt.Printf("%v update error %v\n", coin, err)
   125  		}
   126  	}
   127  }