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  }