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 }