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 }