2018-02-23 01:49:30 -08:00
package client
2018-09-11 17:31:30 -07:00
import (
"fmt"
"strconv"
"github.com/spf13/cobra"
2018-09-25 14:36:42 -07:00
"github.com/spf13/viper"
2018-09-11 17:31:30 -07:00
)
2018-02-23 01:49:30 -08:00
2018-02-28 15:26:39 -08:00
// nolint
2018-02-23 01:49:30 -08:00
const (
2018-08-31 10:04:42 -07:00
// DefaultGasAdjustment is applied to gas estimates to avoid tx
// execution failures due to state changes that might
// occur between the tx simulation and the actual run.
2018-08-31 10:04:11 -07:00
DefaultGasAdjustment = 1.0
2018-08-31 10:04:42 -07:00
DefaultGasLimit = 200000
2018-09-11 17:31:30 -07:00
GasFlagSimulate = "simulate"
2018-08-22 04:38:55 -07:00
2018-06-28 17:54:47 -07:00
FlagUseLedger = "ledger"
2018-06-11 19:30:54 -07:00
FlagChainID = "chain-id"
FlagNode = "node"
FlagHeight = "height"
FlagGas = "gas"
2018-08-22 04:38:55 -07:00
FlagGasAdjustment = "gas-adjustment"
2018-06-11 19:30:54 -07:00
FlagTrustNode = "trust-node"
2018-07-05 17:07:03 -07:00
FlagFrom = "from"
2018-06-11 19:30:54 -07:00
FlagName = "name"
FlagAccountNumber = "account-number"
FlagSequence = "sequence"
2018-06-20 12:27:36 -07:00
FlagMemo = "memo"
2018-06-11 19:30:54 -07:00
FlagFee = "fee"
2018-07-05 19:15:35 -07:00
FlagAsync = "async"
2018-07-05 20:42:41 -07:00
FlagJson = "json"
2018-07-05 22:19:50 -07:00
FlagPrintResponse = "print-response"
2018-08-31 10:04:11 -07:00
FlagDryRun = "dry-run"
2018-09-02 11:20:14 -07:00
FlagGenerateOnly = "generate-only"
2018-02-23 01:49:30 -08:00
)
2018-02-23 02:25:25 -08:00
// LineBreak can be included in a command list to provide a blank line
// to help with readability
2018-09-11 17:31:30 -07:00
var (
LineBreak = & cobra . Command { Run : func ( * cobra . Command , [ ] string ) { } }
GasFlagVar = GasSetting { Gas : DefaultGasLimit }
)
2018-02-23 02:25:25 -08:00
2018-02-23 01:49:30 -08:00
// GetCommands adds common flags to query commands
func GetCommands ( cmds ... * cobra . Command ) [ ] * cobra . Command {
for _ , c := range cmds {
2018-09-14 11:41:21 -07:00
c . Flags ( ) . Bool ( FlagTrustNode , false , "Trust connected full node (don't verify proofs for responses)" )
2018-06-28 17:54:47 -07:00
c . Flags ( ) . Bool ( FlagUseLedger , false , "Use a connected Ledger device" )
2018-02-23 01:49:30 -08:00
c . Flags ( ) . String ( FlagChainID , "" , "Chain ID of tendermint node" )
2018-06-13 15:13:51 -07:00
c . Flags ( ) . String ( FlagNode , "tcp://localhost:26657" , "<host>:<port> to tendermint rpc interface for this chain" )
2018-02-23 01:49:30 -08:00
c . Flags ( ) . Int64 ( FlagHeight , 0 , "block height to query, omit to get most recent provable block" )
2018-09-25 14:36:42 -07:00
viper . BindPFlag ( FlagTrustNode , c . Flags ( ) . Lookup ( FlagTrustNode ) )
viper . BindPFlag ( FlagUseLedger , c . Flags ( ) . Lookup ( FlagUseLedger ) )
viper . BindPFlag ( FlagChainID , c . Flags ( ) . Lookup ( FlagChainID ) )
viper . BindPFlag ( FlagNode , c . Flags ( ) . Lookup ( FlagNode ) )
2018-02-23 01:49:30 -08:00
}
return cmds
}
// PostCommands adds common flags for commands to post tx
func PostCommands ( cmds ... * cobra . Command ) [ ] * cobra . Command {
for _ , c := range cmds {
2018-09-25 13:48:38 -07:00
c . Flags ( ) . String ( FlagFrom , "" , "Name or address of private key with which to sign" )
2018-06-11 19:30:54 -07:00
c . Flags ( ) . Int64 ( FlagAccountNumber , 0 , "AccountNumber number to sign the tx" )
2018-03-03 11:07:50 -08:00
c . Flags ( ) . Int64 ( FlagSequence , 0 , "Sequence number to sign the tx" )
2018-06-20 12:27:36 -07:00
c . Flags ( ) . String ( FlagMemo , "" , "Memo to send along with transaction" )
2018-03-03 11:07:50 -08:00
c . Flags ( ) . String ( FlagFee , "" , "Fee to pay along with transaction" )
2018-02-23 01:49:30 -08:00
c . Flags ( ) . String ( FlagChainID , "" , "Chain ID of tendermint node" )
2018-06-13 15:13:51 -07:00
c . Flags ( ) . String ( FlagNode , "tcp://localhost:26657" , "<host>:<port> to tendermint rpc interface for this chain" )
2018-06-28 17:54:47 -07:00
c . Flags ( ) . Bool ( FlagUseLedger , false , "Use a connected Ledger device" )
2018-08-31 10:04:11 -07:00
c . Flags ( ) . Float64 ( FlagGasAdjustment , DefaultGasAdjustment , "adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored " )
2018-07-05 19:15:35 -07:00
c . Flags ( ) . Bool ( FlagAsync , false , "broadcast transactions asynchronously" )
2018-07-05 20:42:41 -07:00
c . Flags ( ) . Bool ( FlagJson , false , "return output in json format" )
2018-08-10 23:42:57 -07:00
c . Flags ( ) . Bool ( FlagPrintResponse , true , "return tx response (only works with async = false)" )
2018-09-14 11:41:21 -07:00
c . Flags ( ) . Bool ( FlagTrustNode , true , "Trust connected full node (don't verify proofs for responses)" )
2018-08-31 10:04:11 -07:00
c . Flags ( ) . Bool ( FlagDryRun , false , "ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it" )
2018-09-02 11:20:14 -07:00
c . Flags ( ) . Bool ( FlagGenerateOnly , false , "build an unsigned transaction and write it to STDOUT" )
2018-09-11 17:31:30 -07:00
// --gas can accept integers and "simulate"
c . Flags ( ) . Var ( & GasFlagVar , "gas" , fmt . Sprintf (
"gas limit to set per-transaction; set to %q to calculate required gas automatically (default %d)" , GasFlagSimulate , DefaultGasLimit ) )
2018-09-25 14:36:42 -07:00
viper . BindPFlag ( FlagTrustNode , c . Flags ( ) . Lookup ( FlagTrustNode ) )
viper . BindPFlag ( FlagUseLedger , c . Flags ( ) . Lookup ( FlagUseLedger ) )
viper . BindPFlag ( FlagChainID , c . Flags ( ) . Lookup ( FlagChainID ) )
viper . BindPFlag ( FlagNode , c . Flags ( ) . Lookup ( FlagNode ) )
2018-02-23 01:49:30 -08:00
}
return cmds
}
2018-09-11 17:31:30 -07:00
// Gas flag parsing functions
// GasSetting encapsulates the possible values passed through the --gas flag.
type GasSetting struct {
Simulate bool
Gas int64
}
// Type returns the flag's value type.
func ( v * GasSetting ) Type ( ) string { return "string" }
// Set parses and sets the value of the --gas flag.
func ( v * GasSetting ) Set ( s string ) ( err error ) {
v . Simulate , v . Gas , err = ReadGasFlag ( s )
return
}
func ( v * GasSetting ) String ( ) string {
if v . Simulate {
return GasFlagSimulate
}
return strconv . FormatInt ( v . Gas , 10 )
}
// ParseGasFlag parses the value of the --gas flag.
func ReadGasFlag ( s string ) ( simulate bool , gas int64 , err error ) {
switch s {
case "" :
gas = DefaultGasLimit
case GasFlagSimulate :
simulate = true
default :
gas , err = strconv . ParseInt ( s , 10 , 64 )
if err != nil {
err = fmt . Errorf ( "gas must be either integer or %q" , GasFlagSimulate )
return
}
}
return
}