github.com/crptec/blockbook@v0.3.2/build/tools/trezor-common/sync-coins.go (about)

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