From 6d7ddeb4bb08fc4c523c79d12be176f600664ec7 Mon Sep 17 00:00:00 2001 From: Brandon Weng <18161326+BrandonWeng@users.noreply.github.com> Date: Fri, 14 Apr 2023 10:08:56 -0400 Subject: [PATCH 1/3] Works locally --- baseapp/baseapp.go | 7 ++++ go.mod | 4 +-- go.sum | 2 -- server/api/server.go | 10 ++---- server/start.go | 73 ++++++++++++++++++++++++++++++---------- server/types/app.go | 3 ++ server/util.go | 5 ++- snapshots/manager.go | 4 +++ testutil/network/util.go | 4 ++- 9 files changed, 80 insertions(+), 32 deletions(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index e0e7376b1..a3cb392bb 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -1092,3 +1092,10 @@ func (app *BaseApp) startCompactionRoutine(db dbm.DB) { } }() } + +func (app *BaseApp) Close() error { + if err := app.appStore.db.Close(); err != nil { + return err + } + return app.snapshotManager.Close() +} diff --git a/go.mod b/go.mod index 6b3396397..5c4d9c0c4 100644 --- a/go.mod +++ b/go.mod @@ -41,6 +41,7 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.12.0 github.com/stretchr/testify v1.8.1 + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/tendermint/btcd v0.1.1 github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 github.com/tendermint/go-amino v0.16.0 @@ -119,7 +120,6 @@ require ( github.com/spf13/afero v1.8.2 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.0 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/zondax/hid v0.9.0 // indirect go.etcd.io/bbolt v1.3.6 // indirect go.opencensus.io v0.23.0 // indirect @@ -145,7 +145,7 @@ replace ( github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.1.181 + github.com/tendermint/tendermint => ../sei-tendermint //github.com/sei-protocol/sei-tendermint v0.1.181 // latest grpc doesn't work with with our modified proto compiler, so we need to enforce // the following version across all dependencies. diff --git a/go.sum b/go.sum index f4464bcae..b465cda85 100644 --- a/go.sum +++ b/go.sum @@ -689,8 +689,6 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/sei-protocol/sei-iavl v0.1.2 h1:jEYkZv83DbTRapJtkT5gBFa2uEBwD4udw8AiYx0gcsI= github.com/sei-protocol/sei-iavl v0.1.2/go.mod h1:7PfkEVT5dcoQE+s/9KWdoXJ8VVVP1QpYYPLdxlkSXFk= -github.com/sei-protocol/sei-tendermint v0.1.181 h1:ycC21MKAorOGFhdzN5HjZlA0qtIAX4iMlXTSErTLqtM= -github.com/sei-protocol/sei-tendermint v0.1.181/go.mod h1:+BtDvAwTkE64BlxzpH9ZP7S6vUYT9wRXiZa/WW8/o4g= github.com/sei-protocol/sei-tm-db v0.0.5 h1:3WONKdSXEqdZZeLuWYfK5hP37TJpfaUa13vAyAlvaQY= github.com/sei-protocol/sei-tm-db v0.0.5/go.mod h1:Cpa6rGyczgthq7/0pI31jys2Fw0Nfrc+/jKdP1prVqY= github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= diff --git a/server/api/server.go b/server/api/server.go index 661da225e..420bde3d8 100644 --- a/server/api/server.go +++ b/server/api/server.go @@ -89,16 +89,10 @@ func New(clientCtx client.Context, logger log.Logger) *Server { // JSON RPC server. Configuration options are provided via config.APIConfig // and are delegated to the Tendermint JSON RPC server. The process is // non-blocking, so an external signal handler must be used. -func (s *Server) Start(cfg config.Config) error { +func (s *Server) Start(cfg config.Config, apiMetrics *telemetry.Metrics) error { s.mtx.Lock() if cfg.Telemetry.Enabled { - m, err := telemetry.New(cfg.Telemetry) - if err != nil { - s.mtx.Unlock() - return err - } - - s.metrics = m + s.metrics = apiMetrics s.registerMetrics() } diff --git a/server/start.go b/server/start.go index 67a4e2984..4197b181f 100644 --- a/server/start.go +++ b/server/start.go @@ -36,6 +36,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" + "github.com/cosmos/cosmos-sdk/telemetry" ) const ( @@ -179,13 +180,36 @@ is performed. Note, when enabled, gRPC will also be automatically enabled. } // amino is needed here for backwards compatibility of REST routes - err = startInProcess(serverCtx, clientCtx, appCreator, tracerProviderOptions) - errCode, ok := err.(ErrorCode) - if !ok { - return err - } + exitCode := RestartErrorCode - serverCtx.Logger.Debug(fmt.Sprintf("received quit signal: %d", errCode.Code)) + serverCtx.Logger.Info("Creating node metrics provider") + nodeMetricsProvider := node.DefaultMetricsProvider(serverCtx.Config.Instrumentation)(clientCtx.ChainID) + + config, _ := config.GetConfig(serverCtx.Viper) + apiMetrics, err := telemetry.New(config.Telemetry) + if err != nil { + return fmt.Errorf("failed to initialize telemetry: %w", err) + } + for { + err = startInProcess( + serverCtx, + clientCtx, + appCreator, + tracerProviderOptions, + nodeMetricsProvider, + apiMetrics, + ) + errCode, ok := err.(ErrorCode) + exitCode = errCode.Code + if !ok { + return err + } + if exitCode != RestartErrorCode { + break + } + serverCtx.Logger.Info("Restarting node...") + } + serverCtx.Logger.Debug(fmt.Sprintf("received quit signal: %d", exitCode)) return nil }, } @@ -271,14 +295,20 @@ func startStandAlone(ctx *Context, appCreator types.AppCreator) error { }() var restartCh chan struct{} - if ctx.Config.P2P.SelfKillNoPeers { - restartCh = make(chan struct{}) - } + restartCh = make(chan struct{}) + // Wait for SIGINT or SIGTERM signal return WaitForQuitSignals(restartCh) } -func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.AppCreator, tracerProviderOptions []trace.TracerProviderOption) error { +func startInProcess( + ctx *Context, + clientCtx client.Context, + appCreator types.AppCreator, + tracerProviderOptions []trace.TracerProviderOption, + nodeMetricsProvider *node.NodeMetrics, + apiMetrics *telemetry.Metrics, +) error { cfg := ctx.Config home := cfg.RootDir goCtx, cancel := context.WithCancel(context.Background()) @@ -330,9 +360,8 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App restartCh chan struct{} gRPCOnly = ctx.Viper.GetBool(flagGRPCOnly) ) - if ctx.Config.P2P.SelfKillNoPeers { - restartCh = make(chan struct{}) - } + + restartCh = make(chan struct{}) if gRPCOnly { ctx.Logger.Info("starting node in gRPC only mode; Tendermint is disabled") @@ -347,15 +376,19 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App abciclient.NewLocalClient(ctx.Logger, app), nil, tracerProviderOptions, + nodeMetricsProvider, ) + ctx.Logger.Info("really going to start new node") if err != nil { - return err + return fmt.Errorf("error creating node: %w", err) } if err := tmNode.Start(goCtx); err != nil { - return err + return fmt.Errorf("error starting node: %w", err) } + ctx.Logger.Info("started ABCI Tendermint") } + ctx.Logger.Info("starting GPRC") // Add the tx service to the gRPC router. We only need to register this // service if API or gRPC is enabled, and avoid doing so in the general // case, because it spawns a new local tendermint RPC client. @@ -370,6 +403,7 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App app.RegisterTendermintService(clientCtx) } + ctx.Logger.Info("starting API") var apiSrv *api.Server if config.API.Enable { clientCtx := clientCtx.WithHomeDir(home).WithChainID(clientCtx.ChainID) @@ -378,14 +412,14 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App errCh := make(chan error) go func() { - if err := apiSrv.Start(config); err != nil { + if err := apiSrv.Start(config, apiMetrics); err != nil { errCh <- err } }() select { case err := <-errCh: - return err + return fmt.Errorf("error starting api server: %w", err) case <-time.After(types.ServerStartTime): // assume server started successfully } @@ -481,7 +515,10 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App } } - ctx.Logger.Info("exiting...") + ctx.Logger.Info("close any other open resource...") + if err := app.Close(); err != nil { + ctx.Logger.Error("error closing database", "err", err) + } }() // wait for signal capture and gracefully return diff --git a/server/types/app.go b/server/types/app.go index cfdf5a458..210d5ff4b 100644 --- a/server/types/app.go +++ b/server/types/app.go @@ -56,6 +56,9 @@ type ( // CommitMultiStore Returns the multistore instance CommitMultiStore() sdk.CommitMultiStore + + // Close any open resources + Close() error } // AppCreator is a function that allows us to lazily initialize an diff --git a/server/util.go b/server/util.go index dd1ef51af..046435426 100644 --- a/server/util.go +++ b/server/util.go @@ -39,6 +39,9 @@ import ( // a command's Context. const ServerContextKey = sdk.ContextKey("server.context") +// Error code reserved for signalled +const RestartErrorCode = 100 + // server context type Context struct { Viper *viper.Viper @@ -391,7 +394,7 @@ func WaitForQuitSignals(restartCh chan struct{}) ErrorCode { case sig := <-sigs: return ErrorCode{Code: int(sig.(syscall.Signal)) + 128} case <-restartCh: - return ErrorCode{Code: 1} + return ErrorCode{Code: RestartErrorCode} } } } else { diff --git a/snapshots/manager.go b/snapshots/manager.go index 02878963d..082f90e64 100644 --- a/snapshots/manager.go +++ b/snapshots/manager.go @@ -78,6 +78,10 @@ func NewManagerWithExtensions(store *Store, multistore types.Snapshotter, extens } } +func (m *Manager) Close() error { + return m.store.db.Close() +} + // RegisterExtensions register extension snapshotters to manager func (m *Manager) RegisterExtensions(extensions ...types.ExtensionSnapshotter) error { for _, extension := range extensions { diff --git a/testutil/network/util.go b/testutil/network/util.go index c8646547c..e259ce39e 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/codec" tmtime "github.com/cosmos/cosmos-sdk/std" + "github.com/cosmos/cosmos-sdk/telemetry" abciclient "github.com/tendermint/tendermint/abci/client" tmos "github.com/tendermint/tendermint/libs/os" "github.com/tendermint/tendermint/node" @@ -59,6 +60,7 @@ func startInProcess(cfg Config, val *Validator) error { abciclient.NewLocalClient(logger, app), defaultGensis, []trace.TracerProviderOption{}, + node.NoOpMetricsProvider(), ) if err != nil { @@ -95,7 +97,7 @@ func startInProcess(cfg Config, val *Validator) error { errCh := make(chan error) go func() { - if err := apiSrv.Start(*val.AppConfig); err != nil { + if err := apiSrv.Start(*val.AppConfig, &telemetry.Metrics{}); err != nil { errCh <- err } }() From 8306b09fb4aac80748ae592765fcb68fe1c6fc06 Mon Sep 17 00:00:00 2001 From: Brandon Weng <18161326+BrandonWeng@users.noreply.github.com> Date: Fri, 14 Apr 2023 10:30:34 -0400 Subject: [PATCH 2/3] logs --- go.mod | 2 +- go.sum | 2 ++ server/start.go | 28 ++++++++-------- server/util.go | 6 +++- server/util_test.go | 78 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 5c4d9c0c4..b91e455e7 100644 --- a/go.mod +++ b/go.mod @@ -145,7 +145,7 @@ replace ( github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/tendermint/tendermint => ../sei-tendermint //github.com/sei-protocol/sei-tendermint v0.1.181 + github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.2.6 // latest grpc doesn't work with with our modified proto compiler, so we need to enforce // the following version across all dependencies. diff --git a/go.sum b/go.sum index b465cda85..4fe664966 100644 --- a/go.sum +++ b/go.sum @@ -689,6 +689,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/sei-protocol/sei-iavl v0.1.2 h1:jEYkZv83DbTRapJtkT5gBFa2uEBwD4udw8AiYx0gcsI= github.com/sei-protocol/sei-iavl v0.1.2/go.mod h1:7PfkEVT5dcoQE+s/9KWdoXJ8VVVP1QpYYPLdxlkSXFk= +github.com/sei-protocol/sei-tendermint v0.2.6 h1:1jY2Hjx48OFRKeu/Ae9PGk/cZpWjfEVXlPai56jxAV4= +github.com/sei-protocol/sei-tendermint v0.2.6/go.mod h1:+BtDvAwTkE64BlxzpH9ZP7S6vUYT9wRXiZa/WW8/o4g= github.com/sei-protocol/sei-tm-db v0.0.5 h1:3WONKdSXEqdZZeLuWYfK5hP37TJpfaUa13vAyAlvaQY= github.com/sei-protocol/sei-tm-db v0.0.5/go.mod h1:Cpa6rGyczgthq7/0pI31jys2Fw0Nfrc+/jKdP1prVqY= github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= diff --git a/server/start.go b/server/start.go index 4197b181f..d80e037ff 100644 --- a/server/start.go +++ b/server/start.go @@ -190,6 +190,10 @@ is performed. Note, when enabled, gRPC will also be automatically enabled. if err != nil { return fmt.Errorf("failed to initialize telemetry: %w", err) } + + restartCoolDownDuration := time.Second * time.Duration(serverCtx.Config.SelfRemediation.RestartCooldownSeconds) + // Set the first restart time to be now - restartCoolDownDuration so that the first restart can trigger whenever + canRestartAfter := time.Now().Add(-restartCoolDownDuration) for { err = startInProcess( serverCtx, @@ -198,6 +202,7 @@ is performed. Note, when enabled, gRPC will also be automatically enabled. tracerProviderOptions, nodeMetricsProvider, apiMetrics, + canRestartAfter, ) errCode, ok := err.(ErrorCode) exitCode = errCode.Code @@ -207,9 +212,9 @@ is performed. Note, when enabled, gRPC will also be automatically enabled. if exitCode != RestartErrorCode { break } - serverCtx.Logger.Info("Restarting node...") + serverCtx.Logger.Info("restarting node...") + canRestartAfter = time.Now().Add(restartCoolDownDuration) } - serverCtx.Logger.Debug(fmt.Sprintf("received quit signal: %d", exitCode)) return nil }, } @@ -294,11 +299,10 @@ func startStandAlone(ctx *Context, appCreator types.AppCreator) error { svr.Wait() }() - var restartCh chan struct{} - restartCh = make(chan struct{}) + restartCh := make(chan struct{}) // Wait for SIGINT or SIGTERM signal - return WaitForQuitSignals(restartCh) + return WaitForQuitSignals(restartCh, time.Now()) } func startInProcess( @@ -308,6 +312,7 @@ func startInProcess( tracerProviderOptions []trace.TracerProviderOption, nodeMetricsProvider *node.NodeMetrics, apiMetrics *telemetry.Metrics, + canRestartAfter time.Time, ) error { cfg := ctx.Config home := cfg.RootDir @@ -317,12 +322,11 @@ func startInProcess( if cpuProfile := ctx.Viper.GetString(flagCPUProfile); cpuProfile != "" { f, err := os.Create(cpuProfile) if err != nil { - return err + return fmt.Errorf("failed to create cpuProfile file %w", err) } - ctx.Logger.Info("starting CPU profiler", "profile", cpuProfile) if err := pprof.StartCPUProfile(f); err != nil { - return err + return fmt.Errorf("failed to start CPU Profiler %w", err) } cpuProfileCleanup = func() { @@ -378,17 +382,14 @@ func startInProcess( tracerProviderOptions, nodeMetricsProvider, ) - ctx.Logger.Info("really going to start new node") if err != nil { return fmt.Errorf("error creating node: %w", err) } if err := tmNode.Start(goCtx); err != nil { return fmt.Errorf("error starting node: %w", err) } - ctx.Logger.Info("started ABCI Tendermint") } - ctx.Logger.Info("starting GPRC") // Add the tx service to the gRPC router. We only need to register this // service if API or gRPC is enabled, and avoid doing so in the general // case, because it spawns a new local tendermint RPC client. @@ -403,7 +404,6 @@ func startInProcess( app.RegisterTendermintService(clientCtx) } - ctx.Logger.Info("starting API") var apiSrv *api.Server if config.API.Enable { clientCtx := clientCtx.WithHomeDir(home).WithChainID(clientCtx.ChainID) @@ -449,7 +449,7 @@ func startInProcess( // we do not need to start Rosetta or handle any Tendermint related processes. if gRPCOnly { // wait for signal capture and gracefully return - return WaitForQuitSignals(restartCh) + return WaitForQuitSignals(restartCh, canRestartAfter) } var rosettaSrv crgserver.Server @@ -522,5 +522,5 @@ func startInProcess( }() // wait for signal capture and gracefully return - return WaitForQuitSignals(restartCh) + return WaitForQuitSignals(restartCh, canRestartAfter) } diff --git a/server/util.go b/server/util.go index 046435426..c6929fd37 100644 --- a/server/util.go +++ b/server/util.go @@ -385,7 +385,7 @@ func TrapSignal(cleanupFunc func()) { } // WaitForQuitSignals waits for SIGINT and SIGTERM and returns. -func WaitForQuitSignals(restartCh chan struct{}) ErrorCode { +func WaitForQuitSignals(restartCh chan struct{}, canRestartAfter time.Time) ErrorCode { sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) if restartCh != nil { @@ -394,6 +394,10 @@ func WaitForQuitSignals(restartCh chan struct{}) ErrorCode { case sig := <-sigs: return ErrorCode{Code: int(sig.(syscall.Signal)) + 128} case <-restartCh: + // If it's in the restart cooldown period + if time.Now().Before(canRestartAfter) { + continue + } return ErrorCode{Code: RestartErrorCode} } } diff --git a/server/util_test.go b/server/util_test.go index e9503e9a1..82d0bfb87 100644 --- a/server/util_test.go +++ b/server/util_test.go @@ -5,10 +5,13 @@ import ( "errors" "fmt" "os" + "os/signal" "path" "path/filepath" "strings" + "syscall" "testing" + "time" "github.com/spf13/cobra" "go.opentelemetry.io/otel/sdk/trace" @@ -401,3 +404,78 @@ func TestInterceptConfigsWithBadPermissions(t *testing.T) { t.Fatalf("Failed to catch permissions error, got: [%T] %v", err, err) } } + +func TestWaitForQuitSignals(t *testing.T) { + t.Run("WithRestartChannelAndCanRestartAfterNotReached", func(t *testing.T) { + restartCh := make(chan struct{}) + go func() { + time.Sleep(100 * time.Millisecond) + restartCh <- struct{}{} + }() + + go func() { + time.Sleep(200 * time.Millisecond) + syscall.Kill(syscall.Getpid(), syscall.SIGTERM) + }() + + errCode := server.WaitForQuitSignals( + restartCh, + time.Now().Add(500*time.Millisecond), + ) + expectedCode := int(syscall.SIGTERM) + 128 + if errCode.Code != expectedCode { + t.Errorf("Expected error code %d, got %d", expectedCode, errCode.Code) + } + }) + + t.Run("WithRestartChannelAndCanRestartAfterReached", func(t *testing.T) { + restartCh := make(chan struct{}) + go func() { + time.Sleep(100 * time.Millisecond) + restartCh <- struct{}{} + }() + + errCode := server.WaitForQuitSignals( + restartCh, + time.Now().Add(-100*time.Millisecond), + ) + if errCode.Code != server.RestartErrorCode { + t.Errorf("Expected error code %d, got %d", server.RestartErrorCode, errCode.Code) + } + }) + + t.Run("WithSIGINT", func(t *testing.T) { + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGINT) + + go func() { + time.Sleep(100 * time.Millisecond) + syscall.Kill(syscall.Getpid(), syscall.SIGINT) + }() + + errCode := server.WaitForQuitSignals( + make(chan struct{}), + time.Now(), + ) + expectedCode := int(syscall.SIGINT) + 128 + if errCode.Code != expectedCode { + t.Errorf("Expected error code %d, got %d", expectedCode, errCode.Code) + } + }) + + t.Run("WithSIGTERM", func(t *testing.T) { + go func() { + time.Sleep(100 * time.Millisecond) + syscall.Kill(syscall.Getpid(), syscall.SIGTERM) + }() + + errCode := server.WaitForQuitSignals( + make(chan struct{}), + time.Now(), + ) + expectedCode := int(syscall.SIGTERM) + 128 + if errCode.Code != expectedCode { + t.Errorf("Expected error code %d, got %d", expectedCode, errCode.Code) + } + }) +} From 826fefed6f51d09ad65ba49a242bd2fe1728cc28 Mon Sep 17 00:00:00 2001 From: Brandon Weng <18161326+BrandonWeng@users.noreply.github.com> Date: Wed, 19 Apr 2023 15:08:21 -0400 Subject: [PATCH 3/3] dobne --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b91e455e7..bc9cb9d3f 100644 --- a/go.mod +++ b/go.mod @@ -145,7 +145,7 @@ replace ( github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.2.6 + github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.2.7 // latest grpc doesn't work with with our modified proto compiler, so we need to enforce // the following version across all dependencies. diff --git a/go.sum b/go.sum index 4fe664966..b8cf27d80 100644 --- a/go.sum +++ b/go.sum @@ -689,8 +689,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/sei-protocol/sei-iavl v0.1.2 h1:jEYkZv83DbTRapJtkT5gBFa2uEBwD4udw8AiYx0gcsI= github.com/sei-protocol/sei-iavl v0.1.2/go.mod h1:7PfkEVT5dcoQE+s/9KWdoXJ8VVVP1QpYYPLdxlkSXFk= -github.com/sei-protocol/sei-tendermint v0.2.6 h1:1jY2Hjx48OFRKeu/Ae9PGk/cZpWjfEVXlPai56jxAV4= -github.com/sei-protocol/sei-tendermint v0.2.6/go.mod h1:+BtDvAwTkE64BlxzpH9ZP7S6vUYT9wRXiZa/WW8/o4g= +github.com/sei-protocol/sei-tendermint v0.2.7 h1:uVweGrk1pa3Dla/i6fv/mJY0rGd18tgK+q4dxT6LxzM= +github.com/sei-protocol/sei-tendermint v0.2.7/go.mod h1:+BtDvAwTkE64BlxzpH9ZP7S6vUYT9wRXiZa/WW8/o4g= github.com/sei-protocol/sei-tm-db v0.0.5 h1:3WONKdSXEqdZZeLuWYfK5hP37TJpfaUa13vAyAlvaQY= github.com/sei-protocol/sei-tm-db v0.0.5/go.mod h1:Cpa6rGyczgthq7/0pI31jys2Fw0Nfrc+/jKdP1prVqY= github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=