github.com/loomnetwork/gamechain@v0.0.0-20200406110549-36c47eb97a92/cli/cmd/update_oracle.go (about)

     1  package cmd
     2  
     3  import (
     4  	"encoding/base64"
     5  	"encoding/json"
     6  	"fmt"
     7  	"github.com/loomnetwork/gamechain/types/zb/zb_calls"
     8  	"strings"
     9  
    10  	loom "github.com/loomnetwork/go-loom"
    11  	"github.com/loomnetwork/go-loom/auth"
    12  	"github.com/pkg/errors"
    13  	"github.com/spf13/cobra"
    14  )
    15  
    16  var updateOracleCmdArgs struct {
    17  	newOracleAddressString    string
    18  	newOraclePrivateKeyBase64 string
    19  	chainID                   string
    20  }
    21  
    22  var updateOracleCmd = &cobra.Command{
    23  	Use:   "update_oracle",
    24  	Short: "change the oracle or set initial oracle",
    25  	RunE: func(cmd *cobra.Command, args []string) error {
    26  		if updateOracleCmdArgs.newOracleAddressString == "" && updateOracleCmdArgs.newOraclePrivateKeyBase64 == "" {
    27  			return fmt.Errorf("newOracleAddress or ")
    28  		}
    29  		signer := auth.NewEd25519Signer(commonTxObjs.privateKey)
    30  
    31  		var newOracle *loom.Address
    32  		if updateOracleCmdArgs.newOraclePrivateKeyBase64 == "" {
    33  			newOracleTmp, err := loom.ParseAddress(updateOracleCmdArgs.newOracleAddressString)
    34  			if err != nil {
    35  				return errors.Wrapf(err, "failed to parse new oracle address %s", updateOracleCmdArgs.newOracleAddressString)
    36  			}
    37  
    38  			newOracle = &newOracleTmp
    39  		} else {
    40  			newOraclePrivateKey, err := readKeyFile(rootCmdArgs.privateKeyFilePath)
    41  			if err != nil {
    42  				return errors.Wrapf(err, "error while reading new oracle private key file")
    43  			}
    44  
    45  			decodeBuffer := make([]byte, len(updateOracleCmdArgs.newOraclePrivateKeyBase64))
    46  			bytesDecoded, err := base64.StdEncoding.Decode(decodeBuffer, []byte(updateOracleCmdArgs.newOraclePrivateKeyBase64))
    47  			if err != nil {
    48  				return errors.Wrapf(err, "invalid base64 content in new oracle private key: %s", updateOracleCmdArgs.newOraclePrivateKeyBase64)
    49  			}
    50  
    51  			newOraclePrivateKey = decodeBuffer[:bytesDecoded]
    52  			newOracleSigner := auth.NewEd25519Signer(newOraclePrivateKey)
    53  			newOracle = &loom.Address{
    54  				ChainID: updateOracleCmdArgs.chainID,
    55  				Local:   loom.LocalAddressFromPublicKey(newOracleSigner.PublicKey()),
    56  			}
    57  		}
    58  
    59  		fmt.Printf("new oracle address: %s\n", newOracle.String())
    60  
    61  		_, err := commonTxObjs.contract.Call("UpdateOracle", &zb_calls.UpdateOracleRequest{
    62  			NewOracle: newOracle.MarshalPB(),
    63  		}, signer, nil)
    64  		if err != nil {
    65  			return errors.Wrap(err, "error when calling UpdateOracle")
    66  		}
    67  
    68  		switch strings.ToLower(rootCmdArgs.outputFormat) {
    69  		case "json":
    70  			output, err := json.Marshal(map[string]interface{}{"success": true})
    71  			if err != nil {
    72  				return err
    73  			}
    74  			fmt.Println(string(output))
    75  		default:
    76  			fmt.Println("oracle changed")
    77  		}
    78  
    79  		return nil
    80  	},
    81  }
    82  
    83  func init() {
    84  	rootCmd.AddCommand(updateOracleCmd)
    85  
    86  	updateOracleCmd.Flags().StringVarP(&updateOracleCmdArgs.newOracleAddressString, "newOracleAddress", "o", "", "Address of the new oracle")
    87  	updateOracleCmd.Flags().StringVarP(&updateOracleCmdArgs.newOraclePrivateKeyBase64, "newOraclePrivateKey", "p", "", "Private key of the new oracle in base64")
    88  	updateOracleCmd.Flags().StringVarP(&updateOracleCmdArgs.chainID, "chainID", "c", "default", "Chain ID")
    89  }