128 lines
3.1 KiB
Go
128 lines
3.1 KiB
Go
//usr/bin/go run $0 $@ ; exit
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"strings"
|
|
|
|
build "github.com/trezor/blockbook/build/tools"
|
|
)
|
|
|
|
const (
|
|
configsDir = "configs"
|
|
trezorCommonDefsURL = "https://raw.githubusercontent.com/trezor/trezor-firmware/master/common/defs/bitcoin/"
|
|
)
|
|
|
|
type trezorCommonDef struct {
|
|
Name string `json:"coin_name"`
|
|
Shortcut string `json:"coin_shortcut"`
|
|
Label string `json:"coin_label"`
|
|
XPubMagic uint32 `json:"xpub_magic"`
|
|
XPubMagicSegwitP2sh uint32 `json:"xpub_magic_segwit_p2sh"`
|
|
XPubMagicSegwitNative uint32 `json:"xpub_magic_segwit_native"`
|
|
Slip44 uint32 `json:"slip44,omitempty"`
|
|
}
|
|
|
|
func getTrezorCommonDef(coin string) (*trezorCommonDef, error) {
|
|
req, err := http.NewRequest("GET", trezorCommonDefsURL+coin+".json", nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
if resp.StatusCode != http.StatusOK {
|
|
return nil, errors.New("Github request status code " + strconv.Itoa(resp.StatusCode))
|
|
}
|
|
bb, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var tcd trezorCommonDef
|
|
json.Unmarshal(bb, &tcd)
|
|
return &tcd, nil
|
|
}
|
|
|
|
func writeConfig(coin string, config *build.Config) error {
|
|
path := filepath.Join(configsDir, "coins", coin+".json")
|
|
out, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer out.Close()
|
|
buf, err := json.MarshalIndent(config, "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
n, err := out.Write(buf)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if n < len(buf) {
|
|
return io.ErrShortWrite
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func main() {
|
|
var coins []string
|
|
if len(os.Args) < 2 {
|
|
filepath.Walk(filepath.Join(configsDir, "coins"), func(path string, info os.FileInfo, err error) error {
|
|
n := strings.TrimSuffix(info.Name(), ".json")
|
|
if n != info.Name() {
|
|
coins = append(coins, n)
|
|
}
|
|
return nil
|
|
})
|
|
} else {
|
|
coins = append(coins, os.Args[1])
|
|
}
|
|
for _, coin := range coins {
|
|
config, err := build.LoadConfig(configsDir, coin)
|
|
if err == nil {
|
|
var tcd *trezorCommonDef
|
|
tcd, err = getTrezorCommonDef(coin)
|
|
if err == nil {
|
|
if tcd.Name != "" {
|
|
config.Coin.Name = tcd.Name
|
|
}
|
|
if tcd.Shortcut != "" {
|
|
config.Coin.Shortcut = tcd.Shortcut
|
|
}
|
|
if tcd.Label != "" {
|
|
config.Coin.Label = tcd.Label
|
|
}
|
|
if tcd.XPubMagic != 0 {
|
|
config.Blockbook.BlockChain.XPubMagic = tcd.XPubMagic
|
|
}
|
|
if tcd.XPubMagicSegwitP2sh != 0 {
|
|
config.Blockbook.BlockChain.XPubMagicSegwitP2sh = tcd.XPubMagicSegwitP2sh
|
|
}
|
|
if tcd.XPubMagicSegwitNative != 0 {
|
|
config.Blockbook.BlockChain.XPubMagicSegwitNative = tcd.XPubMagicSegwitNative
|
|
}
|
|
if tcd.Slip44 != 0 {
|
|
config.Blockbook.BlockChain.Slip44 = tcd.Slip44
|
|
}
|
|
err = writeConfig(coin, config)
|
|
if err == nil {
|
|
fmt.Printf("%v updated\n", coin)
|
|
}
|
|
}
|
|
}
|
|
if err != nil {
|
|
fmt.Printf("%v update error %v\n", coin, err)
|
|
}
|
|
}
|
|
}
|