decred.org/dcrdex@v1.0.5/server/cmd/geogame/geogame.go (about) 1 package main 2 3 import ( 4 "encoding/hex" 5 "flag" 6 "fmt" 7 "os" 8 9 "github.com/decred/dcrd/chaincfg/v3" 10 "github.com/decred/dcrd/dcrutil/v4" 11 "github.com/decred/dcrd/hdkeychain/v3" 12 "github.com/decred/dcrd/txscript/v4/stdaddr" 13 ) 14 15 // geogame is a utility for generating an address from a prepaid bond for use 16 // in geocache-like DCR giveaway game. 17 18 func main() { 19 if err := mainErr(); err != nil { 20 fmt.Fprint(os.Stderr, err, "\n") 21 os.Exit(1) 22 } 23 os.Exit(0) 24 } 25 26 func mainErr() error { 27 var testnet bool 28 flag.BoolVar(&testnet, "testnet", false, "use testnet") 29 flag.Parse() 30 31 chainParams := chaincfg.MainNetParams() 32 if testnet { 33 chainParams = chaincfg.TestNet3Params() 34 } 35 36 args := flag.Args() 37 38 if len(args) != 1 { 39 return fmt.Errorf("specify a prepaid bond") 40 } 41 codeHex := args[0] 42 if len(codeHex) != 32 { 43 return fmt.Errorf("prepaid bond %q has wrong length %d", codeHex, len(codeHex)) 44 } 45 code, err := hex.DecodeString(codeHex) 46 if err != nil { 47 return fmt.Errorf("error decoding prepaid bond: %w", err) 48 } 49 50 k, err := hdkeychain.NewMaster(code, chainParams) 51 if err != nil { 52 return fmt.Errorf("error generating key from bond: %w", err) 53 } 54 55 pkh := dcrutil.Hash160(k.SerializedPubKey()) 56 addr, err := stdaddr.NewAddressPubKeyHashEcdsaSecp256k1V0(pkh, chainParams) 57 if err != nil { 58 return fmt.Errorf("error generating address: %w", err) 59 } 60 61 fmt.Println(addr) 62 63 return nil 64 }