* Change --gas=0 semantic in order to enable gas auto estimate. * REST clients have been modified to simulate the execution of the tx first to then populate the context with the estimated gas amount returned by the simulation. * The simulation returns both an unadjusted gas estimate and an adjusted one. The adjustment is required to ensure that the ensuing execution doesn't fail due to state changes that might have occurred. Gas adjustment can be controlled via the CLI's --gas-adjustment flag. * Tiny refactorig of REST endpoints error handling. Closes: #1246
120 lines
3.3 KiB
Go
120 lines
3.3 KiB
Go
package context
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client"
|
|
"github.com/cosmos/cosmos-sdk/wire"
|
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
rpcclient "github.com/tendermint/tendermint/rpc/client"
|
|
)
|
|
|
|
const ctxAccStoreName = "acc"
|
|
|
|
// CLIContext implements a typical CLI context created in SDK modules for
|
|
// transaction handling and queries.
|
|
type CLIContext struct {
|
|
Codec *wire.Codec
|
|
AccDecoder auth.AccountDecoder
|
|
Client rpcclient.Client
|
|
Logger io.Writer
|
|
Height int64
|
|
Gas int64
|
|
GasAdjustment float64
|
|
NodeURI string
|
|
FromAddressName string
|
|
AccountStore string
|
|
TrustNode bool
|
|
UseLedger bool
|
|
Async bool
|
|
JSON bool
|
|
PrintResponse bool
|
|
}
|
|
|
|
// NewCLIContext returns a new initialized CLIContext with parameters from the
|
|
// command line using Viper.
|
|
func NewCLIContext() CLIContext {
|
|
var rpc rpcclient.Client
|
|
|
|
nodeURI := viper.GetString(client.FlagNode)
|
|
if nodeURI != "" {
|
|
rpc = rpcclient.NewHTTP(nodeURI, "/websocket")
|
|
}
|
|
|
|
return CLIContext{
|
|
Client: rpc,
|
|
NodeURI: nodeURI,
|
|
AccountStore: ctxAccStoreName,
|
|
FromAddressName: viper.GetString(client.FlagFrom),
|
|
Height: viper.GetInt64(client.FlagHeight),
|
|
Gas: viper.GetInt64(client.FlagGas),
|
|
GasAdjustment: viper.GetFloat64(client.FlagGasAdjustment),
|
|
TrustNode: viper.GetBool(client.FlagTrustNode),
|
|
UseLedger: viper.GetBool(client.FlagUseLedger),
|
|
Async: viper.GetBool(client.FlagAsync),
|
|
JSON: viper.GetBool(client.FlagJson),
|
|
PrintResponse: viper.GetBool(client.FlagPrintResponse),
|
|
}
|
|
}
|
|
|
|
// WithCodec returns a copy of the context with an updated codec.
|
|
func (ctx CLIContext) WithCodec(cdc *wire.Codec) CLIContext {
|
|
ctx.Codec = cdc
|
|
return ctx
|
|
}
|
|
|
|
// WithAccountDecoder returns a copy of the context with an updated account
|
|
// decoder.
|
|
func (ctx CLIContext) WithAccountDecoder(decoder auth.AccountDecoder) CLIContext {
|
|
ctx.AccDecoder = decoder
|
|
return ctx
|
|
}
|
|
|
|
// WithLogger returns a copy of the context with an updated logger.
|
|
func (ctx CLIContext) WithLogger(w io.Writer) CLIContext {
|
|
ctx.Logger = w
|
|
return ctx
|
|
}
|
|
|
|
// WithAccountStore returns a copy of the context with an updated AccountStore.
|
|
func (ctx CLIContext) WithAccountStore(accountStore string) CLIContext {
|
|
ctx.AccountStore = accountStore
|
|
return ctx
|
|
}
|
|
|
|
// WithFromAddressName returns a copy of the context with an updated from
|
|
// address.
|
|
func (ctx CLIContext) WithFromAddressName(addrName string) CLIContext {
|
|
ctx.FromAddressName = addrName
|
|
return ctx
|
|
}
|
|
|
|
// WithTrustNode returns a copy of the context with an updated TrustNode flag.
|
|
func (ctx CLIContext) WithTrustNode(trustNode bool) CLIContext {
|
|
ctx.TrustNode = trustNode
|
|
return ctx
|
|
}
|
|
|
|
// WithNodeURI returns a copy of the context with an updated node URI.
|
|
func (ctx CLIContext) WithNodeURI(nodeURI string) CLIContext {
|
|
ctx.NodeURI = nodeURI
|
|
ctx.Client = rpcclient.NewHTTP(nodeURI, "/websocket")
|
|
return ctx
|
|
}
|
|
|
|
// WithClient returns a copy of the context with an updated RPC client
|
|
// instance.
|
|
func (ctx CLIContext) WithClient(client rpcclient.Client) CLIContext {
|
|
ctx.Client = client
|
|
return ctx
|
|
}
|
|
|
|
// WithUseLedger returns a copy of the context with an updated UseLedger flag.
|
|
func (ctx CLIContext) WithUseLedger(useLedger bool) CLIContext {
|
|
ctx.UseLedger = useLedger
|
|
return ctx
|
|
}
|