* Add docs * Add BasicFeeAllowance implementation * Add expiration structs and complete basic fee * Add delegation messages, add validation logic * Add keeper and helper structs * Add alias and handler to top level * Add delegation module * Add basic querier * Add types tests * Add types tests * More internal test coverage * Solid internal test coverage * Expose Querier to top level module * Add FeeAccount to auth/types, like StdTx, SignDoc * Fix all tests in x/auth * All tests pass * Appease the Golang Linter * Add fee-account command line flag * Start on DelegatedDeductFeeDecorator * Cleanup the Decorator * Wire up delegation module in simapp * add basic test for decorator (no delegation) * Table tests for deduct fees * Table tests over all conditions of delegated fee decorator * Build full ante handler stack and test it * Start genesis * Implement Genesis * Rename package delegation to subkeys * Clarify antes test cases, handle empty account w/o fees * Allow paying delegated fees with no account * Pull mempool into delegated ante, for control on StdFee * Use custom DelegatedTx, DelegatedFee for subkeys * Revert all changes to x/auth.StdTx * Appease scopelint * Register DelegatedTx with codec * Address PR comments * Remove unnecessary DelegatedMempoolFeeDecorator * Cleaned up errors in querier * Clean up message sign bytes * Minor PR comments * Replace GetAllFees... with Iterator variants * PrepareForExport adjusts grant expiration height * Panic on de/serialization error in keeper * Move custom ante handler chain to tests, update docs * More cleanup * More doc cleanup * Renamed subkeys module to fee_grant * Rename subkeys/delegation to fee grant in all strings * Modify Msg and Keeper methods to use Grant not Delegate * Add PeriodicFeeAllowance * Update aliases * Cover all accept cases for PeriodicFeeAllowance * Et tu scopelint? * Update docs as requested * Remove error return from GetFeeGrant * Code cleanup as requested by PR * Updated all errors to use new sdk/errors package * Use test suite for keeper tests * Clean up alias.go file * Define expected interfaces in exported, rather than importing from account * Remove dependency on auth/ante * Improve godoc, Logger * Cleaned up ExpiresAt * Improve error reporting with UseGrantedFee * Enforce period limit subset of basic limit * Add events * Rename fee_grant to feegrant * Ensure KeeperTestSuite actually runs * Move types/tx to types * Update alias file, include ante * I do need nolint in alias.go * Properly emit events in the handler. Use cosmos-sdk in amino types * Update godoc * Linting... * Update errors * Update pkg doc and fix ante-handler order * Merge PR #5782: Migrate x/feegrant to proto * fix errors * proto changes * proto changes * fix errors * fix errors * genesis state changed to proto * fix keeper tests * fix test * fixed tests * fix tests * updated expected keepers * updated ante tests * lint * deleted alias.go * tx updated to proto tx * remove explicit signmode * tests * Added `cli/query.go` * Added tx.go in cli * updated `module.go` * resolve errors in tx.go * Add fee payer gentx func * updated tx * fixed error * WIP: cli tests * fix query error * fix tests * Unused types and funcs * fix tests * rename helper func to create tx * remove unused * update tx cfg * fix cli tests * added simulations * Add `decoder.go` * fix build fail * added init genesis code * update tx.go * fixed LGTM alert * modified cli * remove gogoproto extensions * change acc address type to string * lint * fix simulations * Add gen simulations * remove legacy querier * remove legacy code * add grpc queries tests * fix simulations * update module.go * lint * register feegrant NewSimulationManager * fix sims * fix sims * add genesis test * add periodic grant * updated cmd * changed times * updated flags * removed days as period clock * added condition for period and exp * add periodic fee cli tests * udpated tests * fix lint * fix tests * fix sims * renaming to `fee_grant` * review changes * fix test * add condition for duplicate grants * fix tests * add `genTxWithFeeGranter` in tests * fix simulation * one of changes & test fixes * fix test * fix lint * changed package name `feegrant` to `fee_grant` * review comments * review changes * review change * review changes * added fee-account in flags * address review changes * read fee granter from cli * updated create account with mnemonic * Address review comments * move `simapp/ante` file to `feegrant/ante` * update keeper logic to create account * update docs * fix tests * update `serviceMsgClientConn` from `msgservice` * review changes * add test case for using more fees than allowed * eliminate panic checks from keeper * fix lint * change store keys string to bytes * fix tests * review changes * review changes * udpate docs * make spend limit optional * fix tests * fix tests * review changes * add norace tag * proto-docs * add docs Co-authored-by: Ethan Frey <ethanfrey@users.noreply.github.com> Co-authored-by: Alexander Bezobchuk <alexanderbez@users.noreply.github.com> Co-authored-by: Aleksandr Bezobchuk <aleks.bezobchuk@gmail.com> Co-authored-by: SaReN <sahithnarahari@gmail.com> Co-authored-by: aleem1413 <aleem@vitwit.com> Co-authored-by: MD Aleem <72057206+aleem1314@users.noreply.github.com> Co-authored-by: Anil Kumar Kammari <anil@vitwit.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
171 lines
7.2 KiB
Go
171 lines
7.2 KiB
Go
package flags
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/spf13/cobra"
|
|
tmcli "github.com/tendermint/tendermint/libs/cli"
|
|
|
|
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
|
)
|
|
|
|
const (
|
|
// 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.
|
|
DefaultGasAdjustment = 1.0
|
|
DefaultGasLimit = 200000
|
|
GasFlagAuto = "auto"
|
|
|
|
// DefaultKeyringBackend
|
|
DefaultKeyringBackend = keyring.BackendOS
|
|
|
|
// BroadcastBlock defines a tx broadcasting mode where the client waits for
|
|
// the tx to be committed in a block.
|
|
BroadcastBlock = "block"
|
|
// BroadcastSync defines a tx broadcasting mode where the client waits for
|
|
// a CheckTx execution response only.
|
|
BroadcastSync = "sync"
|
|
// BroadcastAsync defines a tx broadcasting mode where the client returns
|
|
// immediately.
|
|
BroadcastAsync = "async"
|
|
|
|
// SignModeDirect is the value of the --sign-mode flag for SIGN_MODE_DIRECT
|
|
SignModeDirect = "direct"
|
|
// SignModeLegacyAminoJSON is the value of the --sign-mode flag for SIGN_MODE_LEGACY_AMINO_JSON
|
|
SignModeLegacyAminoJSON = "amino-json"
|
|
)
|
|
|
|
// List of CLI flags
|
|
const (
|
|
FlagHome = tmcli.HomeFlag
|
|
FlagKeyringDir = "keyring-dir"
|
|
FlagUseLedger = "ledger"
|
|
FlagChainID = "chain-id"
|
|
FlagNode = "node"
|
|
FlagHeight = "height"
|
|
FlagGasAdjustment = "gas-adjustment"
|
|
FlagFrom = "from"
|
|
FlagName = "name"
|
|
FlagAccountNumber = "account-number"
|
|
FlagSequence = "sequence"
|
|
FlagMemo = "memo"
|
|
FlagFees = "fees"
|
|
FlagGas = "gas"
|
|
FlagGasPrices = "gas-prices"
|
|
FlagBroadcastMode = "broadcast-mode"
|
|
FlagDryRun = "dry-run"
|
|
FlagGenerateOnly = "generate-only"
|
|
FlagOffline = "offline"
|
|
FlagOutputDocument = "output-document" // inspired by wget -O
|
|
FlagSkipConfirmation = "yes"
|
|
FlagProve = "prove"
|
|
FlagKeyringBackend = "keyring-backend"
|
|
FlagPage = "page"
|
|
FlagLimit = "limit"
|
|
FlagSignMode = "sign-mode"
|
|
FlagPageKey = "page-key"
|
|
FlagOffset = "offset"
|
|
FlagCountTotal = "count-total"
|
|
FlagTimeoutHeight = "timeout-height"
|
|
FlagKeyAlgorithm = "algo"
|
|
FlagFeeAccount = "fee-account"
|
|
|
|
// Tendermint logging flags
|
|
FlagLogLevel = "log_level"
|
|
FlagLogFormat = "log_format"
|
|
)
|
|
|
|
// LineBreak can be included in a command list to provide a blank line
|
|
// to help with readability
|
|
var LineBreak = &cobra.Command{Run: func(*cobra.Command, []string) {}}
|
|
|
|
// AddQueryFlagsToCmd adds common flags to a module query command.
|
|
func AddQueryFlagsToCmd(cmd *cobra.Command) {
|
|
cmd.Flags().String(FlagNode, "tcp://localhost:26657", "<host>:<port> to Tendermint RPC interface for this chain")
|
|
cmd.Flags().Int64(FlagHeight, 0, "Use a specific height to query state at (this can error if the node is pruning state)")
|
|
cmd.Flags().StringP(tmcli.OutputFlag, "o", "text", "Output format (text|json)")
|
|
|
|
cmd.MarkFlagRequired(FlagChainID)
|
|
|
|
cmd.SetErr(cmd.ErrOrStderr())
|
|
cmd.SetOut(cmd.OutOrStdout())
|
|
}
|
|
|
|
// AddTxFlagsToCmd adds common flags to a module tx command.
|
|
func AddTxFlagsToCmd(cmd *cobra.Command) {
|
|
cmd.Flags().String(FlagKeyringDir, "", "The client Keyring directory; if omitted, the default 'home' directory will be used")
|
|
cmd.Flags().String(FlagFrom, "", "Name or address of private key with which to sign")
|
|
cmd.Flags().Uint64P(FlagAccountNumber, "a", 0, "The account number of the signing account (offline mode only)")
|
|
cmd.Flags().Uint64P(FlagSequence, "s", 0, "The sequence number of the signing account (offline mode only)")
|
|
cmd.Flags().String(FlagMemo, "", "Memo to send along with transaction")
|
|
cmd.Flags().String(FlagFees, "", "Fees to pay along with transaction; eg: 10uatom")
|
|
cmd.Flags().String(FlagGasPrices, "", "Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom)")
|
|
cmd.Flags().String(FlagNode, "tcp://localhost:26657", "<host>:<port> to tendermint rpc interface for this chain")
|
|
cmd.Flags().Bool(FlagUseLedger, false, "Use a connected Ledger device")
|
|
cmd.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 ")
|
|
cmd.Flags().StringP(FlagBroadcastMode, "b", BroadcastSync, "Transaction broadcasting mode (sync|async|block)")
|
|
cmd.Flags().Bool(FlagDryRun, false, "ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it")
|
|
cmd.Flags().Bool(FlagGenerateOnly, false, "Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase is not accessible)")
|
|
cmd.Flags().Bool(FlagOffline, false, "Offline mode (does not allow any online functionality")
|
|
cmd.Flags().BoolP(FlagSkipConfirmation, "y", false, "Skip tx broadcasting prompt confirmation")
|
|
cmd.Flags().String(FlagKeyringBackend, DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)")
|
|
cmd.Flags().String(FlagSignMode, "", "Choose sign mode (direct|amino-json), this is an advanced feature")
|
|
cmd.Flags().Uint64(FlagTimeoutHeight, 0, "Set a block timeout height to prevent the tx from being committed past a certain height")
|
|
cmd.Flags().String(FlagFeeAccount, "", "Fee account pays fees for the transaction instead of deducting from the signer")
|
|
|
|
// --gas can accept integers and "auto"
|
|
cmd.Flags().String(FlagGas, "", fmt.Sprintf("gas limit to set per-transaction; set to %q to calculate sufficient gas automatically (default %d)", GasFlagAuto, DefaultGasLimit))
|
|
|
|
cmd.MarkFlagRequired(FlagChainID)
|
|
|
|
cmd.SetErr(cmd.ErrOrStderr())
|
|
cmd.SetOut(cmd.OutOrStdout())
|
|
}
|
|
|
|
// AddPaginationFlagsToCmd adds common pagination flags to cmd
|
|
func AddPaginationFlagsToCmd(cmd *cobra.Command, query string) {
|
|
cmd.Flags().Uint64(FlagPage, 1, fmt.Sprintf("pagination page of %s to query for. This sets offset to a multiple of limit", query))
|
|
cmd.Flags().String(FlagPageKey, "", fmt.Sprintf("pagination page-key of %s to query for", query))
|
|
cmd.Flags().Uint64(FlagOffset, 0, fmt.Sprintf("pagination offset of %s to query for", query))
|
|
cmd.Flags().Uint64(FlagLimit, 100, fmt.Sprintf("pagination limit of %s to query for", query))
|
|
cmd.Flags().Bool(FlagCountTotal, false, fmt.Sprintf("count total number of records in %s to query for", query))
|
|
}
|
|
|
|
// GasSetting encapsulates the possible values passed through the --gas flag.
|
|
type GasSetting struct {
|
|
Simulate bool
|
|
Gas uint64
|
|
}
|
|
|
|
func (v *GasSetting) String() string {
|
|
if v.Simulate {
|
|
return GasFlagAuto
|
|
}
|
|
|
|
return strconv.FormatUint(v.Gas, 10)
|
|
}
|
|
|
|
// ParseGasSetting parses a string gas value. The value may either be 'auto',
|
|
// which indicates a transaction should be executed in simulate mode to
|
|
// automatically find a sufficient gas value, or a string integer. It returns an
|
|
// error if a string integer is provided which cannot be parsed.
|
|
func ParseGasSetting(gasStr string) (GasSetting, error) {
|
|
switch gasStr {
|
|
case "":
|
|
return GasSetting{false, DefaultGasLimit}, nil
|
|
|
|
case GasFlagAuto:
|
|
return GasSetting{true, 0}, nil
|
|
|
|
default:
|
|
gas, err := strconv.ParseUint(gasStr, 10, 64)
|
|
if err != nil {
|
|
return GasSetting{}, fmt.Errorf("gas must be either integer or %s", GasFlagAuto)
|
|
}
|
|
|
|
return GasSetting{false, gas}, nil
|
|
}
|
|
}
|