From 96a7311cfc6ad7b4dad05e947ec1b34ba1181712 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Thu, 11 Nov 2021 18:08:34 +0900 Subject: [PATCH 01/17] fee suggestion for construction/metadata --- server/config/config.go | 20 +++++++++++----- server/rosetta/client_online.go | 19 +++++++++++++++ server/rosetta/config.go | 22 +++++++++++++++++ .../lib/internal/service/construction.go | 19 ++++++++++++++- server/start.go | 24 +++++++++++++------ 5 files changed, 90 insertions(+), 14 deletions(-) diff --git a/server/config/config.go b/server/config/config.go index f5a395dce8e0..0a705f2f3fc0 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -125,6 +125,12 @@ type RosettaConfig struct { // Offline defines if the server must be run in offline mode Offline bool `mapstructure:"offline"` + + // SuggestGas defines gas limit when calculate fee + SuggestGas int `mapstructure:"suggest-gas"` + + // DefaultSuggestDenom defines the defult denom for fee suggestion + DefaultSuggestDenom string `mapstructure:"default-suggest-denom"` } // GRPCConfig defines configuration for the gRPC server. @@ -292,12 +298,14 @@ func GetConfig(v *viper.Viper) Config { EnableUnsafeCORS: v.GetBool("api.enabled-unsafe-cors"), }, Rosetta: RosettaConfig{ - Enable: v.GetBool("rosetta.enable"), - Address: v.GetString("rosetta.address"), - Blockchain: v.GetString("rosetta.blockchain"), - Network: v.GetString("rosetta.network"), - Retries: v.GetInt("rosetta.retries"), - Offline: v.GetBool("rosetta.offline"), + Enable: v.GetBool("rosetta.enable"), + Address: v.GetString("rosetta.address"), + Blockchain: v.GetString("rosetta.blockchain"), + Network: v.GetString("rosetta.network"), + Retries: v.GetInt("rosetta.retries"), + Offline: v.GetBool("rosetta.offline"), + SuggestGas: v.GetInt("rosetta.suggest-gas"), + DefaultSuggestDenom: v.GetString("rosetta.default-suggest-denom"), }, GRPC: GRPCConfig{ Enable: v.GetBool("grpc.enable"), diff --git a/server/rosetta/client_online.go b/server/rosetta/client_online.go index dc46e187e8cc..fdc811c3ec9d 100644 --- a/server/rosetta/client_online.go +++ b/server/rosetta/client_online.go @@ -395,6 +395,25 @@ func (c *Client) ConstructionMetadataFromOptions(ctx context.Context, options ma return nil, err } + if constructionOptions.GasLimit <= 0 { + // set to default + constructionOptions.GasLimit = uint64(c.config.SuggestGas) + } + if constructionOptions.GasPrice == "" { + // set to default + denom := c.config.DefaultSuggestDenom + constructionOptions.GasPrice = c.config.SuggestPrices.AmountOf(denom).String() + denom + } else { + gasPrice, err := sdk.ParseDecCoin(constructionOptions.GasPrice) + if err != nil { + return nil, err + } + // check gasPrice is in the list + if !c.config.SuggestPrices.AmountOf(gasPrice.Denom).IsPositive() { + return nil, crgerrs.ErrBadArgument + } + } + signersData := make([]*SignerData, len(constructionOptions.ExpectedSigners)) for i, signer := range constructionOptions.ExpectedSigners { diff --git a/server/rosetta/config.go b/server/rosetta/config.go index dac86e25de93..748bce7f61b3 100644 --- a/server/rosetta/config.go +++ b/server/rosetta/config.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" ) // configuration defaults constants @@ -30,6 +31,8 @@ const ( DefaultNetwork = "network" // DefaultOffline defines the default offline value DefaultOffline = false + // DefaultSuggestGas defines the default gas limit for fee suggestion + DefaultSuggestGas = 20_000 ) // configuration flags @@ -65,6 +68,12 @@ type Config struct { Retries int // Offline defines if the server must be run in offline mode Offline bool + // SuggestGas defines the gas limit for fee suggestion + SuggestGas int + // DefaultSuggestDenom defines the default denom for fee suggestion + DefaultSuggestDenom string + // SuggestPrices defines the gas prices for fee suggestion + SuggestPrices sdk.DecCoins // Codec overrides the default data and construction api client codecs Codec *codec.ProtoCodec // InterfaceRegistry overrides the default data and construction api interface registry @@ -102,6 +111,19 @@ func (c *Config) validate() error { if c.Offline { return fmt.Errorf("offline mode is not supported for stargate implementation due to how sigv2 works") } + if c.SuggestGas <= 0 { + c.SuggestGas = DefaultSuggestGas + } + found := false + for i := 0; i < c.SuggestPrices.Len(); i++ { + if c.SuggestPrices.GetDenomByIndex(i) == c.DefaultSuggestDenom { + found = true + break + } + } + if !found { + return fmt.Errorf("default suggest denom is not found in minimum-gas-prices") + } // these are optional but it must be online if c.GRPCEndpoint == "" { diff --git a/server/rosetta/lib/internal/service/construction.go b/server/rosetta/lib/internal/service/construction.go index 4be6e9461241..113fdd04b06a 100644 --- a/server/rosetta/lib/internal/service/construction.go +++ b/server/rosetta/lib/internal/service/construction.go @@ -9,6 +9,7 @@ import ( "github.com/coinbase/rosetta-sdk-go/types" "github.com/cosmos/cosmos-sdk/server/rosetta/lib/errors" + sdk "github.com/cosmos/cosmos-sdk/types" ) // ConstructionCombine Combine creates a network-specific transaction from an unsigned transaction @@ -69,8 +70,24 @@ func (on OnlineNetwork) ConstructionMetadata(ctx context.Context, request *types return nil, errors.ToRosetta(err) } + price, err := sdk.ParseDecCoin(metadata["gas_price"].(string)) + if err != nil { + return nil, errors.ToRosetta(err) + } + gas := sdk.NewIntFromUint64(uint64(metadata["gas_limit"].(float64))) + + suggestedFee := types.Amount{ + Value: price.Amount.MulInt64(gas.Int64()).String(), + Currency: &(types.Currency{ + Symbol: price.Denom, + Decimals: 0, + }), + /*metadata*/ + } + return &types.ConstructionMetadataResponse{ - Metadata: metadata, + Metadata: metadata, + SuggestedFee: []*types.Amount{&suggestedFee}, }, nil } diff --git a/server/start.go b/server/start.go index 9bd6c5ef39f9..c4822bd8950b 100644 --- a/server/start.go +++ b/server/start.go @@ -29,6 +29,7 @@ import ( crgserver "github.com/cosmos/cosmos-sdk/server/rosetta/lib/server" "github.com/cosmos/cosmos-sdk/server/types" storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdktypes "github.com/cosmos/cosmos-sdk/types" ) // Tendermint full-node start flags @@ -340,14 +341,23 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App offlineMode = true } + minGasPrices, err := sdktypes.ParseDecCoins(config.MinGasPrices) + if err != nil { + ctx.Logger.Error("failed to parse minimum-gas-prices: ", err) + return err + } + conf := &rosetta.Config{ - Blockchain: config.Rosetta.Blockchain, - Network: config.Rosetta.Network, - TendermintRPC: ctx.Config.RPC.ListenAddress, - GRPCEndpoint: config.GRPC.Address, - Addr: config.Rosetta.Address, - Retries: config.Rosetta.Retries, - Offline: offlineMode, + Blockchain: config.Rosetta.Blockchain, + Network: config.Rosetta.Network, + TendermintRPC: ctx.Config.RPC.ListenAddress, + GRPCEndpoint: config.GRPC.Address, + Addr: config.Rosetta.Address, + Retries: config.Rosetta.Retries, + Offline: offlineMode, + SuggestGas: config.Rosetta.SuggestGas, + DefaultSuggestDenom: config.Rosetta.DefaultSuggestDenom, + SuggestPrices: minGasPrices.Sort(), } conf.WithCodec(clientCtx.InterfaceRegistry, clientCtx.Codec.(*codec.ProtoCodec)) From ea433e74dacb039e01c4d4fe0dc77bbb29c91952 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Thu, 11 Nov 2021 19:00:56 +0900 Subject: [PATCH 02/17] rename module --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2ba3115190d4..941631bfb39c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ go 1.17 -module github.com/cosmos/cosmos-sdk +module github.com/terra-money/cosmos-sdk require ( github.com/99designs/keyring v1.1.6 From 547bc58fc3f49175ab5f107903d63436a15b9413 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Thu, 11 Nov 2021 19:30:37 +0900 Subject: [PATCH 03/17] change default gas_limit for fee suggestion --- server/rosetta/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/rosetta/config.go b/server/rosetta/config.go index 748bce7f61b3..b6025877f579 100644 --- a/server/rosetta/config.go +++ b/server/rosetta/config.go @@ -32,7 +32,7 @@ const ( // DefaultOffline defines the default offline value DefaultOffline = false // DefaultSuggestGas defines the default gas limit for fee suggestion - DefaultSuggestGas = 20_000 + DefaultSuggestGas = 200_000 ) // configuration flags From 378308e09b141bfc1f2621f80ae59b065027b649 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Tue, 23 Nov 2021 11:55:39 +0900 Subject: [PATCH 04/17] add rosetta items in template --- server/config/toml.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/config/toml.go b/server/config/toml.go index 1fe85947049c..4ff673cc56e6 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -165,6 +165,11 @@ retries = {{ .Rosetta.Retries }} # Offline defines if Rosetta server should run in offline mode. offline = {{ .Rosetta.Offline }} +# Suggest gas defines +suggest-gas = {{ .Rosetta.SuggestGas }} + +default-suggest-denom = {{ .Rosetta.DefaultSuggestDenom }} + ############################################################################### ### gRPC Configuration ### ############################################################################### From 5c0aea6165729cb2c7b32db48f089295d494045b Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Tue, 23 Nov 2021 12:03:35 +0900 Subject: [PATCH 05/17] type fix for default-suggest-denom --- server/config/toml.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/config/toml.go b/server/config/toml.go index 4ff673cc56e6..3c0a8dc44f25 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -165,10 +165,11 @@ retries = {{ .Rosetta.Retries }} # Offline defines if Rosetta server should run in offline mode. offline = {{ .Rosetta.Offline }} -# Suggest gas defines +# SuggestGas defines gas limit when calculate fee suggest-gas = {{ .Rosetta.SuggestGas }} -default-suggest-denom = {{ .Rosetta.DefaultSuggestDenom }} +# DefaultSuggestDenom defines the defult denom for fee suggestion +default-suggest-denom = "{{ .Rosetta.DefaultSuggestDenom }}" ############################################################################### ### gRPC Configuration ### From 60c5dbad817e7adcbce976b962ad758d91c72c5c Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Tue, 23 Nov 2021 12:14:02 +0900 Subject: [PATCH 06/17] add default values --- server/config/config.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/server/config/config.go b/server/config/config.go index 0a705f2f3fc0..4850084581dd 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -236,12 +236,14 @@ func DefaultConfig() *Config { Address: DefaultGRPCAddress, }, Rosetta: RosettaConfig{ - Enable: false, - Address: ":8080", - Blockchain: "app", - Network: "network", - Retries: 3, - Offline: false, + Enable: false, + Address: ":8080", + Blockchain: "app", + Network: "network", + Retries: 3, + Offline: false, + SuggestGas: 200000, + DefaultSuggestDenom: "uatom", }, GRPCWeb: GRPCWebConfig{ Enable: true, From 2377100b08b9d540cffcc4ac3e1669321968fa37 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Tue, 23 Nov 2021 14:35:41 +0900 Subject: [PATCH 07/17] add suggestion-related config --- server/rosetta/config.go | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/server/rosetta/config.go b/server/rosetta/config.go index b6025877f579..84bd894e0239 100644 --- a/server/rosetta/config.go +++ b/server/rosetta/config.go @@ -33,6 +33,8 @@ const ( DefaultOffline = false // DefaultSuggestGas defines the default gas limit for fee suggestion DefaultSuggestGas = 200_000 + // DefaultSuggestDenom defines the default denom for fee suggestion + DefaultSuggestDenom = "uatom" ) // configuration flags @@ -44,6 +46,8 @@ const ( FlagAddr = "addr" FlagRetries = "retries" FlagOffline = "offline" + FlagSuggestGas = "suggest-gas" + FlagSuggestDenom = "suggest-denom" ) // Config defines the configuration of the rosetta server @@ -175,14 +179,24 @@ func FromFlags(flags *pflag.FlagSet) (*Config, error) { if err != nil { return nil, err } + suggest_gas, err := flags.GetInt(FlagSuggestGas) + if err != nil { + return nil, err + } + suggest_denom, err := flags.GetString(FlagSuggestDenom) + if err != nil { + return nil, err + } conf := &Config{ - Blockchain: blockchain, - Network: network, - TendermintRPC: tendermintRPC, - GRPCEndpoint: gRPCEndpoint, - Addr: addr, - Retries: retries, - Offline: offline, + Blockchain: blockchain, + Network: network, + TendermintRPC: tendermintRPC, + GRPCEndpoint: gRPCEndpoint, + Addr: addr, + Retries: retries, + Offline: offline, + SuggestGas: suggest_gas, + DefaultSuggestDenom: suggest_denom, } err = conf.validate() if err != nil { @@ -223,4 +237,6 @@ func SetFlags(flags *pflag.FlagSet) { flags.String(FlagAddr, DefaultAddr, "the address rosetta will bind to") flags.Int(FlagRetries, DefaultRetries, "the number of retries that will be done before quitting") flags.Bool(FlagOffline, DefaultOffline, "run rosetta only with construction API") + flags.Int(FlagSuggestGas, DefaultSuggestGas, "default gas for fee suggestion") + flags.String(FlagSuggestDenom, DefaultSuggestDenom, "default denom to suggest fee") } From 262ea83e0181c46a51783ba7d0d7a9239984c17c Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Wed, 1 Dec 2021 10:04:56 +0900 Subject: [PATCH 08/17] force set to success for balance operations --- server/rosetta/converter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/rosetta/converter.go b/server/rosetta/converter.go index 6782073aaff6..9c0e6a7152f6 100644 --- a/server/rosetta/converter.go +++ b/server/rosetta/converter.go @@ -297,7 +297,7 @@ func (c converter) Tx(rawTx tmtypes.Tx, txResult *abci.ResponseDeliverTx) (*rose var balanceOps []*rosettatypes.Operation // tx result might be nil, in case we're querying an unconfirmed tx from the mempool if txResult != nil { - balanceOps = c.BalanceOps(status, txResult.Events) + balanceOps = c.BalanceOps(StatusTxSuccess, txResult.Events) // force set to success because no events for failed tx } // now normalize indexes From 0e296fb5aab5a19ec8eb833af66bcb93f27da512 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Tue, 14 Dec 2021 15:41:57 +0900 Subject: [PATCH 09/17] enable offline mode --- server/rosetta/config.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/server/rosetta/config.go b/server/rosetta/config.go index 84bd894e0239..337c40b92f74 100644 --- a/server/rosetta/config.go +++ b/server/rosetta/config.go @@ -112,9 +112,6 @@ func (c *Config) validate() error { if c.Network == "" { return fmt.Errorf("network not provided") } - if c.Offline { - return fmt.Errorf("offline mode is not supported for stargate implementation due to how sigv2 works") - } if c.SuggestGas <= 0 { c.SuggestGas = DefaultSuggestGas } From 8fc4cc0dd49b7ebbb6201cd66c5f63e621e9b765 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Tue, 14 Dec 2021 15:44:12 +0900 Subject: [PATCH 10/17] Revert "rename module" This reverts commit ea433e74dacb039e01c4d4fe0dc77bbb29c91952. --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 941631bfb39c..2ba3115190d4 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ go 1.17 -module github.com/terra-money/cosmos-sdk +module github.com/cosmos/cosmos-sdk require ( github.com/99designs/keyring v1.1.6 From 503be9c5cae83aea1c8e9ffa3877b491611d26e5 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Tue, 11 Jan 2022 09:52:33 +0900 Subject: [PATCH 11/17] increase defaultNodeTimeout for rosetta for huge genesis --- server/rosetta/client_online.go | 3 ++- server/rosetta/config.go | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/server/rosetta/client_online.go b/server/rosetta/client_online.go index fdc811c3ec9d..7eeb4cfc76db 100644 --- a/server/rosetta/client_online.go +++ b/server/rosetta/client_online.go @@ -31,7 +31,8 @@ import ( // interface assertion var _ crgtypes.Client = (*Client)(nil) -const defaultNodeTimeout = 15 * time.Second +const tmWebsocketPath = "/websocket" +const defaultNodeTimeout = 60 * time.Second // Client implements a single network client to interact with cosmos based chains type Client struct { diff --git a/server/rosetta/config.go b/server/rosetta/config.go index 337c40b92f74..42fe50d579e3 100644 --- a/server/rosetta/config.go +++ b/server/rosetta/config.go @@ -176,11 +176,11 @@ func FromFlags(flags *pflag.FlagSet) (*Config, error) { if err != nil { return nil, err } - suggest_gas, err := flags.GetInt(FlagSuggestGas) + suggestGas, err := flags.GetInt(FlagSuggestGas) if err != nil { return nil, err } - suggest_denom, err := flags.GetString(FlagSuggestDenom) + suggestDenom, err := flags.GetString(FlagSuggestDenom) if err != nil { return nil, err } @@ -192,8 +192,8 @@ func FromFlags(flags *pflag.FlagSet) (*Config, error) { Addr: addr, Retries: retries, Offline: offline, - SuggestGas: suggest_gas, - DefaultSuggestDenom: suggest_denom, + SuggestGas: suggestGas, + DefaultSuggestDenom: suggestDenom, } err = conf.validate() if err != nil { From 850a03508b6a60c7b4db90811126fad37ffa4d49 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Thu, 10 Feb 2022 16:02:54 +0900 Subject: [PATCH 12/17] use DefaultGasLimit as DefaultSuggestGas --- server/rosetta/config.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/server/rosetta/config.go b/server/rosetta/config.go index 42fe50d579e3..4c4b24af499d 100644 --- a/server/rosetta/config.go +++ b/server/rosetta/config.go @@ -6,6 +6,7 @@ import ( "time" "github.com/coinbase/rosetta-sdk-go/types" + clientflags "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/pflag" crg "github.com/cosmos/cosmos-sdk/server/rosetta/lib/server" @@ -31,8 +32,6 @@ const ( DefaultNetwork = "network" // DefaultOffline defines the default offline value DefaultOffline = false - // DefaultSuggestGas defines the default gas limit for fee suggestion - DefaultSuggestGas = 200_000 // DefaultSuggestDenom defines the default denom for fee suggestion DefaultSuggestDenom = "uatom" ) @@ -113,7 +112,7 @@ func (c *Config) validate() error { return fmt.Errorf("network not provided") } if c.SuggestGas <= 0 { - c.SuggestGas = DefaultSuggestGas + c.SuggestGas = clientflags.DefaultGasLimit } found := false for i := 0; i < c.SuggestPrices.Len(); i++ { @@ -234,6 +233,6 @@ func SetFlags(flags *pflag.FlagSet) { flags.String(FlagAddr, DefaultAddr, "the address rosetta will bind to") flags.Int(FlagRetries, DefaultRetries, "the number of retries that will be done before quitting") flags.Bool(FlagOffline, DefaultOffline, "run rosetta only with construction API") - flags.Int(FlagSuggestGas, DefaultSuggestGas, "default gas for fee suggestion") + flags.Int(FlagSuggestGas, clientflags.DefaultGasLimit, "default gas for fee suggestion") flags.String(FlagSuggestDenom, DefaultSuggestDenom, "default denom to suggest fee") } From 3545ea05ceeae4f0e9bb2f069dfcd89d4cb446b0 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Tue, 11 Jan 2022 09:52:33 +0900 Subject: [PATCH 13/17] use default gas limit as default gas suggest for rosetta --- server/config/config.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/config/config.go b/server/config/config.go index 3ce2a78a2c98..c5acfbb79183 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/viper" + clientflags "github.com/cosmos/cosmos-sdk/client/flags" storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" @@ -242,7 +243,7 @@ func DefaultConfig() *Config { Network: "network", Retries: 3, Offline: false, - SuggestGas: 200000, + SuggestGas: clientflags.DefaultGasLimit, DefaultSuggestDenom: "uatom", }, GRPCWeb: GRPCWebConfig{ From 4e76726c3ba03d253dd34492b6db8f5b42f0051e Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Thu, 10 Feb 2022 16:38:46 +0900 Subject: [PATCH 14/17] add enable-default-fee-suggest for rosetta --- server/rosetta/client_online.go | 20 +++++++------- server/rosetta/config.go | 47 ++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/server/rosetta/client_online.go b/server/rosetta/client_online.go index 7eeb4cfc76db..b68abcae1a46 100644 --- a/server/rosetta/client_online.go +++ b/server/rosetta/client_online.go @@ -31,7 +31,6 @@ import ( // interface assertion var _ crgtypes.Client = (*Client)(nil) -const tmWebsocketPath = "/websocket" const defaultNodeTimeout = 60 * time.Second // Client implements a single network client to interact with cosmos based chains @@ -396,15 +395,18 @@ func (c *Client) ConstructionMetadataFromOptions(ctx context.Context, options ma return nil, err } - if constructionOptions.GasLimit <= 0 { - // set to default - constructionOptions.GasLimit = uint64(c.config.SuggestGas) + // if default fess suggestion is enabled and gas limit or price is unset, use default + if c.config.EnableDefaultFeeSuggest { + if constructionOptions.GasLimit <= 0 { + constructionOptions.GasLimit = uint64(c.config.SuggestGas) + } + if constructionOptions.GasPrice == "" { + denom := c.config.DefaultSuggestDenom + constructionOptions.GasPrice = c.config.SuggestPrices.AmountOf(denom).String() + denom + } } - if constructionOptions.GasPrice == "" { - // set to default - denom := c.config.DefaultSuggestDenom - constructionOptions.GasPrice = c.config.SuggestPrices.AmountOf(denom).String() + denom - } else { + + if constructionOptions.GasLimit > 0 && constructionOptions.GasPrice != "" { gasPrice, err := sdk.ParseDecCoin(constructionOptions.GasPrice) if err != nil { return nil, err diff --git a/server/rosetta/config.go b/server/rosetta/config.go index 4c4b24af499d..79803a287a0f 100644 --- a/server/rosetta/config.go +++ b/server/rosetta/config.go @@ -32,21 +32,24 @@ const ( DefaultNetwork = "network" // DefaultOffline defines the default offline value DefaultOffline = false + // DefaultEnableDefaultFeeSuggest indicates to use fee suggestion + DefaultEnableDefaultFeeSuggest = false // DefaultSuggestDenom defines the default denom for fee suggestion DefaultSuggestDenom = "uatom" ) // configuration flags const ( - FlagBlockchain = "blockchain" - FlagNetwork = "network" - FlagTendermintEndpoint = "tendermint" - FlagGRPCEndpoint = "grpc" - FlagAddr = "addr" - FlagRetries = "retries" - FlagOffline = "offline" - FlagSuggestGas = "suggest-gas" - FlagSuggestDenom = "suggest-denom" + FlagBlockchain = "blockchain" + FlagNetwork = "network" + FlagTendermintEndpoint = "tendermint" + FlagGRPCEndpoint = "grpc" + FlagAddr = "addr" + FlagRetries = "retries" + FlagOffline = "offline" + FlagEnableDefaultFeeSuggest = "enable-default-fee-suggest" + FlagSuggestGas = "suggest-gas" + FlagSuggestDenom = "suggest-denom" ) // Config defines the configuration of the rosetta server @@ -71,6 +74,8 @@ type Config struct { Retries int // Offline defines if the server must be run in offline mode Offline bool + // EnableDefaultFeeSuggest indicates to use fee suggestion + EnableDefaultFeeSuggest bool // SuggestGas defines the gas limit for fee suggestion SuggestGas int // DefaultSuggestDenom defines the default denom for fee suggestion @@ -175,6 +180,10 @@ func FromFlags(flags *pflag.FlagSet) (*Config, error) { if err != nil { return nil, err } + enableDefaultFeeSuggest, err := flags.GetBool(FlagEnableDefaultFeeSuggest) + if err != nil { + return nil, err + } suggestGas, err := flags.GetInt(FlagSuggestGas) if err != nil { return nil, err @@ -184,15 +193,16 @@ func FromFlags(flags *pflag.FlagSet) (*Config, error) { return nil, err } conf := &Config{ - Blockchain: blockchain, - Network: network, - TendermintRPC: tendermintRPC, - GRPCEndpoint: gRPCEndpoint, - Addr: addr, - Retries: retries, - Offline: offline, - SuggestGas: suggestGas, - DefaultSuggestDenom: suggestDenom, + Blockchain: blockchain, + Network: network, + TendermintRPC: tendermintRPC, + GRPCEndpoint: gRPCEndpoint, + Addr: addr, + Retries: retries, + Offline: offline, + EnableDefaultFeeSuggest: enableDefaultFeeSuggest, + SuggestGas: suggestGas, + DefaultSuggestDenom: suggestDenom, } err = conf.validate() if err != nil { @@ -233,6 +243,7 @@ func SetFlags(flags *pflag.FlagSet) { flags.String(FlagAddr, DefaultAddr, "the address rosetta will bind to") flags.Int(FlagRetries, DefaultRetries, "the number of retries that will be done before quitting") flags.Bool(FlagOffline, DefaultOffline, "run rosetta only with construction API") + flags.Bool(FlagEnableDefaultFeeSuggest, DefaultEnableDefaultFeeSuggest, "enable fee suggestion") flags.Int(FlagSuggestGas, clientflags.DefaultGasLimit, "default gas for fee suggestion") flags.String(FlagSuggestDenom, DefaultSuggestDenom, "default denom to suggest fee") } From 642a1cc500184f3e4fa03729967debaf3df008a5 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Thu, 10 Feb 2022 17:30:32 +0900 Subject: [PATCH 15/17] update config template --- server/config/config.go | 36 ++++++++++++++++++++---------------- server/config/toml.go | 3 +++ 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/server/config/config.go b/server/config/config.go index c5acfbb79183..7c661fa08e41 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -127,6 +127,8 @@ type RosettaConfig struct { // Offline defines if the server must be run in offline mode Offline bool `mapstructure:"offline"` + EnableDefaultFeeSuggest bool `mapstructure:"enable-default-fee-suggest"` + // SuggestGas defines gas limit when calculate fee SuggestGas int `mapstructure:"suggest-gas"` @@ -237,14 +239,15 @@ func DefaultConfig() *Config { Address: DefaultGRPCAddress, }, Rosetta: RosettaConfig{ - Enable: false, - Address: ":8080", - Blockchain: "app", - Network: "network", - Retries: 3, - Offline: false, - SuggestGas: clientflags.DefaultGasLimit, - DefaultSuggestDenom: "uatom", + Enable: false, + Address: ":8080", + Blockchain: "app", + Network: "network", + Retries: 3, + Offline: false, + EnableDefaultFeeSuggest: false, + SuggestGas: clientflags.DefaultGasLimit, + DefaultSuggestDenom: "uatom", }, GRPCWeb: GRPCWebConfig{ Enable: true, @@ -302,14 +305,15 @@ func GetConfig(v *viper.Viper) Config { EnableUnsafeCORS: v.GetBool("api.enabled-unsafe-cors"), }, Rosetta: RosettaConfig{ - Enable: v.GetBool("rosetta.enable"), - Address: v.GetString("rosetta.address"), - Blockchain: v.GetString("rosetta.blockchain"), - Network: v.GetString("rosetta.network"), - Retries: v.GetInt("rosetta.retries"), - Offline: v.GetBool("rosetta.offline"), - SuggestGas: v.GetInt("rosetta.suggest-gas"), - DefaultSuggestDenom: v.GetString("rosetta.default-suggest-denom"), + Enable: v.GetBool("rosetta.enable"), + Address: v.GetString("rosetta.address"), + Blockchain: v.GetString("rosetta.blockchain"), + Network: v.GetString("rosetta.network"), + Retries: v.GetInt("rosetta.retries"), + Offline: v.GetBool("rosetta.offline"), + EnableDefaultFeeSuggest: v.GetBool("rosetta.enable-default-fee-suggest"), + SuggestGas: v.GetInt("rosetta.suggest-gas"), + DefaultSuggestDenom: v.GetString("rosetta.default-suggest-denom"), }, GRPC: GRPCConfig{ Enable: v.GetBool("grpc.enable"), diff --git a/server/config/toml.go b/server/config/toml.go index 3c0a8dc44f25..877a7c3272be 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -165,6 +165,9 @@ retries = {{ .Rosetta.Retries }} # Offline defines if Rosetta server should run in offline mode. offline = {{ .Rosetta.Offline }} +# EnableDefaultFeeSuggest indicates to use default fee suggestion +enable-default-fee-suggest = {{ .Rosetta.EnableDefaultFeeSuggest }} + # SuggestGas defines gas limit when calculate fee suggest-gas = {{ .Rosetta.SuggestGas }} From 822d3907e08ae6db9e38b6033feb118206532672 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Thu, 10 Feb 2022 18:34:13 +0900 Subject: [PATCH 16/17] prevent bad gateway due to huge genesis --- server/rosetta/client_online.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/server/rosetta/client_online.go b/server/rosetta/client_online.go index b68abcae1a46..ab1eb3b30942 100644 --- a/server/rosetta/client_online.go +++ b/server/rosetta/client_online.go @@ -121,6 +121,14 @@ func (c *Client) Ready() error { if err != nil { return err } + + // to prevent timeout of reading genesis block + var height int64 = -1 + _, err = c.BlockByHeight(ctx, &height) + if err != nil { + return err + } + _, err = c.bank.TotalSupply(ctx, &bank.QueryTotalSupplyRequest{}) if err != nil { return err From be3f786710285a7857ded446533540e4575a3184 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Tue, 12 Apr 2022 10:20:25 +0900 Subject: [PATCH 17/17] Apply suggestions from code review Co-authored-by: Aleksandr Bezobchuk Co-authored-by: Anil Kumar Kammari --- server/config/config.go | 4 ++-- server/rosetta/client_online.go | 4 ++-- server/rosetta/lib/internal/service/construction.go | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/server/config/config.go b/server/config/config.go index f48e1760f30d..dc2ce1f22a6e 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -133,10 +133,10 @@ type RosettaConfig struct { // Offline defines if the server must be run in offline mode Offline bool `mapstructure:"offline"` - EnableDefaultFeeSuggest bool `mapstructure:"enable-default-fee-suggest"` + EnableDefaultSuggestedFee bool `mapstructure:"enable-default-suggested-fee"` // SuggestGas defines gas limit when calculate fee - SuggestGas int `mapstructure:"suggest-gas"` + SuggestedGasLimit int `mapstructure:"suggested-gas-limit"` // DefaultSuggestDenom defines the defult denom for fee suggestion DefaultSuggestDenom string `mapstructure:"default-suggest-denom"` diff --git a/server/rosetta/client_online.go b/server/rosetta/client_online.go index ab1eb3b30942..41ea81f60c6f 100644 --- a/server/rosetta/client_online.go +++ b/server/rosetta/client_online.go @@ -31,7 +31,7 @@ import ( // interface assertion var _ crgtypes.Client = (*Client)(nil) -const defaultNodeTimeout = 60 * time.Second +const defaultNodeTimeout = time.Minute // Client implements a single network client to interact with cosmos based chains type Client struct { @@ -403,7 +403,7 @@ func (c *Client) ConstructionMetadataFromOptions(ctx context.Context, options ma return nil, err } - // if default fess suggestion is enabled and gas limit or price is unset, use default + // if default fees suggestion is enabled and gas limit or price is unset, use default if c.config.EnableDefaultFeeSuggest { if constructionOptions.GasLimit <= 0 { constructionOptions.GasLimit = uint64(c.config.SuggestGas) diff --git a/server/rosetta/lib/internal/service/construction.go b/server/rosetta/lib/internal/service/construction.go index 113fdd04b06a..628914c288c7 100644 --- a/server/rosetta/lib/internal/service/construction.go +++ b/server/rosetta/lib/internal/service/construction.go @@ -77,12 +77,11 @@ func (on OnlineNetwork) ConstructionMetadata(ctx context.Context, request *types gas := sdk.NewIntFromUint64(uint64(metadata["gas_limit"].(float64))) suggestedFee := types.Amount{ - Value: price.Amount.MulInt64(gas.Int64()).String(), + Value: price.Amount.Mul(gas).String(), Currency: &(types.Currency{ Symbol: price.Denom, Decimals: 0, }), - /*metadata*/ } return &types.ConstructionMetadataResponse{