--- /dev/null
+package main
+
+import (
+ "crypto/hmac"
+ "crypto/sha256"
+ "fmt"
+ "os"
+ "strings"
+
+ "github.com/spf13/cobra"
+ cmn "github.com/tendermint/tmlibs/common"
+
+ "github.com/vapor/common"
+ "github.com/vapor/consensus"
+ "github.com/vapor/crypto"
+ "github.com/vapor/crypto/ed25519/chainkd"
+ chainjson "github.com/vapor/encoding/json"
+ "github.com/vapor/equity/pegin_contract"
+ "github.com/vapor/util"
+)
+
+var (
+ fedpegXPubs string
+ fedpegXPrv string
+ claimScriptStr string
+ mode = uint16(0)
+)
+
+var runCmd = &cobra.Command{
+ Use: "run",
+ Short: "pegin contract tool",
+ Run: run,
+}
+
+func init() {
+ //runCmd.PersistentFlags().Uint64Var(&startHeight, "start_height", 0, "Start monitoring block height for transactions")
+ runCmd.PersistentFlags().StringVar(&fedpegXPubs, "fedpeg_xpubs", "", "Change federated peg to use a different xpub.Use Comma Delimiters.")
+ runCmd.PersistentFlags().StringVar(&fedpegXPrv, "xprv", "", "Generates one of the private keys corresponding to the payment contract address.")
+ runCmd.PersistentFlags().Uint16Var(&mode, "mode", 0, "0: generates the contract address for the payment 1: generate the private key corresponding to the payment contract address.")
+ runCmd.PersistentFlags().StringVar(&claimScriptStr, "claim_script", "", "Redemption of the script.")
+ fmt.Println("mode", mode)
+}
+
+func run(cmd *cobra.Command, args []string) {
+ if mode == 0 {
+ if fedpegXPubs == "" {
+ cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? fedpeg_xpubs is empty."))
+ }
+ var federationRedeemXPubs []chainkd.XPub
+ fedpegXPubs := strings.Split(fedpegXPubs, ",")
+ for _, xpubStr := range fedpegXPubs {
+ var xpub chainkd.XPub
+ xpub.UnmarshalText([]byte(xpubStr))
+ federationRedeemXPubs = append(federationRedeemXPubs, xpub)
+ }
+ consensus.ActiveNetParams.FedpegXPubs = federationRedeemXPubs
+ if claimScriptStr == "" {
+ cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? claim_script is empty."))
+ }
+ var claimScript chainjson.HexBytes
+ claimScript.UnmarshalText([]byte(claimScriptStr))
+ peginContractPrograms, err := pegin_contract.GetPeginContractPrograms(claimScript)
+ if err != nil {
+ cmn.Exit(cmn.Fmt("GetPeginContractPrograms returns an error, %v", err))
+ }
+ scriptHash := crypto.Sha256(peginContractPrograms)
+ address, err := common.NewPeginAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
+ if err != nil {
+ cmn.Exit(cmn.Fmt("NewPeginAddressWitnessScriptHash returns an error, %v", err))
+ }
+ fmt.Println("contract address:", address.EncodeAddress())
+ fmt.Println("claim_script:", claimScriptStr)
+
+ } else if mode == 1 {
+ if fedpegXPrv == "" {
+ cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? xprv is empty."))
+ }
+ if claimScriptStr == "" {
+ cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO? claim_script is empty."))
+ }
+ var claimScript chainjson.HexBytes
+ claimScript.UnmarshalText([]byte(claimScriptStr))
+
+ var xprv chainkd.XPrv
+ xprv.UnmarshalText([]byte(fedpegXPrv))
+ xpub := xprv.XPub()
+ // pub + scriptPubKey 生成一个随机数A
+ var tmp [32]byte
+ h := hmac.New(sha256.New, xpub[:])
+ h.Write(claimScript)
+ tweak := h.Sum(tmp[:])
+ // pub + A 生成一个新的公钥pub_new
+ privateKey := xprv.Child(tweak, false)
+ fmt.Println("New secret key: ", privateKey.String())
+ fmt.Println("claim_script:", claimScriptStr)
+ } else {
+ cmn.Exit(cmn.Fmt("OH GOD WHAT DID YOU DO?"))
+ }
+}
+
+func main() {
+ if _, err := runCmd.ExecuteC(); err != nil {
+ os.Exit(util.ErrLocalExe)
+ }
+}